CodeIgniter替换所有POST输入中的选定字符

42fyovps  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(133)

我计划将现有的内联网系统转换为CodeIgniter。我一直使用UTF-8,这样它就可以处理各种不同的字符,这对系统来说是必不可少的(输出发票,地址标签等)。
有几个字符,我决定在输入时自动替换,因为它们经常会让系统的用户感到困惑。

  • 弯引号,包括单引号和双引号。替换为普通撇号/引号
  • 短破折号和长破折号,替换为普通连字符
  • 省略号,替换为三个句号

至少这些标点符号现在都被一致地使用和存储。
要存储在数据库中的数据总是由该系统中的POST接收,因此我在每次页面加载时对POST数组运行以下函数...

function nasty_chars_replace(&$var) {

    $trans_table = array(
        chr(0xe2).chr(0x80).chr(0x9a) => '\'', //SINGLE LOW-9 QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x9e) => '"', //DOUBLE LOW-9 QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0xa6) => '...', //HORIZONTAL ELLIPSIS
        chr(0xe2).chr(0x80).chr(0x98) => '\'', //LEFT SINGLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x99) => '\'', //RIGHT SINGLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x9c) => '"', //LEFT DOUBLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x9d) => '"', //RIGHT DOUBLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x93) => '-', //EN DASH
        chr(0xe2).chr(0x80).chr(0x94) => '-' //EM DASH
    );

    foreach ($trans_table as $utf8_code => $replace) {
        $var = str_replace($utf8_code, $replace, $var);
    }

    return trim($var);
}
array_walk_recursive($_POST, 'nasty_chars_replace');

在CodeIgniter中是否有一种方法可以对所有POST数据(如果存在POST)全局执行类似操作?
还有人会这样做吗?
是否有其他容易混淆的字符,我应该考虑“清洗”(而不是消毒)的数据一致性?

**编辑:**这是个好主意吗?
**EDIT 2:**我应该说我还对所有POST数据进行了trim(),以删除前导/尾随空格。因此,如果有人决定只使用空格填充输入,验证可能会失败。

bwitn5fc

bwitn5fc1#

好,回答您的部分问题-如果您使用CI的input class,它会为您执行安全筛选...当调用新控制器时,会自动调用安全筛选功能。
因此,如果使用**$this-〉input-〉post()**而不是$_POST....它
筛选GET/POST/COOKIE数组键,只允许字母数字(和少数其他)字符。
Input类具有自动过滤输入以防止跨站脚本攻击的功能。如果你想让过滤器在每次遇到POST或COOKIE数据时自动运行,你可以打开application/config/config.php文件并设置如下:
$config['global_xss_filtering'] = TRUE;
或仅在需要时使用TRUE作为第二个参数。

$this->input->post(NULL, TRUE); // returns all POST items with XSS filter

因此我认为您可以扩展核心Input类,

class MY_Input extends CI_Input {

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

并在此处添加自定义函数来替换某些字符和修整值。然后,此Input类为您预处理全局输入数据以确保安全性和数据库一致性。
希望能有所帮助

dced5bon

dced5bon2#

如果您希望对所有POST数据运行此函数,而无需 * 每次 * 都调用此函数,请考虑将其放在控制器的构造函数中,或者放在控制器父级的构造函数中。

在控制器的构造函数中:

class Home extends CI_Controller{
    function __construct(){
        parent::__construct();
        if(!empty($_POST)) array_walk_recursive($_POST, 'nasty_chars_replace');
    }

    function index(){
        //typically a GET request, nasty_chars_replace will not execute.
    }

    function post_here1(){
        //will be nasty char cleaned.
    }

    function post_here2(){
        //will be nasty char cleaned.
    }

}

现在你可以想象,这必须写在你所有控制器的构造函数中。如果你只想写一次,考虑先从基类扩展你的控制器,然后把它写在父类的构造函数中:

在父控制器的构造函数中:

class MY_Controller extends CI_Controller{
    function __construct(){
        parent::__construct();
        if(!empty($_POST)) array_walk_recursive($_POST, 'nasty_chars_replace');
    }
}

...然后回到home.php

class Home extends MY_Controller{
    function __construct(){
        parent::__construct();
    }

    function index(){
        //typically a GET request, nasty_chars_replace will not execute.
    }

    function post_here1(){
        //will be nasty char cleaned.
    }

    function post_here2(){
        //will be nasty char cleaned.
    }
}

我鼓励您查看Phil Sturgeon的Keeping It Dry帖子,了解有关如何使用此基类继承的更多信息。

8ljdwjyq

8ljdwjyq3#

如果要防止XSS攻击,请尝试使用Codeigniter中的库:
1.在application/config/autoload.php中添加这个助手:
数组('安全性');
1.在application/config/config.php中设置为这个:
如果是,则将其设置为TRUE。
这将从XSS攻击中过滤所有GET、POST或COOKIE数据,并且工作正常

相关问题