摘抄自ThinkPHP
/** * 获取变量 支持过滤和默认值 * @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)国际许可协议进行许可,转载请注明作者及出处。 |