Дезинфицируя переменные PHP, я злоупотребляю им?

Я работал с PHP в течение некоторого времени, и я начал спрашивать себя, развиваю ли я хорошие привычки.

один из них-это то, что я считаю, состоит из чрезмерного использования методов дезинфекции PHP, например, один пользователь регистрируется через форму, и я получаю следующие переменные post:

$_POST['name'], $_POST['email'] и $_POST['captcha']. Теперь то, что я обычно делаю, очевидно, дезинфицирует данные, которые я собираюсь поместить в MySQL, но при сравнении captcha я также дезинфицирую он.

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

2 ответов


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

вещи, которые происходят только на клиенте дезинфицируется только для лучшего UX (пользовательский опыт, подумайте о проверке JS формы - с точки зрения безопасности это бесполезно, потому что этого легко избежать, но это помогает не злонамеренным пользователям лучше взаимодействовать с веб-сайтом), но в основном, это не может нанести никакого вреда, потому что эти данные (хорошие или плохие) теряются, как только сессия закрыта. Вы всегда можете уничтожить веб-страницу для себя (на своем компьютере), но проблема в том, что кто-то может сделать это для других.

ответить ваш вопрос более прямо - никогда не беспокоиться о слишком. Всегда лучше быть в безопасности, чем сожалеть, и стоимость обычно не превышает пары миллисекунд.


срок вам нужно искать это ФИЭО. Вход Фильтра, Выход Выхода.

вы можете легко запутаться, если вы не понимаете этого основного принципа.

представьте, что PHP-это человек посередине, он получает левой рукой и раздает правой.

пользователь использует вашу форму и заполняет форму даты, поэтому он должен принимать только цифры и, возможно, тире. например, nnnnn-nn-nn. если вам что-то не соответствует, то отказать он.

Это пример фильтрации.

следующий PHP, делает что-то с ним, скажем, хранит его в базе данных Mysql.

что Mysql должен быть защищен от SQL-инъекции, поэтому вы используете PDO или подготовленные операторы Mysqli, чтобы убедиться, что даже если ваш фильтр не удался, вы не можете разрешить атаку на вашу базу данных. Это пример экранирования, в данном случае экранирования для хранилища SQL.

позже, PHP получает данные из БД и отображает это на HTML-страницу. Поэтому вам нужно избежать данных для следующего носителя, HTML (здесь вы можете разрешить атаки XSS).

в вашей голове вы должны разделить каждую из "защитных" функций PHP на одно или другое из этих двух семейств, фильтруя или экранируя.

поля Freetext, конечно, сложнее, чем фильтрация для даты, но неважно, придерживайтесь принципов, и все будет в порядке.

надеюсь, это поможет http://phpsec.org/projects/guide/