Ошибки, связанные с «Magic Quotes»


В предыдущей главе мы уже описывали особенность РНР, которая известна под названием «Magic Quotes» (или, точнее сказать, не известна, а пользуется дурной славой). Например, когда вы передаете в скрипт переменную с помощью метода POST или GET, и эта переменная содержит символы " или \ то часто РНР автоматически маскирует эти символы, то есть вставляет перед ними обратную косую черту.

На первый взгляд это кажется разумным и оправданным, так как для РНР символы " или ' служат в качестве служебных символов, которые используются для обозначения начала и конца символьной строки. Если же нам необходимо, чтобы переменная содержала эти служебные символы, которые в данном случае уже не обозначают начало и конец строки, и необходимо записать это значение в базу данных, то мы должны ставить перед служебными символами знак \, то есть " превращается в \\ При этом программист, использующий РНР, должен заменить эти символы во всех переменных, которые с помощью методов GET или POST передаются для сохранения в базе данных. Естественно, возникает желание избавить программиста от такой рутинной работы и автоматизировать процесс, который отвечает за маскирование служебных символов.

Звучит достаточно убедительно, однако такой подход может приводить к совершенно фатальным последствиям. Основная проблема заключается в том,
что РНР может самостоятельно, без всякого контроля со стороны программиста, изменить значение переменной. Другими словами, в этом случае вы просто не можете быть уверены, какое значение имеет переменная, введенная пользователем с помощью диалоговой формы.

Ситуация остается предсказуемой, когда все версии РНР ведут себя в этом отношении одинаково. Вы просто учитывали бы эту особенность и всегда вносили бы необходимые коррективы. Однако все не так просто - то, как РНР обрабатывает эти специальные символы, зависит от индивидуальных настроек РНР. А это означает, что даже если скрипт без каких-либо проблем работает на одном сервере, то на другом сервере при его работе могут возникать ошибки.
Благодаря этому, вы можете благополучно отладить и протестировать ваш скрипт для ввода данных на локальном компьютере и столкнуться с тем, что скрипт полностью перестает работать на Web-cepBepe.

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

Давайте детально рассмотрим проблему на примере небольшой программы.

1. Создадим новый РНР-файл с именем test.php, который просто принимает переданное с помощью GET значение и выводит его на экран:

<?
$test = $_GET ['test'];
echo $test;
?>

2. Давайте теперь вызовем этот скрипт и передадим ему значение, которое содержит такие символы, как", \ или ', например:
test.php?test="This is the 'Test'."

3. В зависимости от той версии РНР, которая установлена на сервере, наш небольшой скрипт может выдавать совершенно различные результаты. Если активирована функция Magic Quotes, то все кавычки будут замаскированы, и вы увидите на экране следующее:
\"This is the \'Test\'.\";

4. Если же эта функция деактивирована (в «Денвере» по умолчанию она именно выключена), то на экран будет выведен совершенно другой текст - а именно в точности тот текст, который вы передавали с помощью GET:

"This is the 'Test'.'';

Итак, коротко суммируем все вышесказанное - функция Magic Quotes на самом деле является не каким-то волшебным инструментом, а достаточно обременительной и ненадежной опцией, которая может исказить истинное значение переменной (рис. 8.2).
Знаки пробела в URL.

Использование знаков пробела в URL запрещено - они должны заменяться на символы %20. Это правило действует для всех параметров, которые передаются с помощью GET. В большинстве случаев браузер способен самостоятельно внести необходимые корректировки перед тем как вступать в контакт с Web-сервером. Если же этого не происходит, вам придется внести все необходимые изменения самостоятельно.

 


Тэги:

Комментарии: 0

Прокомментировать »

 
 
 

Прокомментировать

 
 
Сообщение *
 
Проверочный код *
 
 
 
Яндекс.Метрика