Раньше я был другом, насколько это возможно, централизовало санитарию, но обширное обсуждение SO (, например, здесь ) изменило мое мнение. Определенно стоит прочитать.
Я представляю вам следующую практику:
В центральной процедуре проверки не выполняйте санитарную обработку или просто "грубые" проверки (скажем, для типа данных) и размер ("$ _POST [" category_name "] не должно превышать 200 байтов.")
Пометить входящие переменные как небезопасно (например, $unsafe_id = $_POST["category_name"];
). Храните их в любом доступном для него контроллере / классе / конструкции.
Очистить данные там, где они используются . Если входящие данные используются, например, при вызове exec
, выполните необходимые санитарные операции непосредственно перед вызовом:
$safe_category_name = escapeshellargs($unsafe_category_name);
exec("external_binary -category_name '$safe_category_name'");
если те же данные затем используются, скажем, в запросе mySQL, снова очистите их перед вызовом:
$safe_category_name = mysql_real_escape_string ($unsafe_category_name);
mysql_query("SELECT * FROM items WHERE category_name = '$safe_category_name'");
(это всего лишь пример. Если вы начинаете проект с нуля, вы захотите использовать PDO и подготовленные операторы, что избавит вас от необходимости избегать входящих данных в этом контексте.)
если на веб-странице выводятся те же данные, снова выполните очистку непосредственно перед вызовом:
$safe_category_name = htmlspecialchars($unsafe_category_name);
echo "<span>$safe_category_name</span>";
эта практика
Устанавливает рабочий процесс, предполагающий наличие небезопасных переменных, с которыми необходимо иметь дело в первую очередь, что приводит к более безопасному стилю программирования IMO.
Предотвращает ненужные преобразования.
Помогает бороться с иллюзией, что существует метод одним щелчком, чтобы сделать ввод "безопасным". Нет Санитария зависит от контекста на 100%.