MySQL防範SQL注入風險

MySQL防範SQL注入風險

0、導讀

在MySQL裏,如何識別而且避免發生SQL注入風險php

一、關於SQL注入

互聯網很危險,信息及數據安全很重要,SQL注入是最多見的入侵手段之一,其技術門檻低、成本低、收益大,頗受各層次的黑客們所青睞。mysql

通常來講,SQL注入的手法是利用各類機會將惡意SQL代碼添加到程序參數中,並最終被服務器端執行,形成不良後果。nginx

例如,咱們訪問接口 http://imysql.com/user.php?userid=123 來根據userid獲取用戶信息,假設程序中是這麼處理的:web

$sql = 「SELECT * FROM user WHERE userid = $_GET[userid] 「;sql

上面這段代碼看起來既low有很xx對吧,尤爲是在雙引號裏面還能夠直接引用數據類型變量,因此說php是世界上最好的語言一點不爲過,哈哈(其實我早期也寫過幾年php的)。安全

這時候,若是咱們傳遞進去的參數改爲這樣:http://imysql.com/user.php?userid=123 or 1=1 ,這就會 致使SQL條件永遠成立 ,全部的數據都會被讀取出來。又或者能夠傳遞這樣的參數:http://imysql.com/user.php?userid= 123 or if(now()=sysdate(),sleep(5),1) ,這時候不但全部的數據都會被讀取到,也會讓這個SQL執行完畢後再等待5秒才能返回,黑客可據此來判斷這個SQL注入探測是否成功。服務器

在上面這個例子中,其實咱們只須要對用戶輸入的參數進行簡單的類型判斷和控制,便可快速避免被注入的風險,例如改爲下面這樣就能夠了:app

$userid = intval(strim($_GET[‘userid’]));函數

$sql = 「SELECT * FROM user WHERE userid = 「 . mysql_real_escape_string($userid);工具

可見,至少基礎的SQL注入並不難防範,只要在各個層面都作足工做就能夠。而簡單的SQL盲注(就是亂拳打死老師傅的玩法)已經能夠採用 sqlmap 之類的輔助工具來作了,徹底不須要人工執行。

二、如何防範

上面提到過sqlmap,它既能夠做爲SQL盲注的工具,也能夠在新項目上線前內部掃一次,提早發現潛在漏洞,及時修補,反過來爲咱們所用。其餘能夠檢測sql注入漏洞的知名掃描工具備: SQLIer、SQLID、SQL Power Injector、SQLNinja 。

咱們也能夠本身經過頻繁掃描當前執行的SQL列表,根據一些關鍵字來判斷是否發生了SQL注入或潛在風險,常見的關鍵字有:

  • SLEEP() — 通常的SQL盲注都會伴隨SLEEP()函數出現,並且通常至少SLEEP 5秒以上

  • MID()

  • CHAR()

  • ORD()

  • SYSDATE()

  • SUBSTRING()

  • DATABASES()

  • SCHEMA()

  • USER()

  • VERSION()

  • CURRENT_USER()

  • LOAD_FILE()

  • OUTFILE/DUMPFILE

  • INFORMATION_SCHEMA

  • TABLE_NAME

  • fwrite()/fopen()/file_get_contents() — 這幾個是PHP文件操做函數

咱們能夠以較高頻率檢查當前的活躍SQL命令,一旦發現上述關鍵字,能夠當即記錄下來並觸發告警,通知管理員及時人工確認處理,甚至也能夠先直接自動殺掉這些SQL查詢(能夠用 pt-kill 工具來作到這點,也能夠自行開發),以防萬一,少給黑客留機會。

還有,咱們 建議把選項 safe-update/sql_safe_updates 設置爲 1,防止沒有任何 WHERE 條件的誤操做更新,將全表數據都寫錯 。

三、其餘建議

防範SQL注入只是數據安全保護工做很小的一部分,只要作好基本功就能夠防住至少80%以上的SQL注入探測。

在app server層,以PHP開發語言爲例,除了上面提到的規範用戶輸入類型外,還能夠 改爲用 sprintf() 函數來格式化構造 SQL 語句 ,也能夠必定程度防範SQL注入。還能夠 修改 php cgi 程序的運行屬主爲普通用戶 ,最起碼不能使用 root 用戶,避免由於代碼層不嚴謹致使被黑客上傳可執行 php 程序代碼文件。還能夠 把php中的遠程文件調用權限關閉,把選項 allow_url_fopen、allow_url_include 均設置爲 off,並限定php能夠打開的文件目錄 ,不容許跨區域訪問敏感文件。

除了在代碼層面作好數據類型判斷、用戶輸入判斷外,還能夠在web server層加上過濾策略,好比在nginx上啓用WAF插件。或者,也能夠購買IDC運營商、雲主機提供商提供的商業解決方案。對於重視數據安全的企業來講,花點錢保平安更爲重要。

   

四、附錄

下面是一些常見SQL注入參考案例:

案例1:SELECT * FROM t WHERE a LIKE ‘%xxx%’ OR (IF(NOW=SYSDATE(), SLEEP(5), 1)) OR b LIKE ‘1=1 ‘;

案例2:SELECT * FROM t WHERE a > 0 AND b IN(497 AND (SELECT * FROM (SELECT(SLEEP(20)))a) );

案例3:SELECT * FROM t WHERE a=1 and b in (1234 ,(SELECT (CASE WHEN (5=5) THEN SLEEP(5) ELSE 5*(SELECT 5 FROM INFORMATION_SCHEMA.CHARACTER_SETS) END)) );

上一頁     
相關文章
相關標籤/搜索