我有一个聊天网站,我想知道它是否安全。让我解释一下我的方法是什么。
我使用这个JQuery代码将新消息添加到从ajax请求传入的屏幕:
$("#message").prepend(req.msg);
我知道这很脆弱,但DB上的消息是编码的。所以当我发送有效载荷消息时:
<text>TEST</test>
它以编码方式存储在数据库中:
<text>TEST</test>
我知道在this回答中绕过.htmlentities()函数的场景。不久:
<input value=<%= HtmlEncode(somevar) %> id=textbox>
如果我们向此html代码发送a onclick=alert(document.cookie)
输入,则会变为:
<input value=a onclick=alert(document.cookie) id=textbox>
因此,在这种情况下,编码< > ; &
字符无法保存我们。但是我没有写这样的代码,所以我认为我从这个漏洞中获得了安全感。我的服务器响应这样的JSON:
..."msg" : "<tr><td><b>user:<\b> <text>TEST</test><\td><\tr>",...
我将“msg”数据直接(.prepend())放到页面中。我认为这是完全安全的。黑客必须使用< > ; &
个字符到XSS。我还将\
编码为\\
。但也许我错过了一些东西。那是完全安全的吗?
答案 0 :(得分:1)
号。不是。传输数据的方式使得某人可以输入未转义的HTML标签。假设某人发布了此有效负载:
\n
这将按原样输入数据库,因为\u003cscript\u003ealert(1)\u003c/script\u003e
没有任何内容可以逃脱。但是,当它被放入JSON,并且说JSON被解析时,就会变成这样:
htmlencode
并执行恶意代码。更好的解决方案是对 JSON 的原始数据进行编码,然后在客户端使用HTML转义机制。
随着服务器端在JSON中转义<script>alert(1)</script>
,我认为这是完全安全的。