image

最近在做伺服器檢查的時候,發現公司內所寫的幾個背景程式經常莫名其妙出問題.於是開始下來檢查一下,就像前幾篇提到的一樣,我有加上HipChat當做是看門狗的程式來監視並且確實的回報資訊給我.

但是,就算有收到回報訊息.找出容易發生問題的地方才是重點.後來有查到當使用者自己從手機上輸入資料傳到伺服器的時候.就會發生MySQL Query Error ,以下面的範例:

 "SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'"

如果這時候,使用這輸入加上有 “ ‘ “的字元,就會產生MySQL Query Error.甚至於會SQL Injeect就是輸入以下的內容:

   "' OR ''=''#"  

這時候唯一的方式就是講 “’“ 轉換成 “'”才不會讓SQL Qeury發生錯誤或是不可預期的狀態.

其實這相關的方式,在PHP裡面相當的簡單就是加上addslashes函式.但是在用C++直接存取MySQL的時候,可就沒那麼方便.

找了一下相關的文章,後來在MySQL API Document 裡面有找到mysql_escape_string,順便也找到有人寫的範例程式可以使用. 引用自這裡http://www.3dbuzz.com/forum/threads/146155-C-version-of-addslashes

/** 
* escapes the mysql string 
* note running on the entire SQL screws it so just run it on elements to be inserted 
* @param string sql 
* @author D.Busby 
*/ 
char *db_connection::escape_string(string sql) 
{ 
        char *s = new char[sql.size()*2 + 1]; 
        mysql_escape_string(s, const_cast<char *>(sql.c_str()), sql.size()); 
        return s; 
}  

接下來只要將每個要帶入查詢的內容先加上這個函式就可以.

相關資源:


Evan

Attitude is everything