這個問題在這里已經有了答案: 我什么時候應該使用準備好的陳述句? (4 個回答) 58 分鐘前關閉。
我有使用 OLEDB 將資料輸入到 db 的代碼。假設它看起來像這樣
var commandText = $"INSERT into {tableName}
({columnName1}, {columnName2})
VALUES ({value1, value2});"
var command = new OleDbCommand(commandText, connection);
command.ExecuteNonQuery();
建議是使用OLEDB引數,像這樣
var commandText = $"INSERT into {tableName}
([{columnName1}], [{columnName2}])
VALUES (?, ?);"
var command = new OleDbCommand(commandText, connection);
command.Parameters.Add(new OleDbParameter(columnName1, value1));
command.Parameters.Add(new OleDbParameter(columnName2, value2));
command.ExecuteNonQuery();
在這里使用引數有什么好處?
如果之前驗證過這些值,它真的會提高安全性嗎?
uj5u.com熱心網友回復:
有了這段代碼,再多的引數也幫不了你。
連接表名和列名的事實使您的查詢容易受到 SQL 注入攻擊,這是使用引數的主要(但不是唯一)原因。
SQL 注入的作業方式是將發送到資料庫的部分字串替換為 sql 代碼。引數防止這種情況發生,因為資料庫將它們視為資料的占位符,這意味著它不會運行任何通過它們傳遞的 sql 代碼。
但是,由于您的表名和列名也是 c# 變數,因此可以將它們替換為資料庫將嘗試運行的 SQL 代碼。
假設以下代碼:
var tableName = "table (Col1) VALUES (null);DROP TABLE table;--";
// declare and populate columnName1, columnName2 with whatever values you want here, even just nulls
var commandText = $"INSERT into {tableName}
([{columnName1}], [{columnName2}])
VALUES (?, ?);"
// run SQL command here
這將在 中插入一條記錄table,然后從資料庫中洗掉該表。
有關更多資訊,請閱讀我的博客文章“回到基礎:SQL 注入”
uj5u.com熱心網友回復:
其實,是。我們都會犯錯,引數物件增加的額外安全性就像第二雙眼睛。此外,如果您始終使用引數物件,那么您在生產線上引入錯誤的風險就會降低。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/362762.html
