Где очистить ввод PHP $ _POST []? - PullRequest
19 голосов
/ 08 марта 2010

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

где я должен дезинфицировать ввод PHP - контроллер или модель?

Ответы [ 9 ]

22 голосов
/ 09 марта 2010

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

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

19 голосов
/ 08 марта 2010

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

8 голосов
/ 08 марта 2010

Очистка зависит от того, для чего выполняется очистка данных.

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

  • вход базы данных
  • входной выход

В первом случае это предотвращает SQL-инъекцию атак, а во втором - Межсайтовый скриптинг атак.

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

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

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

7 голосов
/ 08 марта 2010

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

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

Это должно быть санировано в представлении для чего-либо общего с окончательным выводом, хотя. то есть предотвратить XSS в представлении.

По сути, все оповещения должны быть сделаны как раз вовремя, чтобы плохие данные не причиняли вреда.

1 голос
/ 14 марта 2010

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

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

0 голосов
/ 08 марта 2010

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

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

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

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

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

0 голосов
/ 08 марта 2010

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

0 голосов
/ 08 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...