iT邦幫忙

0

Dapper有防SQL injection攻擊嗎?

  • 分享至 

  • xImage

使用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 )";  
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
Gary
iT邦好手 1 級 ‧ 2022-01-27 09:59:44

以下可以參考這位大大的筆記!!
https://ithelp.ithome.com.tw/upload/images/20220127/20025481LBNNYcLAm1.png
Dapper用法筆記

看更多先前的回應...收起先前的回應...
Jason iT邦新手 4 級 ‧ 2022-01-27 11:00:02 檢舉

這個我有看過了,只是他下的sql語法比較奇怪前面加:, 我的意思是若下一般常用的方式如下,交給Dapper時還可以防嗎

"SELECT EmpID, EmpName FROM Employees WHERE EmpName = '" + empname + "' AND Age = '" + age + "' AND Sex = '" + sex + "' AND Job = '" + job + "'"; // 設定SQL字串

froce iT邦大師 1 級 ‧ 2022-01-27 11:47:54 檢舉

你用字串結合的通常一般都很難防,請乖乖用參數帶入欄位。

wolfwang iT邦研究生 4 級 ‧ 2022-01-27 12:35:59 檢舉

組字就是很容易被 SQL Injection 呀

Gary iT邦好手 1 級 ‧ 2022-01-27 12:41:49 檢舉
1
石頭
iT邦高手 1 級 ‧ 2022-01-27 12:34:33

使用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

0
純真的人
iT邦大師 1 級 ‧ 2022-01-27 13:10:38

你想組字串就改這樣吧~

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 "; 
看更多先前的回應...收起先前的回應...
froce iT邦大師 1 級 ‧ 2022-01-27 13:59:36 檢舉

這樣組我就乾脆用參數查詢就好。XD

哈哈~他堅持的話~就是這樣XD

Luke iT邦研究生 5 級 ‧ 2022-01-28 08:53:26 檢舉

他堅持的話/images/emoticon/emoticon12.gif

小魚 iT邦大師 1 級 ‧ 2022-01-28 13:43:38 檢舉

這種事我好像做過.

0

認真來說,不知道為何你會想這樣問。

一般說,組字是最不安全的。
因為容易被加長本身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的欄位對應正規化。
防止被加工的可能性。

0
Samuel
iT邦好手 1 級 ‧ 2022-01-28 16:50:31

可以改用EF搭配Linq

我要發表回答

立即登入回答