C# SQLinjection

SQLinjection 是一個老掉牙的題目了,當初面試時也有被問過觀念。

但因為我不勤學只知道概念卻從來沒特別寫過。

在公司所撰寫的因為都是內部系統也沒有特別去考慮SQLinjection的問題,因此就很懶惰。


 

SQL injection 資料隱碼攻擊

SQL injection  簡單來說就是透過 一些特殊符號 讓SQL 語句 以為是對的導致執行。

先來做個我們常看到的簡單版登入系統 只有帳號密碼

通常我們的SQL 語句 會這麼下

string sql = "SELECT top 1 * FROM USERS WHERE USERID='" + account + "' AND PWD_ORIGINAL='" + pw + "'";

只要account 跟 pw 對了,就會有值出現。

執行SQL 指令後會如下

string sql = "SELECT top 1 * FROM USERS WHERE USERID='1108' AND PWD_ORIGINAL='aaa';

那什麼是SQL injection 呢??

我們可以從上方的執行SQL指令後可以發現 我們再PWD_ORIGINAL 的地方寫入 如上圖

string sql = "SELECT top 1 * FROM USERS WHERE USERID='1108' AND PWD_ORIGINAL=''or 1 = 1 or ''='';

這時候SQL指令因為 後面的OR 1 = 1 是正確的,所以他會認為是對的因此執行,但他通常會抓到資料表的第一個資料 或是 最後一個資料

這就要看寫程式的邏輯怎麼寫了,通常登入後我們就會進入登入後的介面也會帶出使用者所有應有得資訊。

這樣就有利於不肖人士所惡意利用

因此如何防範呢?? 其實是要我們後端去改寫一點點東西

cmd.Parameter.Add(@輸入的值 , SqlDbType.VarChar).Value

string sql = "SELECT top 1 * FROM USERS WHERE USERID='" + @account + "' AND PWD_ORIGINAL='" + @pw + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add(@account, SqlDbType.VarChar).Value = account;
cmd.Parameters.Add(@pw, SqlDbType.VarChar).Value = pw;

SqlDbType --> 指定欄位的 SQL Server 特定的資料型別與屬性,以便在 SqlParameter 中使用。


2019/06/03 修正寫法

string sql = "SELECT top 1 * FROM USERS WHERE USERID=?account AND PWD_ORIGINAL=?pw";
SqlCommand cmd = new SqlCommand(sql, conn);
 cmd.Parameters.AddWithValue("?account", user.PhoneID);
 cmd.Parameters.AddWithValue("?pw", user.Pw);