防注入,轉義

<?php

// sql的注入與轉義
/*
 先下以下例子:

del.php?id=3
$sql = 'delete from news where id=' . $_GET['id'];

del.php?id=3 or 1;
這時 $sql = 'delete from news where id=3 or 1'
這樣,全部的新聞將都被刪除.
*/

/* addslashes 能夠對某個變量轉義,
可是,$_POST是一個數組,可能有多個單元,
若是每一個單元手動的addslashes來轉義,工做量大. */

//封裝轉義函數
//咱們用系統提供好一個函數,來對數組進行遞歸
// array_walk_recursive ,這是遞歸處理數組單元的函數
// 函數自己只有一個功能------遞歸的把數組每一個單元走一遍
// 至於你怎麼處理這個數組,本身寫一個函數
function abc(&$v,$key){
	$v=addslashes($v);
}

array_walk_recursive(&$_GET, 'abc');

//這樣就能轉義 $_GET過來的地址,也能夠用魔術引號防注入
//magic_quotes_gpc=On,這是魔術引號的做用---魔術引號開啓時,$_GET,$_POST,$_COOKIE數據,會被系統自動轉義.

/* 要想合理的轉義,得先判斷 魔術引號 有沒有開啓
若是開啓了,不要再轉義了,
若是沒開啓,再轉義. */

//合理的判斷
if(!get_magic_quotes_gpc()){
	function _addslashes(&$v,$k){
		if(is_string($v)){
			$v=addslashes($v);
		}
	}
	
	array_walk_recursive($_GET,'_addslashes');
	array_walk_recursive($_POST,'_addslashes');
	array_walk_recursive($_COOKIE,'_addslashes');
		
}





?>
相關文章
相關標籤/搜索