相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說明
- thinkPHP5框架實(shí)現(xiàn)分頁查詢功能的方法示例
- PHP中單雙號與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
測試工具:過濾XSS攻擊和SQL注入函數(shù)
/**
+----------------------------------------------------------
* The goal of this function is to be a generic function that can be used to parse almost any input and * render it XSS safe. For more information on actual XSS attacks, check out http://ha.ckers.org/xss.html. * Another excellent site is the XSS Database which details each attack and how it works.
* XSS過濾
+----------------------------------------------------------
* @param mixed $value 變量
+----------------------------------------------------------
* @return mixed 過濾后的字符串
+----------------------------------------------------------
*/
function RemoveXSS($val) {
// remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
// this prevents some character re-spacing such as
// note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some // inputs
$val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
// straight replacements, the user should never need these since they're normal characters
// this prevents like
$search = 'abcdefghijklmnopqrstuvwxyz';
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$search .= '1234567890!@#$%^&*()';
$search .= '~`";:?+/={}[]-_|\'\\';
for ($i = 0; $i < strlen($search); $i++) {
// ;? matches the ;, which is optional
// 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
// @ @ search for the hex values
$val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val);//with a ;
// @ @ 0{0,7} matches '0' zero to seven times
$val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
}
// now the only remaining whitespace attacks are \t, \n, and \r
$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouSEOut', 'onmouSEOver', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2);
$found = true; // keep replacing as long as the previous round replaced something
while ($found == true) {
$val_before = $val;
for ($i = 0; $i < sizeof($ra); $i++) {
$pattern = '/';
for ($j = 0; $j < strlen($ra[$i]); $j++) {
if ($j > 0) {
$pattern .= '(';
$pattern .= '(&#[xX]0{0,8}([9ab]);)';
$pattern .= '|';
$pattern .= '|(�{0,8}([9|10|13]);)';
$pattern .= ')*';
}
$pattern .= $ra[$i][$j];
}
$pattern .= '/i';
$replacement = substr($ra[$i], 0, 2).''.substr($ra[$i], 2); // add in <> to nerf the tag
$val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
if ($val_before == $val) {
// no replacements were made, so exit the loop
$found = false;
}
}
}
return $val;
}
/*
+----------------------------------------------------------
* 函數(shù)名稱:inject_check()
+----------------------------------------------------------
* 函數(shù)作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護(hù)服務(wù)器安全
+----------------------------------------------------------
* @param mixed $sql_str: 提交的變量
+----------------------------------------------------------
* @return mixed 返回檢測結(jié)果,ture or false
+----------------------------------------------------------
*/
function inject_check($sql_str) {
return $sql_str = preg_replace('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile','', $sql_str); // 進(jìn)行過濾
}
/*
+----------------------------------------------------------
* 函數(shù)名稱:escapeMysql()
* SQL注入主要是提交不安全的數(shù)據(jù)給數(shù)據(jù)庫來達(dá)到攻擊目的。為了防止SQL注入攻擊,PHP自帶一個(gè)功能可以對輸入的字符串進(jìn)行處理,可以在較底層對 * 輸入進(jìn)行安全上的初步處理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc選項(xiàng)啟用,那么輸入的字符串 * 中的單引號,雙引號和其它一些字符前將會被自動(dòng)加上反斜杠\。
* 但Magic Quotes并不是一個(gè)很通用的解決方案,沒能屏蔽所有有潛在危險(xiǎn)的字符,并且在許多服務(wù)器上Magic Quotes并沒有被啟用。所以,我們 * 還需要使用其它多種方法來防止SQL注入。許多數(shù)據(jù)庫本身就提供這種輸入數(shù)據(jù)處理功能。例如PHP的MySQL操作函數(shù)中有一個(gè)叫 * mysql_real_escape_string()的函數(shù),可將特殊字符和可能引起數(shù)據(jù)庫操作出錯(cuò)的字符轉(zhuǎn)義。
+----------------------------------------------------------
* 函數(shù)作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護(hù)服務(wù)器安全
+----------------------------------------------------------
* @param mixed $sql_str: 提交的變量
+----------------------------------------------------------
* @return mixed 返回檢測結(jié)果,ture or false
+----------------------------------------------------------
*/
function escapeMysql($el){
if(is_array($el))
{
return array_map("escapeMysql", $el );
}else{
/*如果Magic Quotes功用啟用 */
if (!get_magic_quotes_gpc()) {
$el = mysql_real_escape_string(trim($el));
}
$el = str_ireplace("%5d%5c", "'", $el);
$el = str_replace("_", "\_", $el); // 把 '_'過濾掉
$el = str_replace("%", "\%", $el); // 把 '%'過濾掉
$el = nl2br($el); // 回車轉(zhuǎn)換
return $el;
}
}
/**
+----------------------------------------------------------
* 變量過濾
+----------------------------------------------------------
* @param mixed $value 變量
+----------------------------------------------------------
* @return mixed
+----------------------------------------------------------
*/
function var_filter_deep($value) {
return $value;
if(is_array($value))
{
return $value = array_map("var_filter_deep", $value );
}else{
$value = RemoveXSS($value);
//$value = inject_check($value);
$value = escapeMysql($value);
return $value;
}
}
/*
+----------------------------------------------------------
* 函數(shù)名稱:verify_id()
+----------------------------------------------------------
* 函數(shù)作用:校驗(yàn)提交的ID類值是否合法
+----------------------------------------------------------
* 參 數(shù):$id: 提交的ID值
+----------------------------------------------------------
* 返 回 值:返回處理后的ID
+----------------------------------------------------------
*/
function verify_id($id=null) {
if (!$id) { exit('沒有提交參數(shù)!'); } // 是否為空判斷
elseif (inject_check($id)) { exit('提交的參數(shù)非法!'); } // 注射判斷
elseif (!is_numeric($id)) { exit('提交的參數(shù)非法!'); } // 數(shù)字判斷
$id = intval($id); // 整型化
return $id;
}
/**
+----------------------------------------------------------
* 變量安全過濾
+----------------------------------------------------------
* @static
* @access public
+----------------------------------------------------------
* @return string
+----------------------------------------------------------
*/
function varFilter ()
{
$_SERVER = array_map( "var_filter_deep", $_SERVER );
$_REQUEST = array_map( "var_filter_deep", $_REQUEST);
$_POST = array_map( "var_filter_deep", $_POST );
$_GET = array_map( "var_filter_deep", $_GET );
$_COOKIE = array_map( "var_filter_deep", $_COOKIE );
//print_r($_POST);
}