Подтвердить что ты не робот

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

Я использую frameworkignign framework.

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

  • ввод базы данных
  • внешний интерфейс

В первом случае он предотвратит атаки SQL injection, а второй - предотвратить Межсайтовый скриптинг.

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Я бы поставил его в контроллер, который обрабатывает отправку формы. Как отмечает 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
    }

 }

Надеюсь, это поможет! Приветствия

Ответ 7

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

Ответ 8

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

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

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

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

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

Ответ 9

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