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

时间:2012-09-19 14:42:05

标签: php codeigniter post character-encoding replace

我打算将现有的Intranet系统转换为CodeIgniter。我一直使用UTF-8,所以它可以处理各种不同的字符,这对系统来说是必不可少的(输出发票,地址标签等)。

我决定自动替换几个字符,因为它们常常会让系统用户感到困惑。

  • 单引号和双引号。替换为普通撇号/引号
  • En dash and em dash,替换为普通连字符
  • Ellipses,取而代之的是三个句号

现在至少使用这些标点符号并一致地存储。

在这个系统中,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)?

还有其他人做过这样的事吗? 是否还有其他任何容易混淆的角色,我应该考虑“清理”(不进行消毒)以确保数据的一致性?
编辑:这是一个好主意吗?

编辑2:我应该说我还trim()所有POST数据以及删除前导/尾随空格。因此,如果有人决定用空格填充输入,验证可能会失败。

2 个答案:

答案 0 :(得分:1)

回答部分问题 - 如果您使用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 

所以我想你可以扩展核心的输入类

class MY_Input extends CI_Input {

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

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

希望有所帮助

答案 1 :(得分:0)

如果您想在所有POST数据上运行此操作而无需每次都调用函数,请考虑将其放在您的控制器的构造函数中,或者在构造函数中控制器的父母。

在Controller的构造函数中:

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帖子,了解有关如何使用此基类继承的更多信息。