Очистка глобальных массивов в PHP

Я пытаюсь найти лучший способ дезинфицировать запросы в PHP.

Из того, что я прочитал, я узнал, что переменные GET следует очищать только тогда, когда они отображаются, а не в начале «потока запроса». Опубликовать переменные (которые не поступают из базы данных).

Я вижу здесь несколько проблем:

Конечно, я могу создавать функции, очищающие эти переменные, и, вызывая что-то вроде Class::post('name') или Class::get('name'), все будет в безопасности. Но что, если человек, который будет использовать мой код в будущем, забудет о нем и будет использовать случайную $_POST['name'] вместо моей функции? Могу ли я обеспечить, или я должен обеспечить некоторую безопасность здесь?


person user1615069    schedule 02.11.2012    source источник


Ответы (4)


Никогда не бывает универсальной санитарной обработки. «Санитизация» означает, что вы манипулируете значением, чтобы оно соответствовало определенным свойствам. Например, вы приводите что-то, что должно быть числом, к числу. Или вы удаляете теги <script> из предполагаемого HTML. Что именно и как дезинфицировать, зависит от того, каким должно быть значение и нужно ли дезинфицировать вообще. Например, очистка HTML для тегов из белого списка действительно сложна.

Поэтому нет никакого волшебства Class::sanitize, которое подходит ко всему сразу. Любой, кто использует ваш код, должен думать о том, что он пытается сделать. Если они просто слепо используют значения $_POST как есть, они уже потерпели неудачу и должны сдать свою карту программиста.

Что вам всегда нужно делать, так это экранировать в зависимости от контекста. Но поскольку это зависит от контекста, вы делаете это только там, где это необходимо. Вы не экранируете вслепую все значения $_POST, потому что понятия не имеете, для чего экранируете. См. Великий эскапизм (или: Что нужно знать для работы с текстом в тексте), чтобы получить дополнительные сведения о вся тема.

person deceze♦    schedule 02.11.2012

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

"; exec("some evil command"); $blah="

Тогда это не будет проблемой для PHP - вы получите эту литеральную строку.

Однако при передаче его из PHP во что-то еще важно убедиться, что «что-то еще» не истолкует строку неправильно. Итак, если он входит в базу данных MySQL, вам нужно избежать его в соответствии с правилами MySQL (или использовать подготовленные операторы, которые сделают это за вас). Если он идет в HTML, вам нужно как минимум закодировать < как &lt;. Если он входит в JavaScript, вам нужно закодировать его в JSON и так далее.

person Niet the Dark Absol    schedule 02.11.2012

Вы можете сделать что-то вроде этого... Ненадежно, но работает..

foreach($_POST as $key => $val)
{
  //do sanitization
  $val = Class::sanitize($val);

  $_POST[$key] = $val;
}

Изменить: вы хотите поместить это как можно ближе к заголовку. Я обычно помещаю свой в контроллер, чтобы он запускался из __construct() автоматически.

person phpisuber01    schedule 02.11.2012

Замените массив $_POST объектом-санитайзером, который ведет себя как массив.

person Peter Kiss    schedule 02.11.2012