Обойти волшебные цитаты или просто убедиться, что они отключены?

Стоит ли менять мой код, чтобы он был «более портативным» и мог справиться с ужасом волшебных цитат, или я должен просто убедиться, что он всегда отключен через файл .htaccess?

if (get_magic_quotes_gpc()) {
    $var = stripslashes($_POST['var']);
} else {
    $var = $_POST['var'];
}

Против

php_flag magic_quotes_gpc off

person nickf    schedule 16.12.2008    source источник


Ответы (4)


Не допускайте обеих ситуаций. Два пути кода = вдвое больше головной боли, плюс есть хороший шанс, что вы ошибетесь и забудете где-нибудь уладить обе ситуации.

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

В наши дни я пишу код так, как будто волшебные кавычки отключены, и в моем основном файле include / bootstrap / always-run я проверяю, включены ли волшебные кавычки. Если они включены, я генерирую исключение, в котором объясняется, почему это плохо, и даю инструкции, как их можно отключить.

Этот подход позволяет вам кодировать одно поведение, поощряет других людей, использующих ваш код, правильно настраивать свои серверы (волшебные кавычки исчезают в PHP 6), и если кому-то действительно нужны волшебные кавычки, они могут справитесь со своим исключением и возьмите их жизнь в свои руки.

person Alan Storm    schedule 16.12.2008

Я бы проверил настройку с помощью get_magic_quotes_gpc() и сделал бы большой шумный выход с ошибкой. В случае ошибки сообщите администратору о правильной настройке.

person Zan Lynx    schedule 16.12.2008
comment
Бывают ситуации, когда вы не можете изменить настройки администратора (например, при использовании удаленного, дешевого / бесплатного хоста). - person strager; 16.12.2008

Я бы позаботился о том, чтобы он был выключен, если это возможно (требуется доступ к конфигурации .htaccess или apache). Лучше вообще этого избежать, чем избавляться от такого поведения, которое требует больше ресурсов и подвержено ошибкам.

Если отключение не является вариантом, ваш пример кода может быть полезен для входных суперглобалов ($ _GET, $ _ POST, ...), но не применяйте его к данным, поступающим из источников, отличных от этих суперглобальных. Такое злоупотребление довольно распространено.

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

person Eran Galperin    schedule 16.12.2008
comment
Я изменил этот код сейчас - я бы обычно делал то, что вы сказали, но это была просто работа копирования и вставки, которая пошла не так. :) - person nickf; 16.12.2008
comment
Я изменил свой ответ в соответствии с вашими изменениями;) - person Eran Galperin; 16.12.2008
comment
почему вы используете mysql_real_escape_string вместо PDO? - person Tom; 16.12.2008
comment
SQL-инъекции вообще не имеют отношения к вопросу, только волшебные кавычки. Я предлагаю вам удалить этот абзац, чтобы избежать путаницы. - person strager; 16.12.2008
comment
magic_quotes_gpc был введен как мера защиты от SQL-инъекций. При его отключении важно знать о правильных средствах экранирования. - person Eran Galperin; 16.12.2008
comment
@tom: это не совсем проблема, но я добавил его в ответ, чтобы сделать его более полным - person Eran Galperin; 16.12.2008

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

person corymathews    schedule 16.12.2008