Я работаю с PHP в течение некоторого времени, и я начал спрашивать себя, развиваю ли я хорошие привычки.
Я верю, что одним из них является чрезмерное использование методов очистки PHP, например, один пользователь регистрируется через форму, и я получаю следующие переменные post:
$_POST['name']
, $_POST['email']
а также $_POST['captcha']
, Теперь то, что я обычно делаю, — это, очевидно, очистка данных, которые я собираюсь поместить в MySQL, но при сравнении капчи я также очищаю их.
Поэтому я полагаю, что неправильно понял очистку PHP, мне любопытно, есть ли другие случаи, когда вам нужно очистить данные, кроме случаев, когда они используются для размещения чего-либо в MySQL (заметьте, я знаю, что очистка также необходима для предотвращения XSS-атак). И более того, моя привычка дезинфицировать почти все переменные, поступающие из пользовательского ввода, плохая?
Всякий раз, когда вы храните свои данные где-то, и если эти данные будут прочитаны / доступны (ничего не подозревающим) пользователям, вам придется их дезинфицировать. Поэтому следует позаботиться о чем-то, что может изменить пользовательский интерфейс (не обязательно только базу данных). Как правило, все вводимые пользователем данные считаются небезопасными, но в следующем параграфе вы увидите, что некоторые вещи все еще могут игнорироваться, хотя я не рекомендую это вообще.
Вещи, которые происходят только на клиенте, очищаются только для лучшего UX (пользовательский опыт, подумайте о проверке формы JS — с точки зрения безопасности это бесполезно, потому что его легко избежать, но это помогает не злонамеренным пользователям лучше взаимодействовать с веб-сайт), но, в принципе, это не может принести никакого вреда, потому что эти данные (хорошие или плохие) теряются, как только сессия закрывается. Вы всегда можете уничтожить веб-страницу для себя (на своей машине), но проблема в том, когда кто-то может сделать это для других.
Чтобы ответить на ваш вопрос более прямо — никогда не беспокойтесь о переусердствовании Всегда лучше быть в безопасности, чем сожалеть, а стоимость обычно не превышает пары миллисекунд.
Вы должны искать термин FIEO. Вход фильтра, выход выхода.
Вы можете легко запутаться, если не понимаете этот основной принцип.
Представьте, что PHP — это человек посередине, он получает левой рукой и выдает правой.
Пользователь использует вашу форму и заполняет форму даты, поэтому он должен принимать только цифры и, возможно, тире. например NNNNN-нн-нн. если вы получаете что-то, что не соответствует этому, то отвергните это.
Это пример фильтрации.
Следующий PHP, что-то с этим делает, допустим, хранит его в базе данных Mysql.
Mysql нуждается в защите от внедрения SQL, поэтому вы используете PDO или подготовленные операторы Mysqli, чтобы убедиться, что ДАЖЕ ЕСЛИ ваш фильтр не сработал, вы не можете допустить атаку на вашу базу данных. Это пример экранирования, в данном случае экранирования для хранилища SQL.
Позже PHP получает данные из вашей базы данных и отображает их на HTML-странице. Таким образом, вам нужно удалить данные для следующего носителя, HTML (именно здесь вы можете разрешить атаки XSS).
В своей голове вы должны разделить каждую из «защитных» функций PHP на одно или другое из этих двух семейств: фильтрация или экранирование.
Поля свободного текста, конечно, более сложны, чем фильтрация по дате, но не берите в голову, придерживайтесь принципов, и вы будете в порядке.
Надеюсь, что это помогает http://phpsec.org/projects/guide/