Ив просматривал каждый сайт, включая stackoverflow по этой проблеме.
У меня XSS глобально включен, и несколько страниц, которые я использую TinyMCE. На тех страницах я хотел бы, чтобы часть TinyMCE не включала XSS.
Прочитав около 40 страниц, они все говорят сделать следующее:
$tiny_mce = $this->input->post('note'); // xss filtering off
или
$tiny_mce = $this->input->post('note', FALSE); // xss filtering off
Я попробовал оба, вот моя модель:
public function edit($id) { $tiny_mce = $this->input->post('note'); // xss filtering off $userId = $this->ion_auth->get_user_id(); $data = array( 'note' => $tiny_mce ,'postedBy' => $userId); $this->db->where('id', $id); $this->db->update('company_notes', $data); }
Кто-нибудь знает, почему он не работает? Любая помощь будет замечательной! Я действительно не хочу, чтобы глобально отключил XSS, поэтому я надеялся на подход «на основе».
Редактировать Я просто попробовал
public function edit($id) { $this->config->set_item('global_xss_filtering', FALSE); $tiny_mce = $this->input->post('note'); // xss filtering off $userId = $this->ion_auth->get_user_id(); $data = array( 'note' => $tiny_mce ,'postedBy' => $userId); $this->db->where('id', $id); $this->db->update('company_notes', $data); }
но это тоже не работает.
Невозможно отключить фильтрацию XSS после инициализации контроллера.
Потому что если вы включите $config['global_xss_filtering'] = TRUE;
в файле config.php
CodeIgniter выполняет фильтрацию XSS на $_POST
, $_GET
, $_COOKIE
перед инициализацией Controllers
, Models
и …
Поэтому, когда вы получаете доступ к Controller
все делается раньше.
Хотя решение состоит в том, чтобы отключить $config['global_xss_filtering']
и запускать XSS-фильтрацию по определенным переменным по мере необходимости, существует способ сохранить исходные значения (предварительно отфильтрованные) где-то для их использования позже:
1) Установите $config['enable_hooks']
в TRUE
в application/config.php
.
2) Вставьте в application/config/hooks.php
:
$hook['pre_controller'] = array( 'class' => '', 'function' => 'keep_vars', 'filename' => 'keep_vars.php', 'filepath' => 'hooks', 'params' => array($_POST, $_GET) );
Примечание. Мы используем этот Hook
для выполнения функции keep_vars()
до инициализации контроллера (вы также можете рассмотреть возможность использования ключа 'pre_system'
).
3) Создайте keep_vars.php
внутри application/hooks/
с содержимым ниже:
<?php function keep_vars ($vars = array()) { if (empty($vars)) return; global $pre_filter; $pre_filter = array(); foreach ($vars as $var) { $pre_filter = array_merge($pre_filter, $var); } }
4) Наконец, когда вы хотите получить доступ к переменной в $_GET
или $_POST
в контроллере, определите глобальную переменную $pre_filter
внутри метода:
class Foo extends CI_Controller { public function __construct() { parent::__construct(); } public function bar () { // define as global global $pre_filter; // check the pre XSS filtered values print_r($pre_filter); // you can get access to pre filtered $_POST['key'] by: echo $pre_filter['key']; } }
Прочитав документацию по безопасности еще 3 раза, мне приходит в голову, что параметр безопасности применяется при вызове нового контроллера, поэтому использование
$this->config->set_item('global_xss_filtering', FALSE);
в контроллере не будет работать. Однако вы можете использовать один из крючков CI для этого.
крюк pre_controller выглядит так, будто он должен сделать трюк для вас.
theres довольно хороший учебник около половины вниз страницы здесь, которая показывает вам, как переопределить элементы конфигурации. Он находится в разделе «Поддержка отдельных ответов».
Поэтому в файле config / hooks.php добавьте следующее:
$hook['pre_controller'] = array( 'class' => 'the_name_of_your_controller', 'function' => 'config', //or the name of the function that will fire on preload 'filename' => 'the_file_name_of_your_controller.php', 'filepath' => 'hooks' );
THEN в вашем контроллере добавьте эту функцию:
public function config() { $CI =& get_instance(); $CI->config->set_item( 'global_xss_filtering', FALSE ); }