PHP обнаруживает попытку внедрения SQL - PullRequest
0 голосов
/ 28 апреля 2018

Мой код уже безопасен, использует параметры в запросах SQL, но я хотел бы обнаружить, если попытается вставить что-то в форму отправки.

Я нашел Snort, но мне нужно что-то на уровне сценариев PHP, а не вся сеть.

Это сайт, который содержит личную информацию для студентов, и поэтому мы будем предупреждать (или даже принимать меры против) любого, кто даже попытается атаковать.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Это на самом деле довольно сложная тема. BillyK может иметь полупостоянный подход, но лучше позволить MySQL выполнить тяжелую работу за вас; поэтому:

  • 1) Выполнить пользовательский (т.е. небезопасный ) запрос в MySQL Транзакция .
  • 2) Сколько результатов это дает? (Проверьте, возвращены ли строки и затронуты ли строки )
  • 3) Запишите все журналы предупреждений об ошибках MySQL.
  • 4) Отмена / откат транзакции. Так что ничего не изменилось в вашей базе данных.
  • 5) Повторно выполнить запрос с параметризованной переменной (т. Е. safe )
  • 6) Сколько результатов это дает? (Проверьте, вернулись ли обе строки и затронуты ли строки )
  • 7) Проверьте, дает ли (6) различное количество результатов для (2) или (5) выдает какие-либо предупреждения об ошибках SQL. Вы также можете использовать функции сравнения массивов PHP , чтобы проверить, равны ли результирующие наборы.
  • 8) Появляются любые положительные результаты, такие как различия в подсчете результатов, эквивалентности набора результатов или предупреждениях SQL, а затем записывают эту строку запроса в файл сохранения для проверки человеком.

Концепция Мысли:

При правильно реализованной системе подготовленных операторов внедрение SQL-кода из пользовательских переменных в виде строк data невозможно. Поэтому скорее как люди, бросающие водяные шары в резервуары; также довольно бесполезно пытаться «обнаружить» эти нарушения; сами по себе они не показывают вам ничего, кроме того, что кто-то читает какой-то сайт, предлагающий такие методы.

Следовательно, если вы правильно построили свой PHP / SQL, то любое число или любое качество попыток SQL-инъекций - это всего лишь воды из утки , и вы кумулятивно тратите больше вычислительной мощности и времени и Попытка обнаружить и записать их, чем просто игнорировать их.

0 голосов
/ 17 декабря 2018

Я создал очень простой и простой класс PHP для проверки / обнаружения попыток внедрения SQL.

<?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 также

Это очень простой и базовый класс. Любые предложения по улучшению / обновлению приветствуются:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...