Вопрос по предотвращению SQL с отключенным magic_quotes и XSS с htmlentities - PullRequest
2 голосов
/ 25 августа 2011

На моем сервере у меня отключены magic_quotes.Когда пользователь сохраняет содержимое как статью в моей БД из формы, я использую

$text = mysql_real_escape_string($_POST['text']); для предотвращения SQL-инъекций.

Это мой ввод <img src="image.png"></img>, и это то, что он сохраняется в БД <img src="image.png"></img>

Когда я echo htmlentities($row['text']); я печатаю <img src="image.png"></img> на экране, при просмотре источника Iget &lt;img src=&quot;image.png&quot;&gt;&lt;/img&gt;.

Мои вопросы

  1. Не предполагается сохранять в БД, как <img src=\"image.png\"></img> для предотвращения SQL-инъекций?
  2. Является ли htmlentities является хорошим кандидатом для предотвращения атак XSS?
  3. Стоит ли включать magic_quotes?

Ответы [ 4 ]

2 голосов
/ 26 августа 2011

Не предполагается сохранять в БД, например, <img src=\"image.png\"></img> для предотвращения SQL-инъекций?

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

Является ли htmlentities хорошим кандидатом для предотвращения атак XSS?

Да, но htmlentities() хорошо дляотправка данных в виде вывода в браузер, а не для сохранения их в базе данных (поскольку данные из БД могут использоваться для чего-то другого, кроме веб-страницы).

Должен ли я включить magic_quotes?

Нет, вы должны использовать подготовленные заявления.

0 голосов
/ 25 августа 2011
  1. Похоже, ваши магические цитаты включены.Проверьте это.
  2. Есть много статей по этому поводу, но для быстрого запуска не разрешайте использовать javascript и внешние изображения.
0 голосов
/ 25 августа 2011

Получение экранированных данных из базы данных предполагает, что они экранированы дважды - у вас в PHP включен magic_quotes_gpc? Если вы хотите очистить HTML и разрешить только определенные конструкции, которые вы указали, то я предлагаю использовать HTMLPurifier , который получится настолько строгим или слабым, насколько вы захотите.

0 голосов
/ 25 августа 2011

Используйте mysql_real_escape_string и верните кавычки в нормальное состояние:

$text = str_replace('\"', '"', $row['text']); // Alternative one
$text = preg_replace("/X/", '"', $row['text']); // Alternative two. X needs to be \\", \\\" or \\\\", perhaps \\\\\"

Ответы на обновленные вопросы:

Правильное сохранение данных выглядит так:

input -> php -> mysql_real_escape_string -> db -> php -> htmlspecialchars -> browser

...