Django之XSS攻击
Django之XSS攻击
XSS是什么:XSS是跨站脚本攻击。
XSS可以获取用户的信息,比如登录凭证Cookie,那样就可以登录用户的账号,但是在django中,XSS 是默认阻止的。因为在django中,a标签是字符串类型的。
比如在评论中提叫script的代码,会以字符串的形式显示出来。
views.py
msg = [] def comment(request): if request.method =="GET": return render(request,"comment.html") else: v = request.POST.get("content") msg.append(v) return render(request,"comment.html") def index(request): return render(request,"index.html",{"msg":msg})
comment.html
<body> <form action="/comment/" method="post"> <input type="text" name="content"> <input type="submit" value="submit"> </form> </body> </html>
index.html
<body> <h1>评论</h1> {% for foo in msg %} <div>{{ foo }}</div> {% endfor %} </body> </html>
结果:
但XSS也是可以生效的,那就是使其这个提交的评论是safe的。
index.html
<body> <h1>评论</h1> {% for foo in msg %} <div>{{ foo|safe }}</div> {% endfor %} </body> </html>
这样的话,只要在前端提交一个script的代码,那么基本上每次访问index页面都会有alert提示。
这样的话,那个script会以代码的形式注入到页面中,并运行。
但是如何不写safe,也可以阻止XSS,也既是要在提交的数据中进行筛选。
views.py
msg = [] def comment(request): if request.method =="GET": return render(request,"comment.html") else: v = request.POST.get("content") if "script" in v: return render(request,"comment",{"error":"禁止XSS注入,存在安全隐患"}) else: msg.append(v) return render(request,"comment.html")
comment.html
<body>
<form action="/comment/" method="post"> <input type="text" name="content"> <input type="submit" value="submit">{{ error }} </form>
</body>
导入from django.utils.safestring import mark_safe 也是可以的
用mark_safe也是可以阻止的。
总结:
阻止XSS的两种方式:
一、在前端模板里标记safe
二、在后端代码中使用模块的方法mark_safe
------------ END -----------