Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Какво са магическите кавички?
  1. Какво са магическите кавички? - I
  2. Какво са магическите кавички? - II
blowfish
     
Автор  blowfish (10.08.2007 22:06)  съобщение до автора
Погледнат  4555 пъти  добави към любими
Оценка  добави коментар
Гласове  1  изпрати на приятел
Коментари  (4)  абонирай се за PHP
    Страница 1 / 2

 



Ако сте се занимавали с обработка на текстови данни от формуляри, сигурно вече сте се се сблъсквали с неприятния проблем около магическите кавички. Същността на проблема е в това, че когато конфигурационната директива magic_quotes_gpc е включена, енджина на PHP сам поставя "обезопасителни" наклонени черти преди всички кавички в стойностите на суперглобалните променливи $_GET, $_POST, $_COOKIE, $_SERVER и т.н.

Идеята за магическите кавички е възникнала в по-ранните версии на PHP, когато разработчиците на езика са се опасявали, че има твърде много неразумни "разработчици", които никога няма да извикат функцията addslashes() върху някой низ преди да го използват в SQL заявка например. За всички останали разумни хора магическите кавички са просто едно неудобство. Когато те са включени, и някой потребител въведе стойността "It's me" в дадено текстово поле на формуляр, то истинската стойност на променливата, когато тя бъде получена от обработващия PHP скрипт ще бъде "It\'s me". Добре написания PHP код не трябва да разчита на magic_quotes_gpc. Всички разработчици на езика насърчават хората да спрат да използват magic_quotes_gpc. Дори е планувано в PHP6 тази директива да бъде напълно премахната.

Как да ги предотвратим?

Сега следва да ви покажа няколко начина, чрез които можете да развалите "магията" на магическите кавички.

Първи начин: директно от php.ini

Ако сървъра е ваш или имате възможност да редактирате php.ini, тогава отворете този файл и просто напишете "Off" срещу директивата magic_quotes_gpc.

Втори начин: чрез .htaccess файл

Ако хоствате сайта си на споделен сървър, едва ли ще е възможно да редактирате php.ini. Но при повечето хостове е позволено да слагате .htaccess файлове във вашите директории. Напишете следното във файл, наречен ".htaccess":

CODE
1
php_flag magic_quotes_gpc "Off"

След това качете този файл в директорията, където са вашите PHP скриптове и така те вече няма да бъдат "омагьосвани" от магическите кавички.

Трети начин: динамично разваляне на магията по време на изпълнение

Сигурно някои от вас си задават въпроса: не може ли това да стане просто с един ред като този: ini_set("magic_quotes_gpc", 0)? Отговорът е НЕ. Ако се разровите в PHP документацията, ще видите, че директивата magic_quotes_gpc е от ниво PHP_INI_PERDIR|PHP_INI_SYSTEM. Това означава, че тя може да се променя по горните два начина, които вече обясних, но не и по време на изпълнение. Причината е в това, че енджина на PHP слага тези наклонени черти още преди изпълнението на скрипта, при регистрирането на суперглобалните променливи. Но както знаете няма невъзможни неща, и аз обичам да казвам, че когато нещо не може да се направи по стандартен начин, винаги е възможно да се заобиколи като се приложи някаква хитрост:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if (get_magic_quotes_gpc()) {
   
function traverse (&$arr) {
       
if (!is_array($arr))
           
return;
 
       
foreach ($arr as $key => $val) {
           
if (is_array($arr[$key])) {
               
traverse($arr[$key]);
           
} else {
               
$arr[$key] = stripslashes($arr[$key]);
           
}
        }
    }
   
$gpc = array(&$_GET, &$_POST, &$_COOKIE);
   
traverse($gpc);
}
?>



  Следваща страница >> 


Ключови думи: php mysql магически кавички формуляр


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: blowfish  
Благовест Буюклиев има 10+ години опит с програмирането на C/C++, 7+ години опит с PHP и обширни познания в съвременните Web технологии. Като програмист и проектант на софтуер най-много цени добре проектирания, оформен, документиран, логически издържан и ефективен код. Работил е за фирми в България и чужбина, последната му страст е проектиране и имплементация на TCP сървърни приложения за Linux. Чрез статииите си в it-place.net би искал да предаде част от знанието и опита си на максимално широк кръг хора в България.
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

Забрави за няколкото милисекунди повече при ползване на моя фрагмент на фона на 0.5s за по-сложна SELECT заявка например. Ясно е, че викаме stripslashes() върху елементи на суперглобалните масиви които въобще може да не ползваме, или пък ще ползваме но само с кавички и трябва след това обратно да викаме addslashes(). Естествено това влошава пърформанса но само с някакви си милисекунди, написал съм го в статията. Да не говорим, че пък ако магическите кавички са изключени или не се поддържат (възможно в PHP6), фрагмента въобще не се изпълнява и с нищичко не ти вреди на пърформанса, а твоя подход винаги ще вреди защото навсякъде в кода си ще извикваш малката функцийка.

Представи си сега, че имаме твоята функция:

CODE
1
2
3
4
5
6
7
function mySlashes ($str, $withSlashes) {
 
if ($withSlashes) {
   
return get_magic_quotes_gpc() ? $str : addslashes($str);
 
} else {
   
return get_magic_quotes_gpc() ? stripslashes($str) : $str;
 
}
}

И това те задължава да съобразяваш кода си заради малоумната настройка magic_quotes_gpc, независимо дали е включена или не:

CODE
1
2
$x = mySlashes($_GET['x'], true); // искаш го с кавички
$y = mySlashes($_GET['y'], false); // искаш го без кавички

а при моя подход имаш:

CODE
1
2
3
4
require_once "strip_gpc.php";

$x = addslashes($_GET['x']); // искаш го с кавички
$y = $_GET['y']; // искаш го без кавички

Исках да кажа, че при моя подход ще пишеш кода си така, все едно, че не съществува magic_quotes_gpc.

Донякъде е въпрос на стил и възприемане, няма нищо грозно и в твоя подход, но поне аз възприемам за по правилно да свикнеш да пишеш без въобще мислиш за малоумието magic_quotes_gpc, което скоро ще бъде изхвърлено от PHP.

  blowfish на 13.08.2007 14:14

CODE
1
2
3
4
5
6
7
<?php
....
 
$gpc = array(&$_GET, &$_POST, &$_COOKIE);
...
$title = addslashes($_GET["title"];
...
?>
Интересно защо трябва да викам 2 функции, като може да стане всичко с една!
Със функцията mySlashes(примерно ;)) става много по-бързо.
Дори и с ползването на str_replace() и после ползването на addslashes става по бързо.

И бъди спокоен не те задължава да спазваш нищо. Просто си викаш функцията и тя си работи на всеки хост без да се интересува от опциите за кавичките.

  PureEvil на 13.08.2007 10:45

Говорим за опция в езика която е deprecated. Не случайно съм подчертал, че след като сложите този фрагмент код може да забравите за магическите кавички защото това е еквивалентно на изключване. Правенето на малка функцийка която да вика addlashes/stripslashes, върху даден стринг в зависимост от това дали са включени маг. кавички пак е хитро, но отново те задължава да съобразяваш кода си заради magic_quotes_gpc като извикваш тази функцийка. Тук става въпрос за стил.

  blowfish на 12.08.2007 22:40

Четвърти начин: inis_set();

И сега какво е това безумие:
CODE
1
2
3
if (get_magic_quotes_gpc()) {
   
function traverse (&$arr) {
...

По-лесно, по-бързо, по-удобно е:
Пише се функция, която проверява дали да ползваш addslashes или не според статуса на 'магическите кавички'.

  PureEvil на 11.08.2007 18:48

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008