Я использую frameworkignign framework.
где я должен дезинфицировать PHP-контроллер ввода или модель?
Я использую 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 injection, а второй - предотвратить Межсайтовый скриптинг.
Итак, чтобы ответить на ваш вопрос (в отношении вышеупомянутых векторов атаки), ваша дезинфекция должна быть там, где присутствуют уязвимости, а точнее:
Надеюсь, это помогло.
Контроллеры должны быть тонкими.
Ввод PHP должен быть дезинфицирован в модели для чего-либо, связанного с тем, где модель хранит его. т.е. предотвратить SQL-инъекцию в модели.
Он должен быть дезинфицирован в представлении, если что-то связано с окончательным результатом. т.е. помешать XSS в представлении.
В принципе, вся сенсибилизация должна выполняться как раз вовремя, чтобы предотвратить вредные данные.
Контроллер похож на привратник приложения, поэтому он должен быть там, где вы проверяете все входы.
Я бы поставил его в контроллер, который обрабатывает отправку формы. Как отмечает Phil Sturgeon, если у вас включена опция 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
}
}
Надеюсь, это поможет! Приветствия
Обычно ваш запрос идет на контроллер, вы должны сделать это в контроллере, контроллер получает эти данные и дезинфицирует их, а затем может взаимодействовать с моделью с безопасными данными.
По моему мнению, ввод данных пользователя должен быть дезинфицирован в контроллере , поскольку он представляет собой обязательный проход для данных между вашим представлением (место, где вы показываете информацию пользователю, и вы получаете пользовательский ввод ) и вашей модели (где вы храните данные).
Модель всегда должна рассматриваться как подключаемый компонент в структуре MVC, что означает, что вы можете, например, переключить свою модель (реализация базы данных и/или способ взаимодействия с ней) в определенный момент. По этой причине валидация пользовательских данных не должна быть привязана к конкретной реализации БД. Только часть санитарии, специфичная для БД (если таковая имеется), должна храниться в модели.
Сказав это, окончательное решение всегда зависит от вас. Просто имейте в виду:
Надеюсь, что это поможет.
Я бы сделал это только на мой взгляд. Там нет необходимости санировать его для хранения в базе данных. Этого достаточно, чтобы просто вывести чистые данные. Вам также необходимо будет избежать данных для предотвращения инъекций SQL.