1. Django處理XSS攻擊
Django本身默認可以處理XSS攻擊,例如:
views.py
:
def test(request):
ret = '<script>alert("XSS")</script>'
return render(request, 'test.html', {'ret': ret})
test.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ ret }}
</body>
</html>
並沒有解析傳入的字符串,當作js腳本來執行。
但是當傳入到模板的數據是我們自己的並且是安全的,我們想要告訴系統這是安全的應該如何去做呢!有兩種方法,分別是後端標記字符串和前端標記字符串。
2. 前端標記字符串
在模板上寫 |safe
的方法可以標記字符串是安全的,可以去解析執行:
test.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ ret|safe }}
</body>
</html>
3. 後端標記字符串
後臺把字符串標記成安全的需要在傳入模板之前就操作,使用到的是 django.utils.safestring
模塊中的 mark_safe
函數:
views.py
:
def test(request):
from django.utils.safestring import mark_safe
ret = '<script>alert("XSS")</script>'
ret = mark_safe(ret)
return render(request, 'test.html', {'ret': ret})
test.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ ret }}
</body>
</html>
與前端標記一樣: