Получите, распишитесь...
а ведь все гораздо хуже, чем думает большинство тут присутствующих. И компактной функцией тут, похоже, не обойтись.
использую 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_'"[key1_'"][key2_'"]" value="val1_'"" />
<input type="text" name="text2_'"" value="val2_'"" />
<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 вида аутпута при аплоаде файла под названием
:
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']);
}
?>