注意:我负责 SQL 注入(inject)和其他地方的输出转义 - 这个问题仅与输入过滤有关,谢谢。
我正在重构我的用户输入过滤函数。在使用 filter_var() 将 GET/POST 参数传递给特定类型的过滤器之前我执行以下操作:
- 用mb_detect_encoding()检查参数编码
- 使用 iconv() 转换为 UTF-8 (使用//IGNORE)如果不是 ASCII 或 UTF-8
- 使用 a function found on GnuCitizen.org 清理空白
- 通过 strip_tags() 传递结果- 完全不允许使用标签,仅限 Markdown
现在的问题是:将参数传递给像 htmLawed 这样的过滤器是否仍然有意义?或 HTML Purifier ,或者我可以认为输入是安全的吗?在我看来,这两者的主要区别在于允许的 HTML 元素和属性的粒度(我不感兴趣,因为我删除了所有内容),但是 htmLawed 文档有一个关于' dangerous characters 的部分' 这表明可能有使用它的理由。在这种情况下,什么是合理的配置?
最佳答案
有许多不同的 XSS 安全方法。要知道您的方法是否站得住脚的唯一原因是通过开发进行测试。我建议使用 Free XSS vulnerability Scanner *,或开源 wapiti .
老实说我永远不会使用 strip_tags() 因为你并不总是需要 html 标签来执行 javascript!我喜欢 htmlspecialchars($var,ENT_QUOTES);
。
例如,这容易受到 xss 攻击:
print('<A HREF="http://www.xssed.com/'.strip_tags($_REQUEST[xss]).'">link</a>');
在这种情况下你不需要 <> 来执行 javascript 因为你可以使用 onmouseover,这里是一个示例攻击:
$_REQUEST[xss]='" onMouseOver="alert(/xss/)"';
ENT_QUOTES 将处理双引号,这将修补此 XSS 漏洞。
*我隶属于此站点/服务。
关于php - 用户输入过滤——我需要过滤 HTML 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2305435/