PHP用戶輸入安全過濾和注入攻擊檢測

摘抄自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)國際許可協議進行許可,轉載請註明做者及出處。
本文標題:PHP用戶輸入安全過濾和注入攻擊檢測
本文連接:http://www.cnblogs.com/sochishun/p/8459562.html
本文做者:SoChishun (郵箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
發表日期:2018年2月22日安全

相關文章
相關標籤/搜索