【发布时间】:2021-01-04 13:37:17
【问题描述】:
我一直在做服务器端 XSS 验证。这是我发现使用的:
禁止属性列表:javascript:,mocha:,eval(,alert(,vbscript:,livescript:,expression(,url(,&{,&#,/*,*/,onclick,oncontextmenu,ondblclick,onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseover,onmouseout,onmouseup,onkeydown,onkeypress,onkeyup,onblur,onchange,onfocus,onfocusin,onfocusout,oninput,oninvalid,onreset,onsearch,onselect,onsubmit,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,oncopy,oncut,onpaste,ontouchcancel,ontouchend,ontouchmove,ontouchstart,onwheel
但它们似乎过于严格,因为如果我使用此列表,一些正确的值(例如“™”)被认为是非法的。
我在想,如果只检查不包含任何字符的值,如 ''、“%3E”、“%3C”,是否可以安全地防止 XSS 攻击?
【问题讨论】:
-
不要尝试进行 xss 预防。它不会起作用,并且会不断存在漏洞。如果您不需要完整的 HTML,那么只需使用
innerText之类的东西来避免整个事情,而不必使用任何过滤。如果您确实需要 HTML,则无论如何都应该进行客户端验证(由于浏览器呈现的不一致,很难制作可以在所有浏览器上停止 XSS 的服务器端应用程序),但如果不需要,您应该使用一个完善的图书馆,如HtmlSanitizer -
哪些字符是安全的,哪些字符不是高度,大量取决于用户输入的确切位置插入。
-
@Aplet123 我们已经对其进行了客户端验证。我要做的是防止有人使用 curl 向我们发送非法值。我无法控制这些值的呈现位置。如果它们包含任何脚本,我需要防止它们被持久化到数据库中。