php 过滤请求参数防止xss和sql注入 2023-06-03
2023-06-02 本文已影响0人
阿然学编程
/**
* @param $params
* @return array|string|string[]|null
*/
function filter_input_params($params)
{
// 定义各种正则表达式,用于过滤危险输入
$filter_arr = array(
// 过滤 HTML 标签
'/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU',
// 过滤 JavaScript 事件
'/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU',
// 过滤 SQL 注入字符
'/select\b|and\b|or\b|like\b|regexp\b|from\b|where\b|update\b|insert\b|exec\b|order\s*by|having\b|drop\b|delete\b|\(|\)|\[|\]|\||<|>|;|:|&|\'|\"|%|\+|-|_|=|\*|\\\\|union|into|load_file|outfile|dump/is',
// 过滤参数中的 URL,不过建议使用专门的 URL 过滤函数或第三方库
'/(^|[^\\w])(https?:\\/\\/[^\\s]+)([^\\w]|$)/i',
// 过滤ASCII码大于127的非法字符
'/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u',
// 过滤不可见字符(制表符(Tab)、回车符(CR)、换行符(LF)等)
'/\p{Cc}+/u'
);
if (is_array($params)) {
array_walk_recursive($params, function (&$v) use ($filter_arr) {
if (!is_numeric($v)) {
if (filter_var($v, FILTER_VALIDATE_URL)) {
$v = filter_var($v, FILTER_SANITIZE_URL);
} elseif (filter_var($v, FILTER_VALIDATE_EMAIL)) {
$v = filter_var($v, FILTER_SANITIZE_EMAIL);
} else {
$v = strip_tags($v); // 过滤 HTML 标签
$v = preg_replace($filter_arr, '', $v); // 去除危险字符
}
$v = trim($v);
}
});
} else {
if (!is_numeric($params)) {
if (filter_var($params, FILTER_VALIDATE_URL)) {
$params = filter_var($params, FILTER_SANITIZE_URL);
} elseif (filter_var($params, FILTER_VALIDATE_EMAIL)) {
$params = filter_var($params, FILTER_SANITIZE_EMAIL);
} else {
$params = strip_tags($params); // 过滤 HTML 标签
$params = preg_replace($filter_arr, '', $params); // 去除危险字符
}
$params = trim($params); // 去除空格
}
}
return $params;
}