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

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

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

Против

php_flag magic_quotes_gpc off
16.12.2008 01:57:32
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

14
17.12.2008 16:18:08

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

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

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

2
16.12.2008 04:01:54
Я изменил этот код сейчас - я обычно делал то, что вы сказали, но это была просто ошибка копирования и вставки. :)
nickf 16.12.2008 02:11:48
Я изменил свой ответ в соответствии с вашими изменениями;)
Eran Galperin 16.12.2008 02:22:49
почему вы используете mysql_real_escape_string вместо PDO?
Tom 16.12.2008 02:46:21
SQL-инъекции вообще не подходят для вопроса, только магические цитаты. Я предлагаю вам удалить этот абзац, чтобы избежать путаницы.
strager 16.12.2008 03:12:15
magic_quotes_gpc была введена в качестве меры защиты от SQL-инъекций. При отключении важно знать, как правильно убегать.
Eran Galperin 16.12.2008 03:45:54

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

4
16.12.2008 02:48:44
В некоторых случаях вы не можете изменить настройки администратора (например, при использовании удаленного, дешевого / бесплатного хоста).
strager 16.12.2008 03:09:12

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

1
16.12.2008 02:56:37