Htmlentities по сравнению с addslashes по сравнению с mysqli_real_escape_string

Я делал некоторое чтение при обеспечении приложений PHP, и это кажется мне этим mysqli_real_escape_string корректная функция состоит в том, чтобы использовать при вставке данных в таблицы MySQL потому что addslashes может вызвать некоторые странные вещи произойти для умного взломщика.Правильно?

Однако существует одна вещь, которая смущает меня. Я, кажется, не забываю сообщаться addslashes лучше, чем htmlentities при повторении вводимых пользователями данных назад пользователям для защиты их данных но это походит addslashes тот с уязвимостью. Действительно ли это верно, или я помню неправильно?

7
задан waiwai933 6 February 2010 в 18:43
поделиться

7 ответов

Существуют разные контексты для ваших данных. Контекст вставки данных в базу данных необходимо экранировать иначе, чем контекст отрисовки html / xml или даже сообщения электронной почты.

Экранирование данных, идущих в базу данных, должно быть устаревшим во всем новом коде в пользу подготовленных операторов. Любой, кто говорит вам обратное, оказывает вам медвежью услугу.

Экранирование данных, идущих в браузер, необходимо экранировать различными способами в зависимости от цели. Иногда достаточно htmlspecialchars, иногда нужно использовать htmlentities. Иногда вам нужны числовые объекты. Это тема, которую вам следует изучить, чтобы узнать все нюансы.

Общее правило, по которому я живу, - это проверка (не фильтрация, отклонение в случае ошибки) ввод и вывод вывода (в зависимости от контекста).

5
ответ дан 6 December 2019 в 11:49
поделиться

Вы также можете использовать библиотеки PDO , которые выполняют большую часть экранирования за вас, в случае, если вы можете использовать PHP5 на серверы.

В ответ я бы предпочел htmlspecialchars, но меня можно поправить

0
ответ дан 6 December 2019 в 11:49
поделиться

Примечание. Следует избегать использования htmlentities () в документе с кодировкой UTF-8. См .:

Обратите внимание на (цитата из phpwact.org ):

С современными веб-браузерами и Widespead поддерживает UTF-8, вам не нужны htmlentities, потому что все эти символы могут быть представлены непосредственно в UTF-8. Что еще более важно, в целом только браузеры поддерживают специальные символы HTML - например, обычный текстовый редактор не знает объектов HTML. В зависимости от того, что вы делаете, использование htmlentities может снизить способность других систем «потреблять» ваш контент.

Также (не подтверждено, но звучит разумно - из анонса здесь), символьные сущности (например, »или -) не работают, когда документ обслуживается { {1}} как application / xml + xhtml (если вы не определите их). Тем не менее, вы все равно можете обойтись без числовой формы.

0
ответ дан 6 December 2019 в 11:49
поделиться

Вы не можете иметь одну функцию "escape" и ожидать, что она будет работать все время. Существуют различные атаки, требующие определенных процедур очистки. Единственный способ понять эту концепцию - написать уязвимый код, а затем использовать его. Написание кода эксплойта жизненно важно для понимания любой системы безопасности.

Например, этот запрос уязвим для внедрения Sql:

$host=htmlspecialchars($_GET[host],ENT_QUOTES);
$name=htmlspecialchars($_GET[name],ENT_QUOTES);
mysql_query("select * from user where Host='$host' and Name='$name' ");

Эксплойт: http: //localhost/sqli_test.php? Host = \ & name =% 20sleep (20) - -% 201

Лучшая escape-функция для mysql - это mysqli_real_escape_string (), но это может привести к сбою:

mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));

exploit: http: //localhost/sqli_test.php? Id = 1% 20or% 20sleep (20)

На самом деле лучший способ позаботиться о внедрении sql - это не вызов функции escape, а использование параметризованных запросов ADODB для внедрения sql. Используйте htmlspecialcahrs ($ var, ENT_QUTOES) для XSS. Прочтите OWASP top 10 , потому что с безопасностью веб-приложений есть гораздо больше, чем может пойти не так, как надо.

0
ответ дан 6 December 2019 в 11:49
поделиться

Также можно попробовать библиотеку FreeImage . Она поддерживает загрузку различных типов изображений и функционально похожа на DevIL, может сработать для вас.

А что касается вашей проблемы с DevIL, вам не нужно создавать библиотеки ilu или ilut, чтобы сделать DevIL работоспособным. Рекомендуется самостоятельно управлять объектами текстуры OpenGL, включая загрузку данных изображения на сторону OpenGL.

-121--3461054-

Лучший ход я сделал из Java в PHP.

Остерегайтесь сложности. В первую очередь ключом к отличному программному обеспечению является простота, и именно поэтому PHP в сочетании с хорошей структурой убивает Java.

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

Редактирование: Инструменты в стороне, Java и PHP очень аналогично структурированы «C» языков стиля. Гораздо больше, чем Пайтон или Руби. Именно статическая типизация и сложные инструменты делают Java таким чужим.

-121--1119790-

Это разные инструменты для разных целей.

mysqli _ real _ побег _ последовательность делает данные безопасными для вставки в MySQL (но параметризованные запросы лучше).

Htmlentities делает данные безопасными для вывода в HTML-документ

addslashes делает данные безопасными для нескольких других ситуаций, но недостаточными для MySQL

12
ответ дан 6 December 2019 в 11:49
поделиться

Да, используйте mysqli_real_escape_string или библиотеку, такую ​​как PDO, для всего пользовательского ввода. При ответе я использую htmlentities с ENT_QUOTES в качестве второго параметра, поскольку он экранирует все применимые символы для их html-сущностей, включая кавычки.

0
ответ дан 6 December 2019 в 11:49
поделиться

Другим интересным решением для PHP 5.2 и выше является использование расширения фильтра: http://www.php.net/manual/en/book.filter.php

Оно позволяет проверять и дезинфицировать пользовательские входы. Существует множество встроенных фильтров, которые можно комбинировать с флагами для изменения их поведения. Кроме того, hese-фильтры могут быть использованы для проверки/санкционирования входных данных, флотов, писем, специфических регулярных выражений.

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

0
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: