PHP 防止SQL注入漏洞

PHP 防止SQL注入漏洞

开发项目时,不止要考虑项目快速上线,考虑到项目的质量,同时重中之重要考虑到项目的安全性,防止数据泄露,防止数据库被删除,防止数据被篡改等严重的漏洞问题,今天分享一个简单的SQL注入防御,通过在项目入口文件直接引用该类,能防御大部分的表单提交注入的sql语句。涉及到一些特殊的SQL指令,需要自行添加。

代码

<?php
//+----------------------------------------------------------
//+- 防止sql注入攻击
//+----------------------------------------------------------

class XssFilter{

    public static function getIntance(){
        $post  = file_get_contents('php://input');
        if(!empty($post)){
            $_POST = array_merge($_POST, json_decode($post, JSON_UNESCAPED_UNICODE));
        }
        XssFilter::inspection($_GET);
        XssFilter::inspection($_POST);
    }

    /**
     * 字段白名单,提交的表单字段白名单
     * @return array
     */
    private static function blacklist(){
        return array(
            "content"
        );
    }

    //避免SQL漏洞
    private static function inspection(&$requests){
        if(!empty($requests)){
            foreach ($requests as $kk=>&$vv){
                if(is_array($vv)){
                    XssFilter::inspection($vv);
                }else{
                    $kk             = htmlspecialchars($kk, ENT_QUOTES); //过滤键值
                    if(!in_array($kk, XssFilter::blacklist())){
                        if(!XssFilter::is_json($vv)){
                            //判断不是json数据进行处理
                            $str    = XssFilter::filterWords($vv);
                            $str    = XssFilter::clearSQLFilter($str);
                            $str    = filter_var($str, FILTER_SANITIZE_STRING); //字符串过滤
                            $vv     = htmlspecialchars($str, ENT_QUOTES);
                        }
                    }
                }
            }
        }
    }

    //判断是否是json字符串
    private static function is_json($string) {
        json_decode($string);
        return (json_last_error() == JSON_ERROR_NONE);
    }

    //sql过滤
    private static function clearSQLFilter($str){
        $str = str_ireplace("and",      "",$str);
        $str = str_ireplace("execute",  "",$str);
        $str = str_ireplace("update",   "",$str);
        $str = str_ireplace("count",    "",$str);
        $str = str_ireplace("chr",      "",$str);
        $str = str_ireplace("mid",      "",$str);
        $str = str_ireplace("master",   "",$str);
        $str = str_ireplace("truncate", "",$str);
        $str = str_ireplace("char",     "",$str);
        $str = str_ireplace("declare",  "",$str);
        $str = str_ireplace("select",   "",$str);
        $str = str_ireplace("create",   "",$str);
        $str = str_ireplace("delete",   "",$str);
        $str = str_ireplace("insert",   "",$str);
        $str = str_ireplace("'",        "",$str);
        $str = str_ireplace('"',        "",$str);
        $str = str_ireplace(" ",        "",$str);
        $str = str_ireplace("or",       "",$str);
        $str = str_ireplace("=",        "",$str);
        $str = str_ireplace("%20",      "",$str);
        $str = str_ireplace("where",    "",$str);
        $str = str_ireplace("having",   "",$str);
        $str = str_ireplace("union",    "",$str);
        $str = str_ireplace("all",      "",$str);
        return $str;
    }

    /**
     * 正则过滤
     * @param unknown $str
     */
    private static function filterWords($str) {
        $farr   = array(
            "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU",
            "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
            "/select|eval|dosomething|addslashes|return_var|command|shell_exec|system|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is",
            "/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i"
        );
        $str    = preg_replace($farr, "" ,$str);
        return $str;
    }
}

XssFilter::getIntance();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹雪峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值