2

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

javascript:alert('测试')

它会被传递,因为它是一个字符串。但随后,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,但它的尺寸很大,我真的不想做一些重大的改变。

谢谢

4

2 回答 2

2

如果您期望一个 url,您不应该使用strip_tags,您应该验证该 URL 并且可能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://

验证 URL 的方法有很多种,只需选择您喜欢的一种即可。

于 2012-06-06T16:27:06.897 回答
1

Codeigniter 有一个 xss 过滤器类。这不是世界上最好的东西,但它过滤了最常见的问题。安全等级

您可以通过更改配置文件中的选项使 codeigniter 过滤所有 POST 和 GET,或者您可以通过这样做要求手动过滤。

$this->input->post('whatever',TRUE); //Note the TRUE
于 2012-06-06T16:23:11.677 回答