2009-05-21 78 views
1

您如何處理用戶輸入(unicode),您需要將其限制爲某一組值,並且希望將應用程序將數據傳遞到下一行的風險降至最低。例如,如果我要將數據存儲在SQL中,我想要刪除任何SQL注入的機會。如果我通過HTTP將它通過電線發送,我想確保它不會惡化請求等。如何處理錯誤的數據?

我猜我在問什麼是有任何通用的數據清理方法?

回答

1

每個接口都有它自己的問題,當涉及到的方法來破壞系統。如果您想安全玩,您需要定製驗證以適應當前情況下相關的問題和/或威脅。

如果在用戶界面一定的文本框應該用於數字輸入,確保用戶不能鍵入(或粘貼)任何非數字進去。如果使用某個控件從用戶收集日期,則驗證給定值確實是有效的日期(可能它甚至應該落在特定範圍內;也會驗證該日期)。

確保URL,它是被作爲一個HTTP請求的查詢字符串值傳遞的編碼東西。使用存儲過程並將值作爲參數傳遞給它們。

等。不幸的是,沒有免費的午餐。

+0

我想總結這個答案,(1)請確保從用戶得到的數據是有效的,當你得到它(如數字); (2)當您要嵌入/顯示/發送時編碼數據,因此您知道格式的要求(例如,URL中的urlencode,SQL中的參數化查詢,以及html中的-encoding) – 2015-11-05 18:51:19

0

在保存到數據庫的情況下,這是非常簡單的。只需使用參數(DbParameter對象) - 它們將保護您免受SQL注入攻擊,並且還會在必要時添加轉義符號。

的代碼可以是這樣的:

OleDbConnection cn = new OleDbConnection(strConn); 
cn.Open(); 
strSQL = "INSERT INTO customers (Name) VALUES (@Name)"; 
OleDbCommand cmd = new OleDbCommand(strSQL, cn); 
cmd.Parameters.Add("@Name", "John O'Brian"); 
cmd.ExecuteNonQuery();
0

像nightcoder曾建議,參數,以避免SQL注入的方式。如果您使用的是SQL,請考慮使用SqlClient命名空間,因爲它比其對應的OleDb效率更高,並且專門爲SQL Server 7及更高版本創建。

使用nightcoder的上面的例子:

SqlConnection cn = new SqlConnection(strConn); 
cn.Open(); 
strSQL = "INSERT INTO customers (Name) VALUES (@Name)"; 
SqlCommand cmd = new SqlCommand(strSQL, cn); 
cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.Varchar)).Value = "John O'Brian"; 
cmd.ExecuteNonQuery(); 

的東西,以保持在有關的SqlClient命名空間的一點是,如果你寫舊的系統(Win98下),則可能存在兼容性問題,使得OldDBxxx越好選擇。

乾杯!