Я использую frameworkignign framework.
где я должен дезинфицировать 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>";
Эта практика
Устанавливает рабочий процесс, предполагающий наличие небезопасных переменных, которые необходимо решать в первую очередь, что приводит к более безопасному стилю программирования IMO.
Предотвращает ненужные преобразования.
Помогает бороться с иллюзией, что существует один клик, чтобы сделать ввод «безопасным». Нет. Санитария зависит от контекста на 100%.
Все эти ответы, относящиеся к методам PHP в целом, но не имеют отношения к CodeIgniter.
Данные POST
CodeIgniter автоматически очищает ваши данные POST, когда вы используете $ this-> input-> post ('item_name'), если в вашем config.php включен global_xss. Если вы хотите, чтобы только отдельные элементы были очищены, вы можете использовать:
$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 в представлении.
В принципе, вся сенсибилизация должна проводиться как раз вовремя, чтобы предотвратить вредные данные.
Контроллер подобен привратнику приложений, поэтому он должен быть там, где вы проверяете все входы.
Я бы поставил его в контроллер, который обрабатывает представление формы. Как отмечает Phil Sturgeon, если у вас включена опция global_xss в вашей конфигурации, CodeIgniter будет в любом случае обрабатывать уровень кератина.
В качестве дополнительного уровня безопасности я бы использовал библиотеку form_validation CodeIgniter. Вот пример контроллера для вас:
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 } }
Надеюсь, это поможет! ура
Обычно ваш запрос поступает на контроллер , вы должны это делать в контроллере, контроллер получает эти данные и дезинфицирует их, а затем может взаимодействовать с моделью с безопасными данными.
По моему мнению, пользовательский ввод должен быть дезинфицирован в контроллере , поскольку он представляет собой обязательный проход для данных между вашим представлением (местом, где вы показываете информацию пользователю, и вы получаете пользовательский ввод) и вашей моделью (где вы храните данные ).
Модель всегда должна рассматриваться как подключаемый компонент в вашей структуре MVC, что означает, что вы можете, например, переключить свою модель (реализация базы данных и / или способ взаимодействия с ней) в определенный момент. По этой причине валидация пользовательских данных не должна быть привязана к конкретной реализации БД. Только часть санитарии, которая является специфичной для БД (если таковая имеется), должна храниться в модели.
Сказал это, окончательное решение всегда зависит от вас. Просто имейте в виду:
Надеюсь это поможет.
Я бы сделал это только на мой взгляд. Не нужно санировать его для хранения в базе данных. Достаточно просто вывести чистые данные. Вам также необходимо будет избежать данных, чтобы предотвратить инъекции SQL.