我所有的用户输入都使用 htmlentities() 进行了清理。这足够了吗?(我使用准备好的语句进行 SQL 注入)
没有。首先,您应该过滤输出,而不是输入。在编程中永远不要相信任何数据,即使是那些来自你自己数据库的数据!在输入时,您只需将其转义以用于 SQL、日志等。但您还必须过滤基本的 html + 一些特殊字符:\0 & < > ( ) + - = " ' \
输出。htmlentities() 是不够的。
假设您在网站上有一张图片:
<img src="xxx" onload="image_loaded({some_text_from_db});">
{some_text_from_db}
将会);alert(String.fromCharCode(58,53,53)
如果您仅使用 htmlentities 对其进行转义,它将变为:
<img src="" onload="image_loaded( );alert(String.fromCharCode(58,53,53) );">
一些用户输入在服务器端具有 5 个字符的最大长度条件。这是否有助于防止 XSS?(因为我几乎看不到 XSS 代码短于 6 个字符)
总是在服务器端检查数据,如果你也想在客户端,没关系,但总是在服务器端也这样做。许多现代浏览器(chrome、ff、opera)允许用户“即时”编辑页面,以便他们可以轻松删除 maxlength 属性。
除了来自数据库的数据,唯一显示给用户的用户输入是通过 ajax 发送到服务器的,使用 htmlentities 进行清理,并使用 text() 而不是 html()(使用 jQuery)在 DOM 中重新引入
来自 .text() jquery 文档:
我们需要注意,此方法会根据需要对提供的字符串进行转义,以便在 HTML 中正确呈现。为此,它调用 DOM 方法 .createTextNode(),该方法将特殊字符替换为其 HTML 实体等效项(例如 < 表示 <)。
所以可能是的,应该足够了,但要注意从 text() 中转义,就像上面的例子一样。
您的应用程序过滤应如下所示:
- 输入用户 -> 过滤器 -> 应用程序
- 输出应用 -> 过滤器 -> 用户
不仅仅是输入过滤。