Где использовать mysql_real_escape_string для предотвращения SQL-инъекций? - PullRequest
12 голосов
/ 22 февраля 2010

У меня проблемы с группой хакеров. они взламывали сайт моего клиента несколько раз, и мой клиент становился все более злым :( мой клиент потерял свою базу данных (в которой сотни записей), и ему пришлось ввести все :(

теперь я следую еще за некоторыми введениями;

  • фиксированные права доступа к файлу
  • изменен ftp и информация для входа на хост
  • очистил все удаленные доступы MySQL

теперь работает над проблемой SQL-инъекций. Я добавил mysql_real_escape_string в параметры входа в админ-панель. Так, где еще я должен использовать эту mysql_real_escape_string? У меня есть несколько форм электронной почты на сайте, я не думаю, что мне нужно добавлять туда ...

У меня есть index.php в качестве главной страницы. Должен ли я сделать что-нибудь для этой страницы, чтобы предотвратить любую SQL-инъекцию через URL, например index.php?somesql=?

Пожалуйста, сообщите мне! Я очень ценю !!! (


например:

У меня есть такой код;

public function showDetails($id) {

    // SQL Jobs Details
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id);
    $this->rst_job = mysql_query($this->sql_job);           
    $this->row_all = mysql_fetch_assoc($this->rst_job);     

    // SQL State
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']];
    $this->rst_state = mysql_query($this->sql_state);   
    $this->row_state = mysql_fetch_assoc($this->rst_state);
........

достаточно ли использовать mysql_real_escape_string для $ id. не для $ this-> row_all [$ this-> tbl_jobs ['f4']]

Ответы [ 4 ]

13 голосов
/ 22 февраля 2010

По сути, каждый раз, когда вы используете некоторые небезопасные данные (пользовательский ввод, значение из базы данных, файл или внешний веб-сайт, т.е. любые данные, которые вы не 100% уверены, что они безопасны) в SQL-запрос, вы должны избежать его, используя mysql_real_escape_string . Обратите внимание, что в соответствии с OWASP , эта функция небезопасна для экранирования имен динамических таблиц (но это гораздо реже, чем «базовая» вставка пользовательского ввода).

Я предлагаю вам взглянуть на всю статью OWASP об SQL-инъекциях , а также просмотреть остальную часть сайта. Это отличный источник информации о безопасности в веб-приложениях.

IMO, предпочтительным способом предотвращения внедрения SQL-кода является использование подготовленных операторов .

Пожалуйста, помните, что если вы решите использовать mysql_real_escape_string(), это работает только тогда, когда используется внутри строки, которая ограничена кавычками. Никогда не используйте его на любые значения без кавычек. Это включает в себя числовые значения; вместо этого проверьте, что пользовательский ввод на самом деле является числовым.

4 голосов
/ 22 февраля 2010

Две большие вещи, которые нужно сделать с пользовательским вводом:

  1. Входная фильтрация
  2. Выходной выход

Входная фильтрация - это процесс преобразования данных / [до] / они хранятся в базе данных. Выполнение mysql_real_escape_string() подпадает под этот шаг (хотя есть более эффективные способы очистки пользовательских данных для вставки БД), но этот шаг может также включать обрезку пробелов, фильтрацию ненормативной лексики, преобразование разметки и многое другое.

Выход Escapeing заботится о том, чтобы при отправке пользовательского контента в браузер вы не допускали злонамеренного поведения. Это означает выполнение htmlentities() или некоторый другой процесс выборочного скрининга.

Есть и другие вещи, которые вы можете сделать, такие как регулирование ресурсов (предотвращение DOS), токены форм (защита CSRF) и т. Д. Перейдите к OWASP и начните чтение.

3 голосов
/ 22 февраля 2010

Лучший способ предотвратить внедрение SQL-кода - использовать подготовленные операторы и переменные связывания. Какую версию MySQL вы используете? Подготовленные заявления доступны в версии 4.1 и выше.

3 голосов
/ 22 февраля 2010

Одним из золотых правил веб-разработки является НИКОГДА (НИКОГДА!) Доверие пользователей. Поэтому, где бы вы ни находились в базе данных, вы должны вызывать mysql_real_escape_string ().

Кроме того, чтобы предотвратить недовольство клиентов в будущем, вы должны регулярно делать резервные копии своей базы данных. Если бы я был вашим клиентом, я был бы в ярости прямо сейчас.

Удачи в защите вашего сайта.

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