我可能对此想得太多,但假设我在数据库中有一个网站字段。我使用 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,但它的大小相当大,我真的不想做一些重大改变。
谢谢
最佳答案
如果您需要 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 属性时您可能仍希望运行它。如果您不要求用户输入 http://
部分,您可能需要在验证之前对输入运行 prep_url
。
验证 URL 的方法有很多种,只需选择您喜欢的一种即可。
关于php - Codeigniter 过滤输出以供 URL 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10918132/