Asp.net
asp.net 是否可以防止 sql 注入攻擊
預設情況下,ASP.net 在使用 ASP 控制項時是否可以防止 SQL 注入攻擊?
不,只要您提供 SQL,您就可以明智地使用控制項。
這通常意味著清理輸入並在動態 SQL 字元串上使用參數化查詢或儲存過程。
如果控制項正在為您生成查詢(例如成員資格控制項等),那麼您將受到很好的保護。
是和不是。
ADO.NET 對參數化的支持非常好,當你使用得當時,參數值會被自動清理以防止 SQL 注入。因此,您可以將參數添加到
SqlCommand(或SqlDataSource控制項),而不必過多擔心其中的內容。好消息是參數化你的東西真的很容易。我將向您展示一個以程式方式執行此操作的 C# 範例,但如果您願意,您可以使用伺服器控制項以聲明方式執行此操作。
壞消息是,就像其他任何事情一樣,您仍然需要考慮自己在做什麼。如果您想獲得任何安全性,則必須對來自不安全來源的任何字元串進行參數化。如果將其逐字粘貼到查詢中,您將繞過 ADO.NET 的安全功能。
安全的:
string name = txtName.Text; sqlCommand.CommandText = "select * from product where name = @name"; sqlCommand.Parameters.AddWithValue("name", name);不安全:
string name = txtName.Text; sqlCommand.CommandText = "select * from product where name = " + name;如果 SQL 查詢中的任何內容直接來自使用者,則需要將其放入參數中,否則所有賭注都將被取消。就像幾乎其他任何事情一樣,**如果你真的想的話,有可能射中自己的腳。**例如,您可以獲取 SQL 程式碼,將其放入參數中,然後將其傳遞給 SQL
EXEC語句。但你不會那樣做,對吧,因為這是一個非常糟糕的主意。仍然不安全(是的,我在生產程式碼中看到了這個)!
string sql = "select * from product where name = " + txtName.Text; sqlCommand.CommandText = "exec(@sql)"; sqlCommand.Parameters.AddWithValue("sql", sql);TL;DR: ADO.NET 具有阻止 SQL 注入的強大功能,但前提是您正確使用它們。