magic_quotes_sybase и addslashes

Wicked

Новичок
Фанат, да почему опять addslashes() ??!!!

Вот тебе пример из моей практики, который положит твой скрипт... всего лишь изменением одной переменной сервера:

PHP:
  print "magic_quotes_sybase = ".(int)ini_get("magic_quotes_sybase")."\n";
  //prints  magic_quotes_sybase = 1

  print "magic_quotes_gpc = ".(int)get_magic_quotes_gpc()."\n";
  //prints  magic_quotes_gpc = 1

  print (get_magic_quotes_gpc() ? $_GET["STR"] : addslashes($_GET["STR"]))."\n";
  //prints  _''_"_\_
  //если такое попадет в запрос - запросу п....ц

  print mysql_escape_string($_GET["STR"])."\n";
  //prints  _\'\'_\"_\\_
  //все дружно радуются
 

SiMM

Новичок
[m]addslashes[/m]
Экранируются одиночная кавычка ('), дойная кавычка ("), обратный слэш (\) и NUL (байт NULL)
Пардон, дошло
Если директива конфигурации magic_quotes_sybase имеет значение on, то символ ' будет экранироваться добавлением еще одного ' вместо \.
Пример надо было попроще ;)
PHP:
ini_set('magic_quotes_sybase',1);
echo addslashes('\'"\\');
PS: думаю, поправка в FAQ не помешает ;) addslashes вообще получается функцией на грани бесполезности :(
 

Фанат

oncle terrible
Команда форума
не понял юмора.
почему в четвертой строке unconditional mysql_escape_string?
Это шутка такая?
 

Wicked

Новичок
Да, я согласен, что там тоже нужно "() ? () : ()".

PHP:
  print "magic_quotes_sybase = ".(int)ini_get("magic_quotes_sybase")."\n";
  //prints  magic_quotes_sybase = 0

  print "magic_quotes_gpc = ".(int)get_magic_quotes_gpc()."\n";
  //prints  magic_quotes_gpc = 1

  print (get_magic_quotes_gpc() ? $_GET["STR"] : addslashes($_GET["STR"]))."\n";
  //prints  _\'_\"_\\_

  print mysql_escape_string($_GET["STR"])."\n";
  //prints  _\\\'_\\\"_\\\\_
  //сверхэкранирование
Вообщем более правильный вариант с точки зрения передачи строки в запрос:
PHP:
  print (get_magic_quotes_gpc() ? $_GET["STR"] : mysql_escape_string($_GET["STR"]))."\n";
  //prints  _\'_\"_\\_
  //независимо от magic_quotes_gpc и magic_quotes_sybase
-~{}~ 05.01.05 22:41:

Я согласен с SiMM, что для работы s MySQL addslashes гораздо более бесполезная, т.к. в зависимости от настроек PHP addslashes может не эскейпить слэшами, а это губительно для запросов
PHP:
//get-запрос = ...quote2.php?STR=_'_"_\_

print "magic_quotes_sybase = ".(int)ini_get("magic_quotes_sybase")."\n";
//prints  magic_quotes_sybase = 1

print "magic_quotes_gpc = ".(int)get_magic_quotes_gpc()."\n";
//prints  magic_quotes_gpc = 1

print $name = (get_magic_quotes_gpc() ? $_GET["STR"] : addslashes($_GET["STR"])); 
//prints  _''_"_\_ 
print "SELECT ... where username = '$name'";
//prints "SELECT ... where username = '_''_"_\_'";
//                                       ^ошибка
 

Фанат

oncle terrible
Команда форума
во-первых, mysql_real_escape_string
Во-вторых, при включенных сибейзах последний вариант не прослешит.
в-третьих, при включенных сибейзах напихаются лишние кавычки.
ох и мороки ты задал...
 

Фанат

oncle terrible
Команда форума
print (get_magic_quotes_gpc() ? $_GET["STR"] : mysql_escape_string($_GET["STR"]))."\n";
при включенных сибейзах не прослешит
print mysql_escape_string($_GET["STR"])."\n";
при включенных гпц испортит
 

Wicked

Новичок
А, ну да %)
значит нужно как-нибудь так:
PHP:
function mysql_escape_gpc ($str) {
  if (get_magic_quotes_gpc()) {
    $str = stripslashes($str);
    //убираем то, что было добавлено автоматом при обработке G, P и C, будь то слэши или удвоение кавычек.
  }
  return mysql_escape_string($str);
  //возвращаем строку, которая заэскейплена именно слэшами
}
Надеюсь идея понятна...
 

Фанат

oncle terrible
Команда форума
Вот и я о том же.
в общем, получается, что надо избавляться от кавычек, вырубая волшебные и проверяя и очищая ввод в начале скрипта.
А квотить только там, где надо - при составлении запроса.


только это опять гимор =((((((((((((((((((
 

SiMM

Новичок
Фанат, да а чего гимор то? Напускаем как всегда по необходимости strips, затем забываем о существовании addslashes (пользуя соответственно mysql_real_escape_string) и stripslashes (он уже своё отработал в strips) как об абсолютно бесполезных, используя addslashes разве что при работе с Sybase, предварительно сделав ini_set('magic_quote_sybase',1); - да собственно ты и сам это выразил (просто гимора вроде нет? или где-то спрятался? ;) ) - по мне так намного проще, не надо помнить, где есть слэши, а где их ещё нет.
Ну и собственно вроде всё.
 

Wicked

Новичок
SiMM, гемор в том, что в начале работы скрипта нужно прострипать все, что пришло в $_GET, $_POST, $_COOKIES, ...
А они, как известно, могут быть массивами, так что их тогда нужно рекурсивно обходить и везде стрипать...
А если это большой объем данных (мало ли чего в $_POST запихать могут), то оно к тому же будет тормозить все скрипты...

Ессно, это один из вариантов...
 
All
А как лучше:
1. Как сказал Wicked - т.е. делать корректными для запросов все переданные скрипту данные перед его запуском.
2. Или же делать проверку каждой строковой переменной, непосредственно перед ее применением?

imxo - второй вариант предпочтительнее, т.к. действительно, фиг его знает какие могут быть переданы данные?
 

Фанат

oncle terrible
Команда форума
никаких проверок строковых переменных делать не надо.
надо просто составлять запрос в соответствии с правилами.

и отрубать автоматические кавычки.
 
Фанат
Т.е. выключить magic_quotes + в запросах использоваьть ~ следующюю конструкцию?
PHP:
mysql_query( "select * from table1 where id='".mysql_escape_string($_POST["id"])."';" );
 

Wicked

Новичок
Yurik, с чего вдруг необратимая? :\
ты тестировал stripslashes при разных значениях magic_quotes_sybase?

по-моему все как раз наоборот.
 
Сверху