Подтвердить что ты не робот

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

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

Ответ 1

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

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

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

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

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

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

  • и т.д.. и др.

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

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

Ответ 2

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

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

ИЗМЕНИТЬ

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

Ответ 3

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

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

Ответ 4

Проблема в том, что что-то чистое или безопасное для одного использования, не будет для другого: очистка части пути, части запроса 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, вы знаете, что вам нужно его изменить. И если в один прекрасный день вам придется изменить способ фильтрации входных данных, просто измените класс, который вы сделали.

Ответ 5

Могу ли я предложить установить "mod_security", если вы используете apache и имеете полный доступ к серверу?

Это решило большинство моих проблем. Однако не полагайтесь только на одно или два решения, всегда пишите защищенный код;)
UPDATE Нашли это PHP IDS (http://php-ids.org/); кажется приятным:)

Ответ 6

<?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;
}
?>

Ответ 7

Я использовал этот массив 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);