XSS我做错了吗? CI / php

时间:2010-09-02 01:03:09

标签: php codeigniter xss

我正在开发一个面向公众的界面,该界面利用了一个由于多个应用程序访问它而实际上不受信任的数据库。

我想用干净的方法将我的所有输出编码为UTF-8,以防止XSS。

Codeigniter(CI)没有内置任何内容。那里的过滤器用于输入,实际上并不过滤所有XSS攻击。

我更喜欢全面修复,但不认为有一个。

在本次讨论中,我真正想要的是过滤输出的最佳方法是什么?以下是最好/最简洁的解决方案吗? (encode function是使用utf8和ent_compat的htmlentities的包装器)

<?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 :(得分:0)

如果您只关心转义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);

您甚至可以更进一步,创建一个帮助函数,以便在视图中使用。

更好的是,在加载视图之前,你可以通过$ data数组递归地运行escape_output来转义所有内容。

答案 1 :(得分:0)

IMHO CodeIgniter旨在从输入中过滤。它假定您的数据在初始化应用程序时已经是干净的,并且您使用正确的语法从表单字段获取输入:

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

要发布的第二个参数是启用XSS过滤,请参阅system / libraries / CI_Input.php中的post函数声明:

function post($index = '', $xss_clean = FALSE)
    {
        return $this->_fetch_from_array($_POST, $index, $xss_clean);
    }