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


у меня есть много пользовательских входов от $_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 53

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);