Конечная чистая / безопасная функция
у меня есть много пользовательских входов от $_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);
так что в вашем коде позже, когда вы работаете с e. G $_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;
}
7 ответов:
идея общей функции санитарии является сломанной концепцией.
здесь один правый метод санобработки для каждой цели. Запуск их всех без разбора в строке часто нарушит его-экранирование фрагмента HTML-кода для SQL-запроса сломает его для использования на веб-странице и наоборот. Санитария должна применяться перед используя данные:
перед выполнением запроса к базе данных. Правильная санитария метод зависит от используемой библиотеки; они перечислены в как я могу предотвратить SQL-инъекций в PHP?
htmlspecialchars()
для безопасного вывода HTML
preg_quote()
для использования в регулярном выражении
escapeshellarg()
/escapeshellcmd()
для использования во внешней командеetc. так далее.
используя" один размер приспосабливает все " функция санобработки как использование 5 видов высокотоксичный инсектицид на растении, которое по определению может содержать только один вид клопа-только чтобы узнать, что ваши растения заражены шестым видом, на котором ни один из инсектицидов не работает.
всегда использовать этот метод, в идеале прямо перед передачей данных в функцию. никогда смешайте методы, Если вам не нужно.
нет смысла просто проходя через все эти функции. Все эти функции имеют разные значения. Данные не становятся "чище", вызывая больше escape-функций.
если вы хотите сохранить пользовательский ввод в MySQL, вам нужно использовать только
mysql_real_escape_string
. Затем он полностью экранируется для безопасного хранения в базе данных.EDIT
также обратите внимание на проблемы, возникающие при использовании других функций. Если клиент отправляет например имя пользователя на сервере, и имя пользователя содержит амперсанд (
&
), вы не хотите, чтобы называлиhtmlentities
перед сохранением его в базу данных, потому что тогда имя пользователя в базе данных будет содержать&
.
вы ищете
filter_input_array()
. Однако я предлагаю использовать это только для проверки/очистки в бизнес-стиле, а не для фильтрации входных данных SQL.для защиты от внедрения SQL используйте параметризованные запросы с mysqli или PDO.
проблема в том, что что-то чистое или безопасное для одного использования, не будет для другого : очистка для части пути, для части запроса mysql, для вывода html (как html, или в javascript или в значении ввода), для xml могут потребоваться разные вещи, которые противоречат.
но, некоторые глобальные вещи могут быть сделаны. Попробуйте использовать filter_input чтобы получить ввод пользователя. И использовать подготовленные заявления для ваших запросов SQL.
хотя, вместо a функция 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; } ?>
я использовал этот массив pass или get, post
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);