PHP通用防注入过滤函数封装示例

阿橙
阿橙
发布时间:2026-10-15 | 6人浏览过
原创

在PHP Web开发中,防止SQL注入和XSS攻击是基础且关键的安全措施。本文整理了一套通用的防注入与数据过滤函数代码,涵盖了对全局变量的自动清洗以及针对特定数据类型(如整型、字符串)的详细过滤逻辑。

函数功能概览

该段代码主要包含以下几类核心功能:

  • 全局变量清洗:检查 magic_quotes_gpc 状态,若未开启则对 $_GET, $_POST, $_COOKIE, $_FILES 和 $_SERVER 进行深度递归过滤。
  • 类型化过滤:提供专门的整型过滤 num_check、字符过滤 str_check 和搜索词过滤 search_check 函数。
  • 注入检测:使用正则表达式匹配常见的 SQL 注入关键字(如 select, union, load_file 等)。

第1步:集成公共防护代码

将以下代码作为一个独立的公共文件(例如 safe_filter.php)引入到你的项目入口或公共配置文件中。调用时需注意其会直接修改全局数组的值。

复制代码 代码如下:
<?php
// PHP整站防注入程序,需要在公共文件中require_once本文件
// 判断magic_quotes_gpc状态
if (@get_magic_quotes_gpc ()) {
    $_GET = sec ( $_GET );
    $_POST = sec ( $_POST );
    $_COOKIE = sec ( $_COOKIE );
    $_FILES = sec ( $_FILES );
}
$_SERVER = sec ( $_SERVER );

function sec(&$array) {
    //如果是数组,遍历数组,递归调用
    if (is_array ( $array )) {
        foreach ( $array as $k => $v ) {
            $array [$k] = sec ( $v );
        }
    } else if (is_string ( $array )) {
        //使用addslashes函数来处理
        $array = addslashes ( $array );
    } else if (is_numeric ( $array )) {
        $array = intval ( $array );
    }
    return $array;
}

//整型过滤函数
function num_check($id) {
    if (! $id) {
        die ( '参数不能为空!' );
    } //是否为空的判断
    else if (inject_check ( $id )) {
        die ( '非法参数' );
    } //注入判断
    else if (! is_numetic ( $id )) {
        die ( '非法参数' );
    }
    //数字判断
    $id = intval ( $id );
    //整型化
    return $id;
}

//字符过滤函数
function str_check($str) {
    if (inject_check ( $str )) {
        die ( '非法参数' );
    }
    //注入判断
    $str = htmlspecialchars ( $str );
    //转换html
    return $str;
}

function search_check($str) {
    $str = str_replace ( "_", "\_", $str );
    //把"_"过滤掉
    $str = str_replace ( "%", "\%", $str );
    //把"%"过滤掉
    $str = htmlspecialchars ( $str );
    //转换html
    return $str;
}

//表单过滤函数
function post_check($str, $min, $max) {
    if (isset ( $min ) && strlen ( $str ) < $min) {
        die ( '最少$min字节' );
    } else if (isset ( $max ) && strlen ( $str ) > $max) {
        die ( '最多$max字节' );
    }
    return stripslashes_array ( $str );
}

//防注入函数
function inject_check($sql_str) {
    return eregi ( 'select|inert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|UNION|into|load_file|outfile', $sql_str );
    // www.jb51.net 进行过滤,防注入
}

function stripslashes_array(&$array) {
    if (is_array ( $array )) {
        foreach ( $array as $k => $v ) {
            $array [$k] = stripslashes_array ( $v );
        }
    } else if (is_string ( $array )) {
        $array = stripslashes ( $array );
    }
    return $array;
}
?>

关键函数说明

sec():这是核心的递归处理函数。它判断传入值是否为数组、字符串或数字。对于字符串,它会使用 addslashes() 添加反斜杠转义;对于数字,则转为整型。这种处理方式简单粗暴,适合传统的单引号闭合注入防护,但请注意它不能替代现代开发中推荐的预处理语句(Prepared Statements)。

inject_check():使用 eregi(不区分大小写的正则匹配)来扫描包含危险关键字的输入。这些关键字涵盖了基本的增删改查操作以及试图读取服务器文件的尝试。

str_check() & search_check():除了基础的注入检测外,str_check 对输出内容进行了 HTML 实体转换,有助于防范 XSS。search_check 额外转义了下划线和百分号,这对于防止 SQL LIKE 查询中的通配符注入是必要的。

注意事项

  1. 安全性局限:此方案属于“黑名单”机制。随着数据库和编程语言版本的更新,新的注入向量和编码绕过技术层出不穷。在现代 PHP 开发中,强烈建议直接使用 PDO 或 MySQLi 的预处理语句来从根本上解决 SQL 注入问题。
  2. 性能影响:对全局变量进行递归处理会在请求入口处产生一定的开销,对于高并发场景需谨慎评估。
  3. 废弃函数:代码中使用的 eregi 和 magic_quotes_gpc 在较新版本的 PHP 中已被移除或不再默认开启,使用时请确保运行环境兼容。

以上就是比较好用的PHP防注入漏洞过滤函数代码的详细内容,更多关于PHP开发安全的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表