sql >> データベース >  >> RDS >> Mysql

PHPがSQLインジェクションの試行を検出

    SQLインジェクションの試行をチェック/検出するための非常に基本的で単純なPHPクラスを作成しました。

    <?php
    /**
     * simpleSQLinjectionDetect Class
     * @link      https://github.com/bs4creations/simpleSQLinjectionDetect 
     * @version   1.1
     */
    
    class simpleSQLinjectionDetect
    {   
        protected $_method  = array();
        protected $_suspect = null; 
    
        public $_options = array(
                                'log'    => true,
                                'unset'  => true,
                                'exit'   => true,
                                'errMsg' => 'Not allowed',
                            );
    
        public function detect()
        {
            self::setMethod();
    
            if(!empty($this->_method))
            {
                $result = self::parseQuery();
    
                if ($result)
                {
                    if ($this->_options['log']) {
                        self::logQuery();
                    }
    
                    if ($this->_options['unset']){
                        unset($_GET, $_POST);
                    }
    
                    if ($this->_options['exit']){
                        exit($this->_options['errMsg']);
                    }
                }
            }
        }
    
        private function setMethod()
        {
            if ($_SERVER['REQUEST_METHOD'] === 'GET') {
                $this->_method = $_GET;
            }
    
            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
                $this->_method = $_POST;
            }
        }
    
        private function parseQuery()
        {
            $operators = array(
                'select * ',
                'select ',
                'union all ',
                'union ',
                ' all ',
                ' where ',
                ' and 1 ',
                ' and ',
                ' or ',
                ' 1=1 ',
                ' 2=2 ',
                ' -- ',
            );
    
            foreach($this->_method as $key => $val)
            {
                $k = urldecode(strtolower($key));
                $v = urldecode(strtolower($val));
    
                foreach($operators as $operator)
                {
                    if (preg_match("/".$operator."/i", $k)) {
                        $this->_suspect = "operator: '".$operator."', key: '".$k."'";
                        return true;
                    }
                    if (preg_match("/".$operator."/i", $v)) {
                        $this->_suspect = "operator: '".$operator."', val: '".$v."'";
                        return true;
                    }
                }
            }
        }
    
        private function logQuery()
        {
            $data  = date('d-m-Y H:i:s') . ' - ';
            $data .= $_SERVER['REMOTE_ADDR'] . ' - ';
            $data .= 'Suspect: ['.$this->_suspect.'] ';
            $data .= json_encode($_SERVER);
            @file_put_contents('./logs/sql.injection.txt', $data . PHP_EOL, FILE_APPEND);
        }
    }
    
    /* then call it in your app...
    *********************************************/
    $inj = new simpleSQLinjectionDetect();
    $inj->detect();
    

    github で確認できます。 また

    これは非常にシンプルで基本的なクラスです。改善/更新の提案は大歓迎です:)



    1. Ubuntu20.04にClickHouseをインストールして構成する方法

    2. MySQLクエリは実行されますが、例外がスローされます

    3. タイムスタンプ(自動)はいつ更新されますか?

    4. SQLエイリアスの説明