2009-11-08 2 views
1

Что является наиболее эффективным методом обеспечения того, чтобы параметры get/post не обеспечивали никакой уязвимости безопасности.php5 security - get/post parameters

Я знаком с htmlentities для предотвращения инъекций кода javascript и добавляет, чтобы предотвратить инъекцию sql.

так что на данный момент я использую их как для каждого параметра get/post.

Есть ли какие-либо другие функции, которые я могу использовать для предотвращения этих уязвимостей, или есть другие проблемы с безопасностью, которые я должен беспокоиться о моем PHP-коде?

+3

'addslashes()' делает ** не ** предотвратить инъекции SQL! На этом сайте есть много сообщений об этом. –

ответ

5

htmlentities (или htmlspecialchars) и addslashes (или mysql_real_escape_string (или другая соответствующая база данных функция экранирования); добавление не всегда является ошибкой) не имеют ничего общего с параметрами GET/POST. Они являются выходными функциями, вход которых может быть исходить из параметров, но может также поступать из других источников, таких как статическая строка или строка, извлеченная из базы данных.

В настоящее время я использую их как для каждого параметра get/post.

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

Не пытайтесь «дезинфицировать» или «фильтровать» все входящие параметры для кодирования или удаления таких символов, как \ или <. Это приведет к заполнению вашего приложения мусором, как \\\\\\\\\\\\\\\\\\\\\\\\\\ и &amp;amp;amp;amp;amp;amp;amp;.Вместо этого вы должны только кодировать их - вместе с любыми другими варибелями, которые не поступают из GET/POST, - в последнюю минуту, когда выплевывают их в другой контекст текста, например htmlspecialchars для HTML или mysql_real_escape_string для строковых литералов MySQL. Обычно вам лучше с параметризованными запросами, что позволяет избежать проблем с экранированием SQL.

Это не означает, что вы не должны проверять свои входящие данные в соответствии с требованиями вашего приложения. Если у вас есть поле, на которое вы рассчитываете получить целое число, обязательно используйте его перед использованием. intval. Если у вас есть простая текстовая строка в одной строке, которую вы не ожидаете содержать новые строки, обязательно отфильтруйте символ \n из строки вместе со всеми другими управляющими символами [\x00-\x1F\x7F]. Но это требования приложений, а не то, что вы можете обязательно использовать во всех своих входных данных.

1

GET/POST является общедоступным, поэтому главной проблема безопасности является не передавать конфиденциальную информацию (ключи, т.е. и значение, которые дают структуру каталогов или дб схему). Также помните, что каждый может манипулировать или создавать свои собственные HTTP-запросы, поэтому обязательно проверяйте данные перед их вставкой в ​​базу данных. Помимо этого, они не создают никаких угроз сами по себе, так как они не оказывают никакого эффекта, пока вы не сделаете что-то с ними.

4

Переменные GET и POST не более опасны, чем любые другие переменные. Вы должны обрабатывать уязвимости инъекций в точке использования, а не в точке ввода. Смотрите мой ответ здесь:

What’s the best method for sanitizing user input with PHP?

1

Если вы ищете простое и быстрое решение, которое предотвращает общие уязвимости безопасности, я мог бы назвать следующие функции. htmlentities(), strip_tags() и addSlashes(), если get_magic_quotes_gpc() возвращает FALSE

С другой стороны, если вы хотите, чтобы подтянуть свою безопасность, проверьте фильтрацию данных, упоминаемый Кристоффер Bohmann

1

Есть уже много хороших ответов, как правило, вы должны:

  • выключить magic_quotes_gpc
  • Validate получить/почтовые параметры
  • параметров HTML кодируют перед отображением
  • использовать побег функция базы данных в запросах

Это как минимум минимум, который будет превентивным t наиболее распространенные уязвимости.