Intereting Posts
URL-запрос с php включает Мой последний mysql db, может кто-нибудь проверить, правильно ли сделаны таблицы? Как отобразить результат массива Код состояния HTTP для перенаправления языка На странице редактирования выберите выбранную радиокнопку Почему PHP не автоматически вызывает родительские конструкторы? laravel install on bluehost – ошибка 500, несмотря на несколько методов установки Внедрение плагина загрузки jquery 'uploadify' с помощью codeigniter Сортировка многомерного массива, построенного из данных CSV, с использованием PHP Многомерный массив PHP Implode Как сделать вывод списка выбора зависимым от родительского списка? Как создать сценарий отправки формы на стороне сервера, который имеет характеристики на стороне клиента? Написание изогнутого текста на дуге (PHP) Если в модели или контроллере выбираются зависимые строки? Захват текста между квадратными скобками в PHP

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

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

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

Solutions Collecting From Web of "Где дезинформировать PHP $ _POST вход?"

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

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

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

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

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

Ввод 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.