собственно сабж в следующем, как удобно и просто получать значения из массивов $_GET или $_POST в начале делал так: PHP: $name1 = mysql_escape_string($_POST['name1']); $name2 = mysql_escape_string($_POST['name2']); .... потом надоело, где-то, скорее всего в мануале узнал про функцию extract() и стал вместо всех этих строчек делать так: PHP: function escape_string(&$array) { $array = array_map('mysql_escape_string', $array); } escape_string($_POST); extract($_POST); далее подумал, а что если злоумышленник скачает страницу себе на комп, добавит в форму поля и изменит значения моих переменных, потому разобравшись изменил на: PHP: function escape_string(&$array) { $array = array_map('mysql_escape_string', $array); } escape_string($_POST); extract($_POST, EXTR_SKIP); Таким образом, я получаю удобоваримые переменные из массивов $_POST, $_GET экспортированные в текущую символьную таблицу при этом экраннированные на предмет наличия недопустимых спец-символов вопрос в том насколько правильно такая техника с позиции безопасности и как вы решаете такие вопросы в своих скриптах?
Дома корявая недореализация bind SQL. На работе часть экранируются при проверке, часть в классе для записи в БД...
Глупейшее и опаснейшее решение... Правильнее почитать http://phpfaq.ru/slashes и не смешить людей Я сам делаю так PHP: <?php // получаю данные в "чистом" виде $text = get_magic_quotes_gpc() ? stripslashes($_POST['text']) : $_POST['text']; // a уже в запросе $sql = 'траляля' . mysql_escape_string($text) . 'три рубля'; // потому что фильтровать данные это грех // они ещё могут понадобиться в чистом виде // Например для вывода на страничку echo '<h1>траляля' . htmlspecialchars($text) . 'три рубля</h1>'; ?> Для больших проектов это по моему практически единственное решение, а для небольших скриптов это всё равно что из базуки по комарам стрелять...
PHP: if (get_magic_quotes_gpc()) { $_GET = stripslashes_array($_GET); // ... } Отменяем мэджик квотс и дальше всегда, где это необходимо, экранируем.
Очень интересная функиця. Искал, но ничего вразумительного не нашёл. У меня 3 вопроса: 1) Почем в мануале и в 144469 документах (http://php.ru/search/) ничего по запросу "stripslashes_array" не найдено? 2)Начиная с какой версии PHP она работает? 3)Есть ли функция addslashes_array (и если есть смотри п.2)?
PHP: <?php function stripslashes_array($arr) { if (!is_array($arr)) return stripslashes($arr); $out=array(); foreach ($arr as $key=>$value) { $out[stripslashes($key)]=stripslashes_array($value); } return $out; } ?> Сергей имел в виду, что весь массив гет/пост надо пробегать такой функцией. Написание очевидно и не требует такого удивления.
Это пользовательская функция. Типа: PHP: <?php function stripslashes_array($array) { foreach ($array as &$v) { if (is_array($v)) { $v = stripslahes_array($v); } else { $v = stripslashes($v); } } return $array; }
stripslahesh_array говорите? Ну такой пока нету, но она легко имплементируется, причём в двух вариациях PHP: <?php /** * Пробегается по исходному масиву и применяет stripshlashes к каждому элементу. Изменяет исходный масив и возращает true в случае удачи, false при неудаче * * @param array $array * * @return bool */ function stripslashes_array(&$array){ return array_walk($array, 'stripslashes'); } PHP: <?php /** * Пробегается по масиву и применяет stripshlashes к каждому элементу. Возвращает новый масив с обработанными данными. * * @param array $array * * @return array */ function stripslashes_array($array){ return array_map('stripslashes', $array); }
Sergey89 Если уделять мануалу время не только когда нужно что-то найти но и просто посмотреть что за функции есть в том или ином модуле, что делают и как использовать (а так же прошерстить часть комментов), то работать будет ещё и не такое и в разы быстрее. Если кто не заметил, то array_walk принимает массив по ссылке и изменяет сам исходный массив, поэтому моя функция тоже принимает массив по ссылке и возращает bool в первом варианте.\ Можно взять array_walk_recursive, тогда будут обрабатывается и многомерные масивы, актуально если в POST'е принимаются данные от полей с именами name="myinput[]" когда это превращается в масив.
Некоторые функции PHP работаю тормознутее, чем аналогичное решение на том же PHP. Например, array_map будет работать дольше, чем прямой перебор через foreach.
Sergey89 У меня это запускается без ошибок PHP: <?php function stripslashes_array(&$array){ return array_walk($array, 'stripslashes'); } $array = array('asfsg\ sfdbvfdbv asdva ', 'asfsg\ sfdbvfdbv asdv2 ', 'asfsg\ sfdbvfdbv asd5 ', ); stripslashes_array($array); echo '<pre>', print_r($array, true), '</pre>'; Однако есть трабла, что-бы изменить данные масива надо принимать параметр по ссылке, поэтому работать правильно будет только такая вариация PHP: <?php function remove_slashes(&$param){ $param = stripslashes($param); } function stripslashes_array(&$array){ return array_walk($array, 'remove_slashes'); }
пока остановился на таком варианте: PHP: function escape($value) { if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { if (is_array($value)) { $value = array_map('mysql_escape_string', $value); } elseif (!empty($value) && is_string($value)) { $value = mysql_escape_string($value); } } return $value; }