用于URL使用的Codeigniter过滤器输出

时间:2012-06-06 16:18:51

标签: php codeigniter

我可能在考虑这个问题,但是假设我在数据库上有一个网站字段。我使用strip_tags去除所有HTML标记。但是如果用户输入了这个

的javascript:警报( '试验')

它会被传递,因为它是一个字符串。但是,HTML将生成

<a href="<?php echo prep_url($website);?>">Website</a> //the code in view file
<a href="javascript:alert('test')">Website</a> //bad

如果点击则会执行Javascript。另请注意,prep_url不起作用。

有什么建议吗?我看过HTMLPurifier,但它的大小非常大,我真的不想做一些重大改变。

由于

2 个答案:

答案 0 :(得分:2)

如果您需要网址,则不应使用strip_tags,您应该验证网址,并且可能urlencode。这是filter_var的一种方式:

$url = "javascript:alert('test')";
var_dump(filter_var($url, FILTER_VALIDATE_URL));
// bool(false)

$url = "http://stackoverflow.com/questions/10918132";
var_dump(filter_var($url, FILTER_VALIDATE_URL));
// string(43) "http://stackoverflow.com/questions/10918132"

因此,如果filter_var($user_input, FILTER_VALIDATE_URL)FALSE,请勿接受用户输入。这应该取消对CI xss_clean()的需求,尽管您可能希望在将其放入HTML属性时仍然运行它。如果您不需要用户输入prep_url部分,则可能需要在验证前对输入运行http://

有很多方法可以验证网址,只需选择一个您喜欢的网址。

答案 1 :(得分:1)

Codeigniter有一个xss过滤器类。这不是世界上最好的东西,但它可以过滤最常见的问题。 Security class

您可以通过更改配置文件中的选项使codeigniter过滤所有POST和GET,或者您可以通过执行此操作来要求手动过滤。

$this->input->post('whatever',TRUE); //Note the TRUE