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

Php CodeIgniter替换所有POST输入中的选定字符,php,codeigniter,post,character-encoding,replace,Php,Codeigniter,Post,Character Encoding,Replace,我计划将现有的内部网系统转换为CodeIgniter。我始终使用UTF-8,因此它可以处理各种不同的字符,这对于系统来说是必不可少的(输出发票、地址标签等) 我决定在输入时自动替换几个字符,因为它们常常会让系统的用户感到困惑 单引号和双引号。替换为普通撇号/引号 En破折号和em破折号,替换为普通连字符 省略号,替换为三个句号 至少这些标点符号现在都得到了一致的使用和存储 在这个系统中,要存储在数据库中的数据总是由POST接收,所以我在每次页面加载时在POST数组上运行以下函数 functi

我计划将现有的内部网系统转换为CodeIgniter。我始终使用UTF-8,因此它可以处理各种不同的字符,这对于系统来说是必不可少的(输出发票、地址标签等)

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

  • 单引号和双引号。替换为普通撇号/引号
  • En破折号和em破折号,替换为普通连字符
  • 省略号,替换为三个句号
至少这些标点符号现在都得到了一致的使用和存储

在这个系统中,要存储在数据库中的数据总是由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数据,以及删除前导/尾随空格。因此,如果有人决定用空格填充输入,验证可能会失败。

好吧,回答您的部分问题-如果您使用CI,它会为您进行安全筛选。。。当调用新控制器时,将自动调用安全筛选功能

因此,如果您使用$this->input->post()而不是$\u post。。。。它

过滤GET/POST/COOKIE数组键,只允许字母数字 (和其他一些)字符

Input类能够自动过滤输入,以防止跨站点脚本攻击。如果希望过滤器在每次遇到POST或COOKIE数据时自动运行,可以通过打开应用程序/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();
    }
}
并在此处添加自定义函数以替换某些字符并修剪值。 然后,该输入类预处理全局输入数据,以确保安全性和数据库一致性


希望它能帮助你很好地回答部分问题-如果你使用CI,它会为你进行安全过滤。。。当调用新控制器时,将自动调用安全筛选功能

因此,如果您使用$this->input->post()而不是$\u post。。。。它

过滤GET/POST/COOKIE数组键,只允许字母数字 (和其他一些)字符

Input类能够自动过滤输入,以防止跨站点脚本攻击。如果希望过滤器在每次遇到POST或COOKIE数据时自动运行,可以通过打开应用程序/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();
    }
}
并在此处添加自定义函数以替换某些字符并修剪值。 然后,该输入类预处理全局输入数据,以确保安全性和数据库一致性


<>希望它有助于

如果您想在所有的POST数据上运行此操作,而不必每次调用该函数,可以考虑将其放置在控制器的构造函数中,或者考虑到控制器的父方的构造函数。< /P> 在控制器的构造函数中: 现在,正如您所想象的,这必须写入所有控制器的构造函数中。如果您只想写一次,请考虑首先将控制器从基类扩展,并将其写入父对象的构造函数:

在父控制器的构造函数中: …然后回到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 STURGEN的帖子,了解如何使用基类继承。

< P>如果您想在所有POST数据上运行此操作,而不必每次调用该函数,则可以考虑将其放置在控制器的构造函数中,或者在控制器父级的构造函数中

在控制器的构造函数中: 现在,正如您所想象的,这必须写入所有控制器的构造函数中。如果您只想写一次,请考虑首先将控制器从基类扩展,并将其写入父对象的构造函数:

在父控制器的构造函数中: …然后回到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的帖子,了解有关如何使用基类继承的更多信息。

是的,我看到它处理数组键,这很好。但恐怕XSS不是我要问的。我想知道如何从数据存储/一致性的角度替换某些字符。@benjobradley-是的,您可以扩展输入类并在其中添加自定义函数。e、 g.
类MY_Input扩展了CI_Input{function{uuuu construct(){parent::{uuu construct();}}
这将回答
是否有一种方法可以在CodeIgniter中全局地对所有POST数据(如果POST存在)执行类似的操作?
我想是有趣的。我会在哪里做?在我的控制器里?是否有它可以应用于所有控制器的地方?是的,您可以使用输入类或挂钩应用于所有控制器。看看这些-是的,我看到它处理数组键,这很好。但恐怕XSS不是我要问的。我想知道如何替换数据存储/consi中的某些字符