Я использую codeigniter платформу.
где я должен санировать вход PHP - контроллер или модель?
Раньше я был сторонником максимально возможной централизации санитарии, но обширное обсуждение 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>";
Эта практика
Устанавливает рабочий процесс, который предполагает наличие небезопасных переменных, которые необходимо обработать в первую очередь, что приводит к к более безопасному стилю программирования ИМО.
Предотвращает ненужные преобразования.
Помогает бороться с иллюзией, что существует способ одним щелчком мыши сделать ввод «безопасным». Нет. Санитария на 100% зависит от контекста.
Ваш запрос идет к контроллеру обычно, вы должны делать это в контроллере, контроллер, получив эти данные и санировав их, может затем взаимодействовать с моделью с безопасными данными.
Все эти ответы относятся к методам PHP в целом, но не имеют отношения к CodeIgniter.
Данные POST
CodeIgniter автоматически очищает ваши данные POST, когда вы используете $ this-> input-> post ('item_name'), если у вас включен global_xss в вашем config.php. Если вы хотите очистить только определенные элементы, вы можете использовать:
$this->input->post('item_name', TRUE);
В любом случае вы защищены от XSS-атак и других проблем.
SQL-инъекция
Все, что вводится в базу данных, автоматически экранируется, если вы используете ActiveRecord (insert (), update () и т.д.) или привязки query ().
$this->db->query('INSERT INTO bla (?, ?)', array($foo, $bar));
Это все сбежало, так что не надо больше возиться с тем, что куда попало. Вы можете просто написать код и оставить безопасность в руках фреймворка.
Санитарная обработка зависит от того, для чего обрабатываются данные.
Обычно существует два типа очистки:
В первом случае он предназначен для предотвращения атак SQL-инъекций , а второй - для предотвращения Атаки межсайтового скриптинга .
Итак, чтобы ответить на ваш вопрос (относительно вышеупомянутых векторов атак), ваша дезинфекция должна быть там, где присутствуют уязвимости, а точнее:
Надеюсь, это помогло.
Контроллеры должны быть тонкими.
Ввод PHP должен быть санирован в модели для всего, что связано с тем, где модель его хранит. т.е. предотвращать SQL-инъекции в модели.
Он должен быть санирован в представлении для всего, что имеет отношение к конечному выводу. т.е. предотвратить XSS в представлении.
В принципе, вся санация должна быть сделана вовремя, чтобы предотвратить причинение вреда плохими данными.
Я бы сделал это только в своем представлении. Для хранения в базе данных нет необходимости проводить санитарную обработку. Достаточно просто вывести чистые данные. Вам также нужно будет экранировать данные для предотвращения SQL-инъекций.
Контроллер - это как привратник приложения, поэтому он должен быть местом, где вы проверяете все вводимые данные.
По моему мнению, пользовательский ввод должен быть очищен в контроллере , поскольку он представляет собой обязательный переход для данных между вашим представлением (место, где вы показываете информацию пользователю и вы получаете ввод пользователя) и вашу модель (где вы храните данные).
Модель всегда следует рассматривать как подключаемый компонент в вашей структуре MVC, что означает, что вы можете, например, переключить свою модель (реализацию базы данных и / или способ взаимодействия с ней) на определенный момент. По этой причине проверка пользовательских данных не должна быть привязана к конкретной реализации БД. Только та часть sanitization , которая специфична для БД (если таковая имеется), должна быть сохранена в модели.
Сказал, что окончательное решение всегда за вами. Просто имейте в виду:
. Надеюсь, это поможет.
Я бы поместил его в контроллер, который обрабатывает отправку формы. Как указывает Фил Стерджен, если в вашей конфигурации включена опция global_xss, CodeIgniter все равно будет обрабатывать цератиновый уровень дезинфекции.
В качестве дополнительного уровня безопасности я бы использовал библиотеку CodeIgniter form_validation. Вот вам образец контроллера:
function processForm()
{
// fields will need to be validated so load library
$this->load->library('form_validation');
// field name, error message, validaiton rules
$this->form_validation->set_rules('first_name','Name','trim|required');
if($this->form_validation->run() == FALSE)
{
// load form again showing errors
} else {
// update database or proceed to stage 2
}
}
Надеюсь, это поможет! Ура