使用Dapper,但參數是設定"SELECT EmpID, EmpName FROM Employees WHERE EmpName = '" + empname + "' AND Age = '" + age + "' AND Sex = '" + sex + "' AND Job = '" + job + "'"; // 設定SQL字串
這樣Dapper還有防SQL injection攻擊嗎?
如果是這樣就不會被攻擊?
string querystr = "SELECT EmpID, EmpName FROM Employees WHERE EmpName = :EmpName AND Age = :Age AND Sex = :Sex AND Job = :Job";
但為何會有:,這不是標準的SQL :是什麼意思
這樣呢會被攻擊?
string _sql = $@"INSERT INTO [{tableName}]
( [a1]
,[a2]
,[CREATIONDATE])
VALUES
( @a1,
@a2,
@CREATIONDATE )";
以下可以參考這位大大的筆記!!
Dapper用法筆記
使用Dapper,但參數是設定"SELECT EmpID, EmpName FROM Employees WHERE EmpName = '" + empname + "' AND Age = '" + age + "' AND Sex = '" + sex + "' AND Job = '" + job + "'"; // 設定SQL字串
這樣Dapper還有防SQL injection攻擊嗎?
簡單回答:沒有辦法
如果是串字串(且前面沒有針對危險 injection 字元判斷排除)不管你是用哪個 ORM 或 Ado.net 都沒有辦法防 sql injection,要防止請用各語言提供的sql參數方式帶入(底層幫你實現防止 sql injection).
建議你可以先看看 sql injection 是怎麼攻擊,在思考上面程式碼
可以參考之前有人寫的鐵人賽 原始碼檢測x弱點修補X驗證攻擊-SQL Injection
你想組字串就改這樣吧~
string Str = "";
Str += " declare @EmpName nvarchar(50) = N'" + empname + "';";
Str += " declare @Age nvarchar(50) = N'" + age + "';";
Str += " declare @Sex nvarchar(50) = N'" + sex + "';";
Str += " declare @Job nvarchar(50) = N'" + job + "';";
Str += " SELECT EmpID, EmpName ";
Str += " FROM Employees ";
Str += " WHERE EmpName = @EmpName ";
Str += " AND Age = @Age ";
Str += " AND Sex = @Sex ";
Str += " AND Job = @Job ";
認真來說,不知道為何你會想這樣問。
一般說,組字是最不安全的。
因為容易被加長本身SQL的語法,導致被注入。
用最簡單的例子說明
$_POST['account'] = "' OR 1=1 --";
$sql = "SELECT userid FROM DB WHERE acount='".$_POST['account']."'"
這樣子就會生成如下的SQL碼
SELECT userid FROM DB WHERE acount='' OR 1=1 --'
而參數化帶入,有些是會幫忙處理跳拖字元。也就是會生成
SELECT userid FROM DB WHERE acount='\' OR 1=1 --'
當然以上只是簡單的說明。實際上來說其實大多要防注入,還需要做一些處理的。
簡單來說,參數帶入的目的,就是為了將SQL的欄位對應正規化。
防止被加工的可能性。