我计划将现有的内联网系统转换为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()
,以删除前导/尾随空格。因此,如果有人决定只使用空格填充输入,验证可能会失败。
3条答案
按热度按时间bwitn5fc1#
好,回答您的部分问题-如果您使用CI的input class,它会为您执行安全筛选...当调用新控制器时,会自动调用安全筛选功能。
因此,如果使用**$this-〉input-〉post()**而不是$_POST....它
筛选GET/POST/COOKIE数组键,只允许字母数字(和少数其他)字符。
Input类具有自动过滤输入以防止跨站脚本攻击的功能。如果你想让过滤器在每次遇到POST或COOKIE数据时自动运行,你可以打开application/config/config.php文件并设置如下:
$config['global_xss_filtering'] = TRUE;
或仅在需要时使用TRUE作为第二个参数。
因此我认为您可以扩展核心Input类,
并在此处添加自定义函数来替换某些字符和修整值。然后,此Input类为您预处理全局输入数据以确保安全性和数据库一致性。
希望能有所帮助
dced5bon2#
如果您希望对所有POST数据运行此函数,而无需 * 每次 * 都调用此函数,请考虑将其放在控制器的构造函数中,或者放在控制器父级的构造函数中。
在控制器的构造函数中:
现在你可以想象,这必须写在你所有控制器的构造函数中。如果你只想写一次,考虑先从基类扩展你的控制器,然后把它写在父类的构造函数中:
在父控制器的构造函数中:
...然后回到home.php:
我鼓励您查看Phil Sturgeon的Keeping It Dry帖子,了解有关如何使用此基类继承的更多信息。
8ljdwjyq3#
如果要防止XSS攻击,请尝试使用Codeigniter中的库:
1.在application/config/autoload.php中添加这个助手:
数组('安全性');
1.在application/config/config.php中设置为这个:
如果是,则将其设置为TRUE。
这将从XSS攻击中过滤所有GET、POST或COOKIE数据,并且工作正常