XSS
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
tornado中已经为我们给屏蔽了XSS,但是当我们后端向前端写前端代码的时候传入浏览器是字符串,而不是形成代码格式。所以就需要一个反解,在传入模板语言中前面加一个raw,例如{% raw name %}
class IndexHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): jump = '''<input type="text"><a onclick = "Jump('%s',this);">GO</a>'''%('/index/') script = ''' <script> function Jump(baseUrl,ths){ var val = ths.previousElementSibling.value; if (val.trim().length > 0){ location.href = baseUrl + val; } } </script> ''' self.render('index.html',jump=jump,script=script) #传入两个前端代码的字符串
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 .pager a{ 8 display: inline-block; 9 padding: 5px; 10 margin: 3px; 11 background-color: #00a2ca; 12 } 13 .pager a.active{ 14 background-color: #0f0f0f; 15 color: white; 16 } 17 </style> 18 </head> 19 <body> 20 <div class="pager"> 21 {% raw jump %} 22 {% raw script%} 23 </div> 24 </body> 25 </html>
CSRF
CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的 cookie 数据,然后要求所有提交的请求中都必须带有这个 cookie 数据。如果此数据不匹配 ,那么这个请求就可能是被伪造的。
Tornado 有内建的 XSRF 的防范机制,要使用此机制,你需要在应用配置中加上 xsrf_cookies 设定:xsrf_cookies=True
简单来说就是在form验证里面生成了一段类似于自己的身份证号一样,携带着他来访问网页
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import tornado.web 5 import tornado.ioloop 6 7 class CsrfHandler(tornado.web.RequestHandler): 8 9 def get(self, *args, **kwargs): 10 self.render('csrf.html') 11 12 def post(self, *args, **kwargs): 13 self.write('已经收到客户端发的请求伪造') 14 15 16 settings = { 17 'template_path':'views', 18 'static_path':'statics', 19 'xsrf_cokkies':True, # 重点在这里,往这里看 20 } 21 22 application = tornado.web.Application([ 23 (r'/csrf',CsrfHandler) 24 ],**settings) 25 26 if __name__ == "__main__": 27 application.listen(8888) 28 tornado.ioloop.IOLoop.instance().start()
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/csrf" method="post"> 9 {% raw xsrf_form_html() %} 10 <p><input name="user" type="text" placeholder="用户"/></p> 11 <p><input name='pwd' type="text" placeholder="密码"/></p> 12 <input type="submit" value="Submit" /> 13 <input type="button" value="Ajax CSRF" onclick="SubmitCsrf();" /> 14 </form> 15 16 <script src="/statics/jquery-1.12.4.js"></script> 17 <script type="text/javascript"> 18 19 function ChangeCode() { 20 var code = document.getElementById('imgCode'); 21 code.src += '?'; 22 } 23 function getCookie(name) { 24 var r = document.cookie.match("\b" + name + "=([^;]*)\b"); 25 return r ? r[1] : undefined; 26 } 27 28 function SubmitCsrf() { 29 var nid = getCookie('_xsrf'); 30 $.post({ 31 url: '/csrf', 32 data: {'k1': 'v1',"_xsrf": nid}, 33 success: function (callback) { 34 // Ajax请求发送成功有,自动执行 35 // callback,服务器write的数据 callback=“csrf.post” 36 console.log(callback); 37 } 38 }); 39 } 40 </script> 41 </body> 42 </html>