Конечная чистая / безопасная функция

У меня много пользовательских входов от $_GET и $_POST … На данный момент я всегда пишу mysql_real_escape_string($_GET['var']) ..

Я хотел бы знать, можно ли сделать функцию, которая обеспечивает, ускоряет и очищает массивы $_GET / $_POST сразу, поэтому вам не придется иметь дело с этим каждый раз, когда вы работаете с пользовательскими входами и т. Д.

Я думал о функции, например, cleanMe($input) , и внутри нее он должен был делать mysql_real_escape_string , htmlspecialchars , strip_tags , stripslashes (я думаю, что все это сделает его чистым и безопасным), а затем вернет $input .

Так это возможно? Создание функции, которая работает для всех $_GET и $_POST , поэтому вы бы сделали только это:

 $_GET = cleanMe($_GET); $_POST = cleanMe($_POST); 

Итак, в вашем коде позже, когда вы работаете, например, $_GET['blabla'] или $_POST['haha'] , они защищены, разделены и так далее?

Пробовал немного:

 function cleanMe($input) { $input = mysql_real_escape_string($input); $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8'); $input = strip_tags($input); $input = stripslashes($input); return $input; } 

Идея общей санитарной функции является нарушенной концепцией.

Существует один правильный метод санитарии для всех целей. Запуск их всех без разбора на строку часто нарушает его – экранирование фрагмента кода HTML для SQL-запроса приведет к его разрыву для использования на веб-странице и наоборот. Санитарная обработка должна применяться непосредственно перед использованием данных:

  • перед запуском запроса базы данных. Правильный метод санитарии зависит от используемой библиотеки; они перечислены в разделе Как я могу предотвратить SQL-инъекцию в PHP?

  • htmlspecialchars() для безопасного вывода HTML

  • preg_quote() для использования в регулярном выражении

  • escapeshellarg() / escapeshellcmd() для использования во внешней команде

  • и т.д.

Использование функции санитарии «один размер подходит всем», как использование пяти видов высокотоксичных инсектицидов на растении, которое по определению может содержать только один вид ошибки – только чтобы узнать, что ваши растения заражены шестым видом, на котором нет из инсектицидов.

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

Нет смысла просто передавать вход через все эти функции. Все эти функции имеют разные значения. Данные не становятся «более чистыми», вызывая дополнительные функции escape-функции.

Если вы хотите хранить пользовательский ввод в MySQL, вам нужно использовать только mysql_real_escape_string . Затем он полностью экранирован для безопасного хранения в базе данных.

РЕДАКТИРОВАТЬ

Также обратите внимание на проблемы, возникающие при использовании других функций. Если клиент отправляет, например, имя пользователя на сервер, а имя пользователя содержит амперсанд ( & ), вы не хотите, чтобы он вызывал htmlentities прежде чем хранить его в базе данных, потому что тогда имя пользователя в базе данных будет содержать & ,

Вы ищете filter_input_array() . Тем не менее, я предлагаю использовать это только для проверки / санитарии бизнес-стиля, а не для фильтрации входных данных SQL.

Для защиты от SQL-инъекции используйте параметризованные запросы с mysqli или PDO .

Проблема в том, что что-то чистое или безопасное для одного использования, не будет для другого: очистка для части пути, для части запроса mysql, для вывода html (как html, или в javascript или в значении ввода) для xml могут потребоваться разные вещи, что противоречит.

Но, некоторые глобальные вещи могут быть сделаны. Попробуйте использовать filter_input для ввода вашего пользователя. И используйте подготовленные операторы для ваших SQL-запросов.

Хотя вместо функции do-it-all вы можете создать класс, который управляет вашими входами. Что-то вроде того :

 class inputManager{ static function toHTML($field){ $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS); return $data; } static function toSQL($field, $dbType = 'mysql'){ $data = filter_input(INPUT_GET, $field); if($dbType == 'mysql'){ return mysql_real_escape_string($data); } } } 

При таких вещах, если вы видите какие-либо $ _POST, $ GET, $ _REQUEST или $ _COOKIE в своем коде, вы знаете, что вам нужно его изменить. И если однажды вам придется изменить способ фильтрации ваших входов, просто измените класс, который вы сделали.

Могу ли я предложить установить «mod_security», если вы используете apache и имеете полный доступ к серверу ?!
Это решило большинство моих проблем. Однако не полагайтесь только на одно или два решения, всегда пишите защищенный код;)
ОБНОВЛЕНИЕ Нашли это PHP IDS (http://php-ids.org/); кажется приятным 🙂

 <?php function sanitizeString($var) { $var = stripslashes($var); $var = strip_tags($var); $var = htmlentities($var); return $var; } function sanitizeMySQL($connection, $var) { $var = $connection->real_escape_string($var); $var = sanitizeString($var); return $var; } ?> 

Я использовал этот массив или получаю сообщение

 function cleanme(&$array) { if (isset($array)) { foreach ($array as $key => $value) { if (is_array($array[$key])) { secure_array($array[$key]); } else { $array[$key] = strip_tags(mysql_real_escape_string(trim($array[$key]))); } } } } 

Применение :

 cleanme($_GET); cleanme($_POST);