我打算将现有的Intranet系统转换为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)?
还有其他人做过这样的事吗?
是否还有其他任何容易混淆的角色,我应该考虑“清理”(不进行消毒)以确保数据的一致性?
编辑:这是一个好主意吗?
编辑2:我应该说我还trim()
所有POST数据以及删除前导/尾随空格。因此,如果有人决定用空格填充输入,验证可能会失败。
答案 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数据上运行此操作而无需每次都调用函数,请考虑将其放在您的控制器的构造函数中,或者在构造函数中控制器的父母。
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帖子,了解有关如何使用此基类继承的更多信息。