Где санировать $ PHP _POST [] вход?

Я использую codeigniter платформу.

где я должен санировать вход PHP - контроллер или модель?

19
задан tereško 9 February 2013 в 01:46
поделиться

9 ответов

Раньше я был сторонником максимально возможной централизации санитарии, но обширное обсуждение 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% зависит от контекста.

19
ответ дан 30 November 2019 в 02:20
поделиться

Ваш запрос идет к контроллеру обычно, вы должны делать это в контроллере, контроллер, получив эти данные и санировав их, может затем взаимодействовать с моделью с безопасными данными.

0
ответ дан 30 November 2019 в 02:20
поделиться

Все эти ответы относятся к методам 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));

Это все сбежало, так что не надо больше возиться с тем, что куда попало. Вы можете просто написать код и оставить безопасность в руках фреймворка.

22
ответ дан 30 November 2019 в 02:20
поделиться

Санитарная обработка зависит от того, для чего обрабатываются данные.

Обычно существует два типа очистки:

  • ввод базы данных
  • внешний вывод

В первом случае он предназначен для предотвращения атак SQL-инъекций , а второй - для предотвращения Атаки межсайтового скриптинга .

Итак, чтобы ответить на ваш вопрос (относительно вышеупомянутых векторов атак), ваша дезинфекция должна быть там, где присутствуют уязвимости, а точнее:

  • где вы пишете SQL-запросы с переменными в них (моделях)
  • где вы пишете любой вывод (обычно HTML) (представления)

Надеюсь, это помогло.

8
ответ дан 30 November 2019 в 02:20
поделиться

Контроллеры должны быть тонкими.

Ввод PHP должен быть санирован в модели для всего, что связано с тем, где модель его хранит. т.е. предотвращать SQL-инъекции в модели.

Он должен быть санирован в представлении для всего, что имеет отношение к конечному выводу. т.е. предотвратить XSS в представлении.

В принципе, вся санация должна быть сделана вовремя, чтобы предотвратить причинение вреда плохими данными.

7
ответ дан 30 November 2019 в 02:20
поделиться

Я бы сделал это только в своем представлении. Для хранения в базе данных нет необходимости проводить санитарную обработку. Достаточно просто вывести чистые данные. Вам также нужно будет экранировать данные для предотвращения SQL-инъекций.

-1
ответ дан 30 November 2019 в 02:20
поделиться

Контроллер - это как привратник приложения, поэтому он должен быть местом, где вы проверяете все вводимые данные.

1
ответ дан 30 November 2019 в 02:20
поделиться

По моему мнению, пользовательский ввод должен быть очищен в контроллере , поскольку он представляет собой обязательный переход для данных между вашим представлением (место, где вы показываете информацию пользователю и вы получаете ввод пользователя) и вашу модель (где вы храните данные).

Модель всегда следует рассматривать как подключаемый компонент в вашей структуре MVC, что означает, что вы можете, например, переключить свою модель (реализацию базы данных и / или способ взаимодействия с ней) на определенный момент. По этой причине проверка пользовательских данных не должна быть привязана к конкретной реализации БД. Только та часть sanitization , которая специфична для БД (если таковая имеется), должна быть сохранена в модели.

Сказал, что окончательное решение всегда за вами. Просто имейте в виду:

  • Входные данные должны быть всегда подтверждены
  • Дизайн должен быть согласованным . Если вы решите очистить пользовательский ввод в контроллере, попробуйте всегда сделать это там. Это сделает код более чистым и понятным

. Надеюсь, это поможет.

0
ответ дан 30 November 2019 в 02:20
поделиться

Я бы поместил его в контроллер, который обрабатывает отправку формы. Как указывает Фил Стерджен, если в вашей конфигурации включена опция 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
    }

 }

Надеюсь, это поможет! Ура

1
ответ дан 30 November 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: