今天分享一個(gè)Thinkphp安全方面的知識:SQL注入篇
1. 什么是SQL注入懈词?
??????利用現(xiàn)有應(yīng)用程序童叠,將(惡意)的SQL命令注入到后臺數(shù)據(jù)庫執(zhí)行一些惡意的操作。這是黑客對數(shù)據(jù)庫進(jìn)行攻擊的常用手段之一嫁蛇。
2. 導(dǎo)致SQL注入原因
??????程序在編寫的時(shí)候锨并,沒有對輸入的數(shù)據(jù)的合法性進(jìn)行判斷,注入者可在表單中輸入一段數(shù)據(jù)庫查詢代碼并提交睬棚,程序可將提交的信息組成一條sql語句第煮,服務(wù)器執(zhí)行該條sql語句。注入者可根據(jù)程序返回的結(jié)果抑党,獲取一些敏感數(shù)據(jù)包警,甚至控制整個(gè)服務(wù)器。
3. ThinkPHP如何防止sql注入底靠?(個(gè)人整理的一些建議)
- 查詢條件盡量使用數(shù)組方式害晦,這是更為安全的方式
- 如果不得已必須使用字符串查詢條件,使用預(yù)處理機(jī)制
- 使用自動驗(yàn)證和自動完成機(jī)制進(jìn)行針對應(yīng)用的自定義過濾暑中;
- 如果環(huán)境允許壹瘟,盡量使用PDO方式,并使用參數(shù)綁定鳄逾。
防止措施:
-
使用數(shù)組方式將自動使用框架自帶的字段類型檢測防止注入
//獲取正常的id值 $_GET['id'] = 8; //直接將數(shù)據(jù)放入where條件 $data = M('User')->where('id='.$_GET['id'])->find(); //此時(shí)用于若是傳遞“異车竟欤”的id $_GET['id'] = '8 or status = 1'; //解決方式:可以使用數(shù)組方式來傳遞數(shù)據(jù) $data = M('User')->where(array('id'=>$_GET['id']))->find();
-
使用預(yù)處理機(jī)制
$data = M('User')->where(("id=%d and username='%s'",array($id,$username))->select();
-
對獲取的數(shù)據(jù)進(jìn)行類型約束
$data = M('User')->where(array('id'=>(int)$_GET['id']))->find();
-
對類型進(jìn)行強(qiáng)制轉(zhuǎn)換
$data = M('User')->where(array('id'=>I('get,id',’’,’intval’)))->find();
-
PDO驅(qū)動可以使用參數(shù)綁定
$data = M('User')->where(array('id'=>':id'))->bind(':id',I('get.id'))->select();