• 仿sql注入 sql


    <?php
    class sqlsafe {


    //(and|or)\b 表示以and和or结尾的单词如:aand,band,都可以匹配
    //如果匹配and或or则使用 \b(and|or)\b来匹配单词;
    // \/ 匹配/ 在写法上/表示意义相同
    // \* 匹配* 在写法上*表示意义相同
    // \s 表示匹配空白字符;

    private $getfilter = "|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|
    <\s*script\b|\bEXEC\b|UNION.+?SELECT|
    UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|
    (CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";


    //int preg_match ( string $pattern , string $subject [, array &$matches [,
    // int $flags = 0 [, int $offset = 0 ]]] )
    //搜索subject与pattern给定的正则表达式的一个匹配.
    //如果提供了参数matches, 它讲被填充为搜索结果. $matches[0]将包含完整模式
    //匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本, 以此类推
    // \b(and|or)\b.{1,6}? 匹配and or后面的第一个字符
    private $postfilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|
    \/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|
    INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)
    \s+(TABLE|DATABASE)";

    private $cookiefilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|
    <\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|
    (SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";

    /**
    * 构造函数
    */
    public function __construct() {
    if(!empty($_GET)){
    foreach($_GET as $key=>$value)
    {$this->stopattack($key,$value,$this->getfilter);}
    }

    if(!empty($_POST)) {
    foreach ($_POST as $key => $value) {
    $this->stopattack($key, $value, $this->postfilter);
    }
    }
    if(!empty($_POST)) {
    foreach ($_COOKIE as $key => $value) {
    $this->stopattack($key, $value, $this->cookiefilter);
    }
    }
    }
    /**
    * 参数检查并写日志
    */
    public function stopattack($StrFiltKey, $StrFiltValue, $ArrFiltReq){
    if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue);
    if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue,$arr) == 1){
    var_dump($arr);
    // $this->writeslog($_SERVER["REMOTE_ADDR"]." ".strftime("%Y-%m-%d %H:%M:%S")."
    ".$_SERVER["PHP_SELF"]." ".$_SERVER["REQUEST_METHOD"]." ".$StrFiltKey." ".$StrFiltValue);
    echo ('您提交的参数非法,系统已记录您的本次操作!');
    }
    }
    /**
    * SQL注入日志
    */
    public function writeslog($log){
    $log_path = CACHE_PATH.'logs'.DIRECTORY_SEPARATOR.'sql_log.txt';
    $ts = fopen($log_path,"a+");
    fputs($ts,$log." ");
    fclose($ts);
    }
    }


    $sql=new sqlsafe();




    ?>
  • 相关阅读:
    模板、中间件以及MVC与MTV
    Cookie与Session
    分页与网页攻击
    Django一对一查询,列类型及参数
    Django ORM 查询
    Django中ORM多对多表的操作
    Django中的ORM
    一、Vue简介
    三、路由层(urls.py)
    二、django简介
  • 原文地址:https://www.cnblogs.com/hehexu/p/8323805.html
Copyright © 2020-2023  润新知