摘抄自ThinkPHPhtml
/** * 獲取變量 支持過濾和默認值 * @param array $data 數據源 * @param string|false $name 字段名 * @param mixed $default 默認值 * @param string|array $filter 過濾函數 * @return mixed */ function input($data = [], $name = '', $default = null, $filter = '') { $name = (string) $name; if (is_array($data)) { array_walk_recursive($data, 'filterValue', $filter); reset($data); } else { filterValue($data, $name, $filter); } return $data; } /** * 遞歸過濾給定的值 * @param mixed $value 鍵值 * @param mixed $key 鍵名 * @param array $filters 過濾方法+默認值 * @return mixed */ function filterValue(&$value, $key, $filters) { $default = array_pop($filters); foreach ($filters as $filter) { if (is_callable($filter)) { // 調用函數或者方法過濾 $value = call_user_func($filter, $value); } elseif (is_scalar($value)) { if (false !== strpos($filter, '/')) { // 正則過濾 if (!preg_match($filter, $value)) { // 匹配不成功返回默認值 $value = $default; break; } } elseif (!empty($filter)) { // filter函數不存在時, 則使用filter_var進行過濾 // filter爲非整形值時, 調用filter_id取得過濾id $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter)); if (false === $value) { $value = $default; break; } } } } return filterExp($value); } /** * 過濾表單中的表達式 * @param string $value * @return void */ function filterExp(&$value) { // 過濾查詢特殊字符 if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) { $value .= ' '; } // TODO 其餘安全過濾 } /** * 強制類型轉換 * @param string $data * @param string $type * @return mixed */ function typeCast(&$data, $type) { switch (strtolower($type)) { // 數組 case 'a': $data = (array) $data; break; // 數字 case 'd': $data = (int) $data; break; // 浮點 case 'f': $data = (float) $data; break; // 布爾 case 'b': $data = (boolean) $data; break; // 字符串 case 's': default: if (is_scalar($data)) { $data = (string) $data; } else { throw new InvalidArgumentException('variable type error:' . gettype($data)); } } }
PHP檢測SQL注入攻擊代碼數組
//過濾注入 function filter_injection(&$request) { $pattern = "/(select[\s])|(insert[\s])|(update[\s])|(delete[\s])|(from[\s])|(where[\s])|(truncate[\s])|(drop[\s])|(table[\s])|(grant[\s])|(load_file[\s])|(outfile[\s])/i"; foreach($request as $k=>$v) { if(preg_match($pattern,$k,$match)) { die("SQL Injection denied!"); } if(is_array($v)) { filter_injection($request[$k]); } else { if(preg_match($pattern,$v,$match)) { die("SQL Injection denied!"); } } } }
JavaScript檢測SQL注入式攻擊代碼: <script> var url = location.search; var re=/^\?(.*)(select%20|insert%20|delete%20from%20|drop%20table|update%20truncate%20)(.*)$/gi; var e = re.test(url); if(e) { alert("地址中含有非法字符~"); } <script>
版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請註明做者及出處。 |