XSS я делаю это неправильно? CI / php - PullRequest
1 голос
/ 02 сентября 2010

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

Я хотел бы получить чистый способ кодирования всех своих выходных данных в UTF-8htmlentities для предотвращения XSS.

В Codeigniter (CI) ничего не встроено. Фильтр, предназначенный для ввода, фактически не фильтрует все атаки XSS.

Я бы предпочел полное исправлениено не думайте, что он есть.

Что я действительно хочу сказать в этом обсуждении, каков наилучший способ отфильтровать мои результаты?И является ли следующее лучшее / самое краткое решение?(функция кодирования является оберткой для htmlentities с utf8 и ent_compat)

<?php 
    echo form_input(“start_date[”.encode($id).”]”, encode($action->start_date,true), class=“input input-date dateISO required” readonly=readonly title=“must set a date.”’); 
?>

Как вы можете видеть, код начинает выглядеть довольно глупо, разбрызгивая эту функцию кодирования повсюду.Кодирование на уровне контроллера просто не является решением, поскольку CI не использует строгие шаблоны.Кодирование на уровне модели оставляет открытыми другие возможные пути.Кодирование во время вывода кажется самым безопасным / ловким во всех случаях способом, я просто хочу, чтобы кто-то подтвердил, что я не пропускаю что-то очевидное и приятнее смотреть / поддерживать

Ответы [ 2 ]

0 голосов
/ 14 декабря 2010

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

$data["field"] = $this->input->post("field",true);

Второй параметр для публикации - включение XSS-фильтрации, см. Объявление функции post в system / library / CI_Input.php:

function post($index = '', $xss_clean = FALSE)
    {
        return $this->_fetch_from_array($_POST, $index, $xss_clean);
    }
0 голосов
/ 02 сентября 2010

Если вас интересует только выход из HTML (поскольку все, что идет между тегами скрипта - это другая история), тогда я бы создал подкласс класса Model (назовите его base_model), создайте метод, через который вы будете передавать весь вывод, прежде чем возвращать его вконтроллер и подкласс всех других ваших моделей от base_model.

// Base Model
class Base_model extends Model {

    function __construct()
    {
        parent::Model();
    }

    function escape_output($str) 
    {
        return htmlentities($str, ENT_COMPAT);
    }

}


// Whatever model is a subclass of base_model
class Whatever_model extends Base_model {

    function __construct()
    {
        parent::__construct();
    }

    function get_all($table)
    {
        return $this->db->get($table)->result_array();
    }

}

// Some controller somewhere
$data['first_name'] = $this->Whatever_model->escape_output($str);

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

Еще лучше, если бы вы могли заставить escape_output рекурсивно запускаться через массив $ data, экранируя все перед загрузкойваш взгляд.

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