1
ysc3839 2019-08-06 01:44:13 +08:00 via Android
为什么要解析后删除掉?直接转换成 HTML entity (例如 <),确保不会当成 html 代码就行了。
|
2
starsriver 2019-08-06 02:02:16 +08:00 via Android
entity 转换一句话的事情。
以及转换完加反斜杠才是正确做法吧。 |
3
locoz 2019-08-06 08:23:27 +08:00 via Android
这不就是个 html encode 吗,decode 回去就是正常的样子了啊
|
4
Leigg 2019-08-06 09:21:45 +08:00 via Android
xss 的解决方案就是将斜杠括号引号全部转义。
|
5
wyzerg OP @Leigg
@ysc3839 @locoz @starsriver 谢谢非常感谢,我用 @ysc3839 方法试了下,用这个解决了 import html content=request.POST.get("content") content = html.unescape(content) soup = BeautifulSoup(content, "html.parser") ---------------- html.unescape 这个方法就是把转义的 script 标签( <script> ),再反转义回来( <script> ) 这样 for 循环,for tag in soup.find_all():就能拿到正规的<script>标签了,然后避免 xss 就把他 decompose() 删除掉就可以了,非常感谢 |
6
ysc3839 2019-08-06 14:47:27 +08:00 via Android
@wyzerg 我还是认为你没必要删除。你要实现的是把这段代码直接作为 html 代码插入页面中吗?那我还可以用 img onerror 来执行脚本,办法多了去了。最终会变成猫鼠游戏。
|
7
wyzerg OP @ysc3839 老哥,那比如博客园,csdn 那种,放代码进去就是你的办法吗,你的意思是,<script> 获取到了,不转 script 了,那我存数据库就是<script> ,那前端调用呢?我应该模板用 safe 吧,这么说我有点懵了😂
|
8
no1xsyzy 2019-08-06 15:53:15 +08:00
额你这是拿 contenteditable="true" 做编辑器?
不要转换啊,<safeHTML>"<" 直接传给前端不会含可执行的标签的。 |
9
no1xsyzy 2019-08-06 16:00:27 +08:00
|
10
wyzerg OP @no1xsyzy 嗯嗯 我解释下哈
前端我用的是 KindEditor 做编辑器,在正常输入: <span>123</span> <script>alert(123)</script> 然后 post 请求发给后端 后端 request.POST 拿到数据 查看这条数据是变成了: </span>123<span style="color:#6a8759;"> <script>alert(123)</script> 如果为了展示给前端,用模板语法{{ article_obj.content|safe }}:显示:<span>123</span> 效果 所以把 script 过滤掉了。。。 |