sql注入:
正常情況下:
delete.php?id=3;
$sql = 'delete from news where id = '.$_GET['id'];
惡意情況:
delete.php?id=3 or 1;
$sql = 'delete from news where id = 3 or 1'; -------如此執行後,所有的記錄將都被刪除
應該采取相關措施。。。比如用之前先判斷是否是數字等等。
要使自己相信,從客戶端傳來的信息永遠是不可靠的!!
轉義:
有時候從客戶端傳來的數據,可能惡意包含些特殊的字符,比如單引號、斜槓等,所以需要轉義,轉義成普通的字符,此時就要用到string addslashes ( string $str ),這個函數可以對某個變量進行轉義。但是,如果對數組裡的元素進行轉義,就用foreach循環數組,如下:
復制代碼 代碼如下:
foreach($_POST as $k=>$v) {
if(is_string($v)) {
$_POST[$k] = addslashes($v);
}
}
但是如果數組中還包含數組,那就要遞歸進行轉義了,此時用到
array_walk_recursive(array &$input , callback $funcname [, mixed $userdata ])
將用戶自定義函數 funcname 應用到 array 數組中的每個單元。本函數會遞歸到更深層的數組中去。典型情況下 funcname 接受兩個參數。input 參數的值作為第一個,鍵名作為第二個。如果提供了可選參數 userdata,將被作為第三個參數傳遞給 callback funcname。成功時返回 TRUE, 或者在失敗時返回 FALSE
也就是說:用自定義的函數,至少要能接收兩個參數,而addslashes()只能接收一個參數所以自定義一個函數如下:
復制代碼 代碼如下:
function a(&$v,$k){
$v=addslashes($v);
}
array_walk_recursive(&$arr,'a');
系統自動轉義:
PHP中,有一個魔術引號的概念,如何打開?答:在PHP.ini中,magic_quotes_gpc=On;重啟apache即可
魔術引號被打開後,系統會自動對$_GET,$_POST,$_COOKIE數據進行轉義,在不知情的情況下,再次進行手動轉義的話,就轉多了,要想合理的進行轉義,就要首先判斷,魔術符號是否已經打開了,用magic_quotes_gpc()進行判斷,不需要傳值,關閉返回0,關閉返回1
復制代碼 代碼如下:
if(!get_magic_quotes_gpc()) { // 如果魔術引號沒開
function _addslashes(&$v,$k) {
$v = addslashes($v);
}
array_walk_recursive(&$_GET,'_addslashes');
array_walk_recursive(&$_POST,'_addslashes');
array_walk_recursive(&$_COOKIE,'_addslashes');
}