PHP codeigniter SQL-инъекция (MSSQL) [дубликат]

Oct 27 2020

Я получал отчет, показывающий, что в моем запросе есть SQL-инъекция, вам потребуется ваша помощь, чтобы проверить некоторые проблемы:

  1. Я использовал это как оператор вставки
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

например:

$name = 'iamklll'; $status = 1;

  $insert_data = array( 'name' => $name,
                'status' => $status, ); $this->model->insert('table', $insert_data);  

Такой метод не может предотвратить SQL-инъекцию? Если это не может предотвратить, я думаю, лучший способ - привязки запросов?

  1. Как предотвратить SQL-инъекцию, если $ POST ['column'] является массивом?

  2. Как хранить данные, как будто человек вставляет test"><h1>eee</h1>? Следует использовать htmlspecialcharsдля хранения в базе данных?

Ответы

marcogmonteiro Oct 27 2020 at 18:13

В вашем случае вы используете построитель запросов $ this-> db-> insert (), он генерирует строку вставки на основе предоставленных вами данных и запускает запрос. Вы можете передать в функцию массив или объект. Все значения экранируются автоматически, создавая более безопасные запросы.

На мой взгляд, это лучший вариант. Лучше, чем использовать привязки запросов, особенно потому, что в конечном итоге вам может потребоваться перейти с MSSQL на mySQL или любой другой движок, и вам не нужно будет ничего менять в своем коде.

Поскольку вы используете codeigniter 3, обязательно проверьте свои данные перед их вставкой.

Используйте для этого проверку формы: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

Из вашего примера я думаю, что вы также имеете в виду атаки xxs. Если это так, у вас есть два варианта, вы можете сделать это при проверке данных с помощью проверки формы с использованием правила XSS. Или вы можете активировать это глобально в своем приложении / config / config.php

$config['global_xss_filtering'] = true;

Поскольку мы говорим о защите вашего приложения, вы также можете рассмотреть возможность использования настроек csrf в codeigniter. Это также можно сделать в вашем файле config.php.

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
 */
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();

Итак, в вашем случае использование построителя запросов вполне может предотвратить SQL-инъекцию того, что вы на самом деле ищете.

Yevgen Oct 27 2020 at 18:05

Вы имеете в виду класс Active Record. У него есть собственный конструктор запросов, и он должен защитить вас от SQL-инъекций из коробки.

How to store the data as if the person insert test"><h1>eee</h1>

Я думаю, вы имеете в виду XSS-атаку. Я считаю, что лучше всего вырезать все теги, кроме допустимых . Я не думаю, что здесь htmlspecialcharsбудет много смысла, пока вы собираетесь выполнять обратное преобразование на выходе.