прошу поглядеть интересующихся PHPFAQ slashes

fisher

накатила суть
>>извиняюсь за назойливость, но у меня, всё-таки просьба к
>>последним критиковавшим, посмотреть новую версию и
>>сказать - всё ли там на их взгяд правильно?

по крайней мере правильнее чем было. про биндинг не соглашусь, все-таки стоит добавить, для многих других баз это просто основы, обязательные для faq. кстати, в mysqli и PDO эти функции есть
 

SiMM

Новичок
PHP:
strips_real($temp = array(&$_GET, &$_POST, &$_FILES, &$_COOKIE, &$_REQUEST));
Красота :)
А насчёт $_SERVER['PHP_AUTH_USER'] можно добавить
PHP:
if (isset($_SERVER['PHP_AUTH_USER']) && PHP_VERSION<5)...
 

Фанат

oncle terrible
Команда форума
все-таки стоит добавить, для многих других баз это просто основы, обязательные для faq.
Буду благодарен, если кто-нибудь напишет. Самому не хвататет кругозора.
 

SiMM

Новичок
Очепятка
Так же он реализован в новом расширении php для работы с mysql: mysqli, и в популярной библиотеке для работы с БД, PEAR::DB
и ссылка, соответственно, тоже.
 

Wicked

Новичок
Получите, распишитесь...

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

использую Zend Studio Server 5.1 (PHP Version 4.4.1).

PHP:
<?php

  print "magic_quotes_gpc=".intval(ini_get("magic_quotes_gpc"));

  print "<pre>";
  print htmlspecialchars(print_r($_GET, 1), ENT_QUOTES);
  print "</pre>";

?>
<form method="get">
  <input type="text" name="text1_&#039;&quot;[key1_&#039;&quot;][key2_&#039;&quot;]" value="val1_&#039;&quot;" />
  <input type="text" name="text2_&#039;&quot;" value="val2_&#039;&quot;" />
  <input type="submit" />
</form>
этот вот код умеет генерить следующий аутпут (форма не включена):
1) тут все ок:
Код:
magic_quotes_gpc=0
Array
(
    [text1_'"] => Array
        (
            [key1_'"] => Array
                (
                    [key2_'"] => val1_'"
                )
        )
    [text2_'"] => val2_'"
)
2) а тут начинается веселье:
Код:
magic_quotes_gpc=1
Array
(
    [text1_'"] => Array
        (
            [key1_\'\"] => Array
                (
                    [key2_\'\"] => val1_\'\"
                )
        )
    [text2_'"] => val2_\'\"
)
есть мысли, почему первоуровневые ключи не эскейпятся, а остальыне - эскйпятся?

-~{}~ 15.03.06 08:34:

PS: владельцы других версий PHP, подтвердите пожалуйста :)

-~{}~ 15.03.06 08:54:

3) а если включить magic_quotes_sybase:
Код:
magic_quotes_gpc=1
Array
(
    [text1_'"] => Array
        (
            [key1_''"] => Array
                (
                    [key2_''"] => val1_''"
                )
        )
    [text2_'"] => val2_''"
)
-~{}~ 15.03.06 09:28:

Другой код:

PHP:
<?php

  print "magic_quotes_gpc=".intval(ini_get("magic_quotes_gpc"));

  print "<pre>";
  print htmlspecialchars(print_r($_FILES, 1), ENT_QUOTES);
  print "</pre>";

?>
<form method="POST" action="files2.php" enctype="multipart/form-data">
  <input type="file" name="file\'asd[asd\'asd\'asd]" />
  <input type="submit" />
</form>
Умеет генерить 2 вида аутпута при аплоаде файла под названием
Код:
abc'abc.txt'
:
1) все ок, _ничего_ не заэскейпилось:
Код:
magic_quotes_gpc=0
Array
(
    [file\'asd] => Array
        (
            [name] => Array
                (
                    [asd\'asd\'asd] => abc'abc.txt'
                )
            [type] => Array
                (
                    [asd\'asd\'asd] => text/plain
                )
            [tmp_name] => Array
                (
                    [asd\'asd\'asd] => C:/TEMP/temp'dir\php94.tmp
                )
            [error] => Array
                (
                    [asd\'asd\'asd] => 0
                )
            [size] => Array
                (
                    [asd\'asd\'asd] => 3
                )
        )
)
2) начинаются большие проблемы :) заэскейпилось только частично. некаоторые данные вообще потерялись
Код:
magic_quotes_gpc=1
Array
(
    [file\'asd] => Array
    первоуровневый ключ опять не заэскейпился.
        (
            [name] => Array
                (
                    [asd\\\'asd\\\'asd] => 
                    в имени файла обрезается все до по последней кавычки.
                    "abc'abc.txt'" -> ""
                    "abc''def.txt" -> "def.txt"
                )
            [type] => Array
                (
                    [asd\\\'asd\\\'asd] => text/plain
                )
            [tmp_name] => Array
                (
                    [asd\'asd\'asd] => C:/TEMP/temp'dir\php7C.tmp
                    значение не заэскейпилось - но значение наверное и не должно было
                    (сейчас указывает на правильную директорию temp'dir). Ключ - тоже.
                    Если сделать stripslashes на ключ, то мы потеряем информацию.
                    Значение стрипслэшить тоже нельзя, ибо может попасться что-нибудь типа:
                    C:\TEMP\'tempdir\php7C.tmp - и будет очень плохо :)
                    Но переложим это на совесть хостера :) нефиг делать директории с кавычками.
                )
            [error] => Array
                (
                    [asd\\\'asd\\\'asd] => 0
                )
            [size] => Array
                (
                    [asd\\\'asd\\\'asd] => 3
                )
        )
)
-~{}~ 15.03.06 12:00:

Так что вот такой вариант получился у меня. Потестим?

PHP:
<?php

  function strips_keys_values(&$el) {
    if (is_array($el)) {
      $el_tmp = array();
      foreach($el as $k => $v) {
        $k_tmp = stripslashes($k);
        strips_keys_values($v);
        $el_tmp[$k_tmp] = $v;
      }
      $el = $el_tmp;
    } else {
      $el = stripslashes($el);
    }
  }

  function strips_tl(&$el) {
    if (is_array($el)) {
      foreach($el as $k => $v) {
        strips_keys_values($el[$k]);
      }
    } else {
      $el = stripslashes($el);
    }
  }


  if (get_magic_quotes_gpc()) { 
    strips_tl($_GET);
    strips_tl($_POST);
    strips_tl($_COOKIE);
    strips_tl($_REQUEST);
    foreach($_FILES as $k => $v) {
      foreach($v as $property => $v2) {
        if ($property != "tmp_name") {
          strips_keys_values($v2);
          $_FILES[$k][$property] = $v2;
        }
      }
    }
    if (isset($_SERVER['PHP_AUTH_USER'])) $_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']);
    if (isset($_SERVER['PHP_AUTH_PW']))   $_SERVER['PHP_AUTH_PW']   = stripslashes($_SERVER['PHP_AUTH_PW']);
  }

?>
 

SiMM

Новичок
Wicked, а какая надобность использовать кавычки и слэши в ключах?
 

Фанат

oncle terrible
Команда форума
SiMM
ну, мало ли.
лучше знать все свойства.

-~{}~ 15.03.06 12:58:

Wicked
Честно говоря, я бы не стал заморачиваться, а написал бы в факе что-то типа "если учесть, что пхп прослешивает ещё и ключи массивов, то это лишний аргумент за то, чтобы задушить волшебные кавычки на корню!" =)
 

Wicked

Новичок
SiMM
я согласен, что обычно девелоперы их не используют. Но:
1) если уж понадобится, то надо быть вооруженным :)
2) либо знать, почему их не стоит использовать и не использовать.
3) иногда бывает проще использовать какой-нибудь foreach() с элементами реквеста.
4) моя позиция: мы должны приводить ВСЕ данные к исходному виду, незивисимо от самих данных.

-~{}~ 15.03.06 13:09:

Фанат
согласен :) но мы же прекрасно понимаем, что не так все просто и кто-нибудь когда-нибудь спросит: а как быть, если хочется использовать слэши и кавычки в ключах массивов при включенной magic_quotes_gpc? :)
 

Фанат

oncle terrible
Команда форума
Ну, я считаю, что не на любой случай следует писать код.
Некоторые случаи вполне побойдутся устным пояснением.
Тем более, что я позиционирую текст, как, в первую очередь frequently asked questions.
И стараюсь не перегружать дополнительными сведениями.
 

Wicked

Новичок
ну можно не включать сведения, а просто заменить код...

чтобы, например, я мог прийти на phpfaq, взять этот код и заюзать его в своих проектах. И при этом знать, что никаких допущений в нем нету.

-~{}~ 15.03.06 13:38:

кстати,
http://ru2.php.net/parse_str/
Note: The magic_quotes_gpc setting affects the output of this function, as parse_str() uses the same mechanism that PHP uses to populate the $_GET, $_POST, etc. variables.
может сделать отключение magic_quotes_gpc после стрипов?
 

SiMM

Новичок
> чтобы, например, я мог прийти на phpfaq, взять этот код и заюзать его в своих проектах.
Я думаю ссылочки на тред будет вполне достаточно.

> кстати, http://ru2.php.net/parse_str/
Уууу как всё, оказывается, запущено-то ;)
 

Wicked

Новичок
мой эксперимент показал, что ini_set("magic_quotes_gpc", 0); не выключает magic quotes, и parse_str() подолжает делать фихню.
 

Wicked

Новичок
Ну это понятно с точки зрения суперглобальных переменных... А я думал, что в этом случае можно переключать magic_quotes_gpc, и оно для parse_str() имело бы примерно такое же значение, как magic_quotes_sybase для add- и stripslashes(). Magic_quotes_sybase же можно на лету переключать.

Вообщем функция parse_str() пригодна к применению только в таком виде:

PHP:
function parse_str_ok ($str) {
  parse_str($str, $output);
  if (get_magic_quotes_gpc()) {
    strips_tl($output)
  }
  return $output;
}
-~{}~ 16.03.06 12:13:

Magic_quotes_sybase же можно на лету переключать.
Причем оно тоже не откатывает изменения, внесенные magic_quotes_gpc в суперглобальные переменные.

-~{}~ 20.03.06 19:48:

Я может чего-то еще пропустил, но может в фак включить:
- эскейпинг при генерации php- и js-кода.
- эскейпинг при генерации урлов и post-запросов.
- preg_quote().
- strip_tags().

и м.б. инфу про борьбу с:
- mail() injection
- http headers injection
- remote file injection
 

Wicked

Новичок
Ну эти пункты явно в слэши:
- эскейпинг при генерации php- и js-кода.
- preg_quote().
- забытые мной в прошлый раз escapeshellarg(), escapeshellcmd();

Еще по теме подходят следующие. Единственное отличие, что они эскейпят не слэшами.
- эскейпинг при генерации урлов и post-запросов.
- mail() injection
 

Фанат

oncle terrible
Команда форума
ой, не знаю.
что значит "генерация php-кода"?
js-код - это обычный искейпинг в строках пхп, что ли? могу поставить ссылку.

генерация пост запросов - В САД.
Моя позиция проста и неизменна. Если специалисту нужно послать пост запрос, то он и сам разберётся. А всякой шелупони флудить я помогать не собираюсь.
генерация урлов? имеется в виду урленкод?


Wicked
вот скажи. ты в состоянии воспринять сразу без проблем 10 страниц информации?
новой. неизвестной тебе?

знаешь, отчего смарти сейчас является таким неподъёмным уродом? От того, что её делали так же, как ты сейчас предлагаешь наполнять фак. Пихать туда ВООБЩЕ ВСЁ, на что упадёт взгляд.

Ты не забыл, вообще, что это потом кто-то ещё читать будет?
 

Wicked

Новичок
Генерация пхп-кода: составление кода для eval или для записи в файл. Например, в одном из проектов, в которых я участвовал, конфиг являлся пхп-файлом. И если это делается правильно, то не вижу в этом ничего зазорного.

Js-код: например вставка строковых значений в js-код.
грубо говоря,
PHP:
print "<script>var str = '".addslashes($str)."';</script>";
Пост-запросы: если так заботишься о спаме, то ладно %)

Урлы: да, urlencode, rawurlencode.

Фанат
Ок, давай не будем перегружать фак. Да, я может стараюсь учесть все-все-все, даже то, что не нужно :) Так что нужно искать некий компромисс.

Но, имхо, желательно бы иметь где-нибудь в сети такой глобальный обзор функций для эскейпинга/квотинга.
 
Сверху