1. 前言
XSRF名為跨站請求偽造萍肆,也被稱為CSRF(Cross-site request forgery)九妈。任何Web應用都有可能面臨跨站請求偽造這一安全漏洞,該漏洞允許一個惡意的攻擊者在受害者網(wǎng)站上運行未授權(quán)的請求。包括以被攻擊者的身份發(fā)送信息赢织,盜取賬號,購買商品等操作逛拱。
2.跨站請求攻擊原理
簡述XSRF攻擊的原理圖:
分析圖XSRF攻擊原理中各請求:
請求1: 用戶瀏覽并登陸受信任的網(wǎng)站A敌厘。
請求2: 網(wǎng)站A驗證用戶登錄成功,在瀏覽器中保存網(wǎng)站A返回的Cookie朽合。
請求3: 用戶在沒有退出網(wǎng)站A的情況下俱两,放問不受信任的網(wǎng)站B。
請求4: 不受信任的網(wǎng)站B要求訪問訪問網(wǎng)站A的URL曹步,這時瀏覽器會帶上網(wǎng)站A的Cookie
發(fā)出這個請求(請求5)宪彩。因此網(wǎng)站A以為當前訪問該URL是用戶主動的行為,
達到跨站請求攻擊的目的讲婚。
3. 跨站請求攻擊防御
跨站請求攻擊的防御方法很多尿孔,但基本思想都是一致的,那就是每個請求都必須包含一個存儲在cookie中的參數(shù)值作為令牌筹麸。當一個合法的表單被提交時活合,它將提交表單的信息和已存儲在cookie中的令牌值,如果服務端驗證該令牌不匹配物赶,則認為請求不合法白指,不給于響應。通過這種形式達到防御跨站攻擊酵紫,在Tornado中可以如下示例配置實現(xiàn)防御請求攻擊告嘲。
XSRF防御:
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
from tornado.options import define, options
define("port", default=8080, help="run on the given port", type=int)
class RegisterHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('register.html')
def post(self, *args, **kwargs):
username = self.get_argument('username')
password = self.get_argument('password')
# 忽略驗證注冊的賬號错维、密碼功能和實現(xiàn)賬號數(shù)據(jù)存儲在數(shù)據(jù)庫的操作
self.write('注冊成功')
def make_app():
return tornado.web.Application(handlers=[
(r"/register/", RegisterHandler),
],
template_path=os.path.join(os.path.dirname(__file__), "templates"),
# 開啟xsrf加密
xsrf_cookies=True,
cookie_secret='cqVJzSSjQgWzKtpHMd4NaSeEa6yTy0qRicyeUDIMSjo=')
if __name__ == "__main__":
tornado.options.parse_command_line()
app = make_app()
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
模板register.html如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注冊頁面</title>
</head>
<body>
<form action="" method="post">
{% module xsrf_form_html() %}
<p>賬號: <input type="text" name="username"></p>
<p>密碼 <input type="text" name="password"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
以上示例中需要注意如下兩點即可:
1)在實例化Appllication對象時,傳入xsrf_cookies參數(shù)并設(shè)置為True橄唬。
2)在模板register.html中添加{% module xsrf_from_html() %}赋焕,在渲染模板文件時,該標簽會解析為name=‘_xsrf’的隱藏input標簽仰楚。