防SQL注入的最好实现方式是什么?
咨詢區
LeonidasFett:
我的問題是:如何在 C# 中是使用SQL防注入,我的模糊理解是可以通過限定應用程序接收的字段格式來實現最終目的,比如說:email字段只能接收email的格式,name字段不能輸入特殊字符,以此類推,C#中應該也有對應的預定義方法。
這里想問大家有什么其他的思考。
回答區
Oliver
理論上你的做法是相對高效的,但是落地非常繁瑣,其實你完全可以使用 SqlCommand 和 SqlParameters[] 實現SQL的參數化查詢,它是一種非常通用的解決方案,無需特定字段使用特定格式的方式,參考如下代碼:
private?static?void?UpdateDemographics(Int32?customerID,string?demoXml,?string?connectionString) {//?Update?the?demographics?for?a?store,?which?is?stored??//?in?an?xml?column.??string?commandText?=?"UPDATE?Sales.Store?SET?Demographics?=?@demographics?"+?"WHERE?CustomerID?=?@ID;";using?(SqlConnection?connection?=?new?SqlConnection(connectionString)){SqlCommand?command?=?new?SqlCommand(commandText,?connection);command.Parameters.Add("@ID",?SqlDbType.Int);command.Parameters["@ID"].Value?=?customerID;//?Use?AddWithValue?to?assign?Demographics.?//?SQL?Server?will?implicitly?convert?strings?into?XML.command.Parameters.AddWithValue("@demographics",?demoXml);try{connection.Open();Int32?rowsAffected?=?command.ExecuteNonQuery();Console.WriteLine("RowsAffected:?{0}",?rowsAffected);}catch?(Exception?ex){Console.WriteLine(ex.Message);}} }nerdybeardo
SQL 注入是一種很搞的問題,但還是有幾種解決辦法,要想減少風險,可以使用 ORM 框架 Linq2Entities, Linq2SQL, NHibrenate 等等,即使這么說,用這些框架還是有一定的注入風險的,SQL 注入的來源主要是用戶界面的輸入框,一個經典的例子是:假如你有一個登錄界面,需要輸入 用戶名 和 密碼。
SELECT?*?FROM?Users?WHERE?Username?=?'"?+?username?+?"'?AND?password?=?'"?+?password?+?"'"此時有一個用戶在input上輸入 Admin'--, 那么SQL語句將會發生質的變化。
SELECT?*?FROM?Users?WHERE?Username?=?'Admin'?--'?AND?password?=?''要解決這種問題,就需要使用參數化查詢 SQLParameter 來解決。
點評區
說實話, 對于SQL注入這塊,我個人傾向于選擇 ?ORM 和 裸SQL 之間的 Dapper 來進行處理,比如下面這樣:
var?list?=?Execute(conn?=>{var?sql?=?string.Format($@"select?t.TagNo?from?xxx?as?cjoin?xxx?as?cton?c.ID?=?ct.IDwhere??t.TagNo?in?@TagNo?and?c.Cus_ID?=?@CustomerID");var?query?=?conn.Query<string>(sql,?new?{?TagNo?=?epcList,?CustomerID?=?context.CustomerID?}).ToList();return?query;});寫法靈活,可控性高,效率也不錯。
總結
以上是生活随笔為你收集整理的防SQL注入的最好实现方式是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么才能把项目做烂?!
- 下一篇: 对SQL server、Oracle、M