在Web开发中很多地方需要用户输入富文本但又要确保输入的这些内容绝对安全不会引发XSS漏洞,那么最常用的技术就是白名单技术。

白名单的通常做法都是构建一个允许使用的标签及对应属性的列表,然后对用户输入的HTML文本进行解析,解析出的tag及属性去白名单中进行查找,如果对应上了,那么就保留下来,没有对应上就进行移除。白名单的结构都是这样一个层次: 允许的tag->允许的属性->允许的属性值。拿img标签来举例,我们允许在博客中插入图片标签,那么img标签就被允许,img标签有很多的属性,比如src、alt、onerror、onload等等,其中src是必须的,alt属性无法执行任何javascript代码,但onerror和onload是可以执行javascript代码,因此只保留src和alt属性,src属性允许很多类型的值,比如以http开头的链接,以javascript:开头的bookmarklet还有以data:开头的data url, javascript:和data:在某些类型的浏览器里面都有引发XSS的风险,因此不能允许这两种类型的值,只允许http://开头的图片链接,这就需要继续对属性值进行匹配。每个标签完成这三个层次的匹配才能说是安全的,我们在设计白名单的时候这三个层次任何一个层次也都不能漏掉。

代码实现如下:

regex_cache = {}

def search(text, regex):

regexcmp = regex_cache.get(regex)

if not regexcmp:

regexcmp = re.compile(regex)

regex_cache[regex] = regexcmp

return regexcmp.search(text)

# XSS白名单

VALID_TAGS = {'h1':{}, 'h2':{}, 'h3':{}, 'h4':{}, 'strong':{}, 'em':{},

'p':{}, 'ul':{}, 'li':{}, 'br':{}, 'a':{'href':'^http://', 'title':'.*'},

'img':{'src':'^http://', 'alt':'.*'}}

def parsehtml(html):

soup = BeautifulSoup(html)

for tag in soup.findAll(True):

if tag.name not in VALID_TAGS:

tag.hidden = True

else:

attr_rules = VALID_TAGS[tag.name]

for attr_name, attr_value in tag.attrs:

#检查属性类型

if attr_name not in attr_rules:

del tag[attr_name]

continue

#检查属性值格式

if not search(attr_value, attr_rules[attr_name]):

del tag[attr_name]

return soup.renderContents()

下面拿一段html来做测试:

if __name__ == '__main__':

text = '''

Hello!

Hello

alert(1);' title='sddasdsadsd'/>

'''

print parsehtml(text) 过滤的结果:

Hello!

Hello

alert(1);' title='sddasdsadsd'/>

效果还不错~

python白名单验证-Python中XSS白名单过滤的实现相关推荐

  1. python白名单验证-python脚本简单检测ip合法性并添加到白名单文件

    一.功能说明 有时候项目需要通过ip地址来判定是否允许访问,通常通过一个白名单地址文件来存放这些允许放行的ip,但每次打开文件编辑比较麻烦,容易出错,也不知道是否添加过,故用python写了一个自动添 ...

  2. python白名单验证-JWT黑名单和白名单

    单点登录系统 单点登录系统保存了用户的登录名和密码,上网用户在单点登录系统中认证成功后,就可以直接登录各个业务系统. 1. 用户使用单点登录系统的登录界面,输入用户名和密码登录成功后, 单点登录系统为 ...

  3. python白名单验证是什么意思_luminati python+selenium使用方式(白名单和账号密码验证方式)...

    一,在Windows下使用 1.官网登录后下载对应的exe代理软件 2.下载完成后打开,打开完成后登录127.0.0.1:22999,然后输入用户名和密码进行登录.登录成功后进入到如下界面 3.将本机 ...

  4. 如何为ASP.NET Core设置客户端IP白名单验证

    本篇博文中展示了如何在ASP.NET Core应用程序中设置IP白名单验证的3种方式. 你可以使用一下3种方式: 使用中间件检查每个请求的远程IP地址 使用Action过滤器为指定的Controlle ...

  5. 白月黑羽教python_白月黑羽Python在线教程

    推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程,帮助大家迅速掌握程序开发技能. http://www.python3.vip/doc/tutorial/p ...

  6. Python+OpenCV判断图像是黑底还是白底

    前言 本篇博客使用Python+OpenCV判断图像是黑底还是白底,利用图像对角线上的黑白像素点个数进行判断,详情见下文. 本篇博客内容包含代码逻辑.说明.依赖.实现,这几部分.代码实现部分包含2种实 ...

  7. 白月黑羽python_白月黑羽Python在线教程

    推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程,帮助大家迅速掌握程序开发技能. http://www.python3.vip/doc/tutorial/p ...

  8. 白月黑羽教python_其他 | 白月黑羽教Python

    都说Python执行效率不高,为什么还要学习它? 就像你买了一辆汽车,有人却说, 汽车开的比飞机慢多了,买什么汽车啊. 然而,生活中大部分的场合,用汽车比用飞机方便的多. 同样的道理通常你开发的程序( ...

  9. 【区块链 | Merkle】使用Merkle Tree空投,白名单验证

    Merkle Tree在高效验证数据的同时减少了链上计算和存储,因为非常适合基于区块链的白名单验证,空投,IDO等需要验证数据的业务. Merkle Tree介绍 默克尔树,在区块链出现前,曾广泛用于 ...

最新文章

  1. node学习笔记--模块加载
  2. 学习ASP.NET Core Razor 编程系列十八——并发解决方案
  3. UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
  4. Android音频焦点AudioFocus使用
  5. 高手也不好当,压力更大
  6. 如何写出优秀的开源简历
  7. 主角连击敌人处理:连击次数的显示(图片数字字体)---1
  8. 漫步微积分二十五——面积问题
  9. AI笔记: 数学基础之反函数和6个基本初等函数
  10. Java知识复习清单
  11. 可视化框架、Axure原型、大屏可视化、图表组件、图表元件库、统计图表、数据可视化模板、条形图、折线图、散点图、时间轴、仪表盘、饼图、散点图、雷达图、高山图、登录模板、弹窗、弹幕、预警、散点图
  12. hexo博客如何绑定个人域名
  13. 永嘉县公安退休干部李建初诗词创作助力正能量
  14. NodeMCU 之 U8G2 库使用详解
  15. Windows下‘gbk‘ codec can‘t decode byte 0xae问题出现的原因及解决方法
  16. php民主评议源码,校园表白墙php源码
  17. 在一个国家仅有1分,2分,5分硬币,将n(n=5)分钱兑换成硬币有很多种兑法。请你编程序计算出10分钱共有多少种兑法,并列出每种兑换方式。
  18. 插入脚注把脚注标注删掉_CSS中的经典版式效果:脚注
  19. 利用Python自动操纵鼠标键盘刷金币,工作室都是靠这种搬砖
  20. Android编程的写法规范

热门文章

  1. 终端安全工具 gartner 排名
  2. selenium 测试
  3. 探究netty的观察者设计模式
  4. 导出excel--多个sheet
  5. 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...
  6. 转帖:iOS UIWindow UIWindowLevel
  7. 一种另类的解决URL中文乱码问题--对中文进行加密、解密处理
  8. Boosting(提升方法)之XGBoost
  9. tomcat的服务器配置详解
  10. Rational Rose2007无法启动,提示缺少“suite objects.dll”