Magic quotes - дроби замість лапок на сайті

Magic quotes - дроби замість лапок на сайті
Магічні лапки (Magic Quotes) в PHP

У даній статті PageRanker.Ru розповість початківцям, а також тим, хто вже має досвід програмування на PHP, про так званих «магічних лапках».

Якщо у Вас на сторінках сайту невірно відображаються введені дані - лапки замінюються багаторазовими дробом або використання посилань не представляється можливим, проблема найімовірніше у використанні функції magic quotes

Що таке Magic Quotes?

Якщо ми подивимося у себе в php.ini, то знайдемо там три директиви:
magic_quotes_qpc
magic_quotes_runtime
magic_quotes_sybase

Кожна з них може бути включена (On), або вимкнена (Off).

Ці вимоги відповідають за екранування спецсимволов в різних даних, що надходять в php-скрипт і виводяться з php-скрипта.

magic_quotes_qpc

Якщо директива magic_quotes_qpc включена, то екрануються спецсимволи з наступних джерел: $ _GET, $ _POST, $ _REQUEST, $ _COOKIE, $ _ENV (в PHP4). До речі, на кінці імені цієї директиви абревіатура GPC саме від GET / POST / COOKIE.

Наприклад, якщо в одному з цих джерел виявиться такий елемент, як одинарна лапка ( '), лапки ( "), зворотний слеш (\) або NULL-символ, то цей елемент буде автоматично екранований зворотним слешем:

echo $ test; // виведе: \ '123 \'

Magic quotes - дроби замість лапок на сайті
Таким чином, якщо ми хочемо записати дані з $ _REQUEST в базу MySQL наприклад, то нам не потрібно екранувати лапки функцією addslashes, тому що вони вже будуть заекраніровани. Але якщо magic_quotes_gpc відключена, то екранувати потрібно примусово:

if (! get_magic_quotes_gpc ()) $ test = addslashes ($ test);
>

mysql_query ($ res, "INSERT INTO test_table (test) VALUES ($ test)");

Як бачите тут я використовував функцію get_magic_quotes_gpc для перевірки стану директиви magic_quotes_gpc. Якщо директива в вимкненому стані, то я екранують змінну $ test. В іншому випадку екранувати не можна, тому що вийде подвійне екранування. Тобто якщо magic_quotes_gpc включена, то:

echo $ test; // виведе: \\\ '123 \\\'

Тобто ми заекраніруем заекранувати

Директива magic_quotes_gpc екранує тільки одинарні лапки, якщо включена також директива magic_quotes_sybase. Причому екранує вона одинарні лапки одинарною лапкою:

echo $ test; // виведе: "123"

magic_quotes_runtime

Якщо включена ця директива, то більшість функцій, які повертають дані з бази наприклад або текстових файлів, повертатимуть заекранувати текстові дані. А якщо в добавок включена директива magic_quotes_sybase, то екрануються тільки одинарні лапки, причому не зворотним слешем, а такий же одинарною лапкою.

magic_quotes_sybase

Ця директива в доважок до двох попередніх, як було вже сказано, просто змінює правило екранування одинарної лапки і відключає екранування інших символів (подвійний лапки, зворотного слеша і NULL-символу).

Особисто я не розумію, для чого потрібно екранувати лапки ще однієї лапками. Але мабуть це колись було потрібно.

Як їх все враховувати?

Почну з того, що директиви magic_quotes_runtime і magic_quotes_sybase можна вмикати / вимикати прямо в PHP-скрипт:

ini_set ( 'magic_quotes_runtime', 0);
ini_set ( 'magic_quotes_sybase', 0);

І це я рекомендую робити всім.

Рішенням проблеми з відображенням дробів на сайті може бути саме відключення функції magic quotes через системний файл .htaccess

А ось значення директиви magic_quotes_qpc можна встановити тільки в php.ini. htaccess або httpd.conf. Але найчастіше хостинг-провайдер дає нам редагувати тільки .htaccess, та й то не завжди. Тому тут висновок один: потрібно просто враховувати значення magic_quotes_qpc при роботі скриптів, щоб не було зайвих екранування, або навпаки, недоекранірованій Якщо ця директива вимкнена, то використовувати addslashes над вводяться ззовні даними (із зазначених раніше джерел).

За умови звичайно, що інші дві директиви в стані Off.

Буває і таке, що хостинг-провайдер блокує функцію ini_set. В цьому випадку потрібно перевіряти значення директив за допомогою ini_get. І якщо значення нас не влаштовують, то краще звернутися в техпідтримку хостингу з проханням відключити ці директиви.

Як відключити magic quotes?

Щоб відключити магічні лапки

  1. створи в директорії файл .htaccess (обов'язково починається з точки)
  2. встав в ного наступний рядок: php_flag magic_quotes_gpc off
  3. залий на сервак

Якщо хостинг-провайдер дозволив використання файлу .htaccess, то все повинно вийти.

Щоб перевірити спрацювало чи ні

  1. створюєш PHP-файл з рядком
  2. заливаєш на сервак, запускаєш його
  3. шукаєш параметр magic_quotes_gpc. в стовпці Local Value повинно бути OFF

Як відключити magic quotes через .htaccess?

Якщо сервер Вашого веб-ресурсу знаходиться на Apache, найпростішим вирішенням проблеми з магічними лапками буде додавання даного коду в системний файл .htaccess:


php_value magic_quotes_gpc off

Magic Quotes - це звичайно застарілі речі, але не враховувати їх небезпечно в нинішній ситуації, поки світ не перейде на PHP6.