web网络安全
web安全
一,xss
跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代码会被执行,从而达到恶意攻击用户的目的。XSS是攻击客户端,最终受害者是用户,当然,网站管理员也是用户之一。
XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
1.1.危害:
1.用户的Cookie被获取,其中可能存在Session ID等敏感信息。若服务器端没有做相应防护,攻击者可用对应Cookie登陆服务器。
2.攻击者能够在一定限度内记录用户的键盘输入。
3.攻击者通过CSRF等方式以用户身份执行危险操作。
4.XSS蠕虫。
5.获取用户浏览器信息。
6.利用XSS漏洞扫描用户内网。
2.2.防御:
1.标签过滤
2.事件过滤
3.敏感字符过滤
4.设置httponly防止Cookie被获取
5.内容安全策略(CSP)
6.在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码
7.在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码
8.在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码
9.在将不可信数据插入到Style属性里时,对这些数据进行CSS编码
当然,如果过过滤不全,或者CSP配置错误,也可能被绕过。
参考文章:https://blog.csdn.net/lady_killer9/article/details/107126005
二,CSRF
CSRF (Cross—Site Request Forgery),既跨站点请求伪造,也被叫做 XSRF,和 XSS 一样也是一种比较常见的 web 攻击。CSRF攻击者会过过构造的第三方页面诱导受害者完成加载或者点击,利用受害者的权限,以其身份向合法网站发起恶意请求,通常用户发生状态改变的请求,比如虚拟货币的转账,账号信息修改,恶意发邮件等等,由于具有一定的隐蔽性,所以比较防范。
2.1.CSRF 的防范
目前主要有如下几种方式:
-
添加 Referer 域名白名单:HTTP 的 Referer 头记录了当前请求的来源页面的URL,如果用户是通过浏览器打开的网页一般都会带有这个信息。可以验证 URL 的域名是否在网站允许的白名单呢内,如果不在则拒绝请求。这种方式实现比较简单,而且可以在web 服务器层统一配置,减少了后端开发成本,当 Referer 页可以伪造,用户浏览器的可靠性也不能完全信赖,判断 Referer 可以做为一种辅助手段,但不能根治 CSRF。
-
令牌 (Token )验证:令牌验证的方式,这是目前方法CSRF的一种普遍方法,其原理是在用户正式提交数据更新之前,给用户生成一个 token,一方面token保存在服务端,比如Session 或者缓存中,一方面输出请求发生的页面上,在用户提交请求时连同token一同提交,服务获得接收到请求之后再做token验证,token 不存在、或者token不一致,或者失效都算作验证失败。token 的生成具有一定的随机性,而且是在提交数据的页面生成,攻击这往往难于伪造。token 一般作为一个post 字段提交,或者作为ajax请求的header信息提交
2.2.为什么token可以防止CSRF攻击,cookies不可以?
CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击是一种利用用户已经在其他网站上登录并保存了相关认证凭证(如Cookies)的情况下,通过恶意网站发起伪造请求的攻击方式。攻击者通过诱使用户访问恶意网站,利用已保存的认证凭证执行非法操作,例如进行转账、更改密码等。
Token可以防止CSRF攻击的主要原因有以下几点:
-
随机性:Token是由服务器生成的随机字符串,每次请求都会生成一个新的Token,并将其与用户会话相关联。攻击者无法获知这个随机字符串,因此无法构造有效的伪造请求。
-
不自动发送:与Cookies不同,Token不会自动附加在每个请求中。在需要验证用户身份的请求中,服务器会要求客户端主动发送该Token。这样,即使攻击者成功伪造了请求,但缺少正确的Token,服务器会拒绝执行该请求。
-
防止被窃取:Cookies存储在浏览器中,容易受到XSS(跨站脚本攻击)等攻击手段的窃取。而Token通常是存储在HTTP请求头中或作为请求参数发送,不会自动附加到每个请求中,因此更难以被窃取。
虽然Cookies也可以采取一些措施来减少CSRF攻击的风险(如SameSite属性、HttpOnly属性等),但这些措施仍然无法完全防止CSRF攻击。相比之下,Token通过引入随机性和主动验证的方式,提供了更可靠的防护机制。
需要注意的是,为了保证Token的安全性,开发者需要采取一些措施,例如使用HTTPS协议传输、设置适当的Token过期时间、确保Token的随机性和独一性等。只有在正确实施的情况下,Token才能有效地防止CSRF攻击。
2.3.为什么Token存储在HTTP请求头中或作为请求参数中,就不容易被窃取?Cookies存储在浏览器中,容易被窃取?
Token 存储在 HTTP 请求头或请求参数中相较于存储在浏览器的 Cookies 中,更难被窃取的原因主要有以下几点:
-
存储位置不同:Cookies 是存储在客户端浏览器中的,而 HTTP 请求头或请求参数通常是由服务端返回给客户端,然后由客户端发送给服务端的。由于服务端可以采用一些安全措施来保证 Token 的传输过程的安全性,例如使用 HTTPS 加密传输,因此 Token 存储在 HTTP 请求头或请求参数中更难被窃取。
-
相对短暂:为了确保 Token 的安全性,它们通常被设定为相对短暂的有效期,一旦过期就需要重新获取。这样即使攻击者窃取到 Token,也只能在一段时间内进行恶意操作。相比之下,Cookies 可能会存储很长时间,具有较高的风险。
-
不可见性:HTTP 请求头或请求参数是不可见的,除非通过网络抓包等手段才能获取到其中的信息。而 Cookies 存储在浏览器中,可以通过浏览器的开发者工具等手段来查看和修改。
需要注意的是,即使 Token 存储在 HTTP 请求头或请求参数中,也并不能完全避免被窃取的风险。为了保证 Token 的安全性,开发者还需要采取其他一些措施,例如确保 Token 的随机性和独一性、设置适当的有效期、限制 Token 的使用范围等。同时,开发者还需要对服务端进行认真的安全评估和漏洞扫描,及时修复可能存在的安全问题。
参考文章:https://coderxing.gitbooks.io/architecture-evolution/content/di-san-pian-ff1a-bu-luo/641-web-an-quan-fang-fan/6412-csrf.html
三,SQL
SQL 注入页也是一种常见的 Web 攻击方式,主要是利用后端程序的漏洞,针对数据库(主要是关系型数据库)进行攻击。攻击者通常通过输入精心构造的参数,绕过服务器端的验证,来执行恶意 SQL 语句,SQL注入会造成拖库(原始数据表被攻击者获取),绕过权限验证,或者串改、破坏、删除数据。数据往往是一个网站甚至一个公司的生命,一但SQL漏洞被攻击者利用通常会产生非常严重的后果,对于SQL 注入的防范需要开发者倍加重视。下面通过一个例子来演示SQL注入的攻击过程,对于一个登陆验证的请求一般需要通过用户输入的用户名和密码进行查询验证,查询SQL 语句如下:
SELECT * FROM users WHERE username = "$username" AND password = "$password";
比如攻击者已知一个用户名archer2017
,可以构造密码为 anywords" OR 1=1
,此时,此时后端程序的执行的SQL语句为:
SELECT * FROM users WHERE username = "archer2017" AND password = "anywords" OR 1=1;
这样无论输入什么样的密码,都会要绕过验证,如果更验证一些,构造密码为 anywords" OR 1=1;DROP TABLE users
,那么整个表都将被删除,执行SQL如下:
SELECT * FROM users WHERE username = "archer2017" AND password = "anywords" OR 1=1;DROP TABLE users;
3.1.SQL 注入的防范
SQL 注入发生绝大多数情况都是直接使用户输入参数拼装 SQL 语句造成的,防范 SQL 注入,主要的方式丢失避免直接使用用户输入的数据。
使用预编译语句(PreparedStatement):一方面可以加速 SQL 的执行,一方面可以防止SQL注入。理解 PreparedStatement 防范 SQL 注入的原理,先要理解预编译语句的原理,如下图所示:
(TODO重新画)
3.2.SQL 语句的编译分为如下几个阶段:
- 基本解析:包括SQL语句的语法、语义解析,以及对应的表和列是否存在等等。
- 编译:将 SQL 语句编译成机器理解客理解的中间代码格式。
- 查询优化:编译器在所有的执行方案中选择一个最优的。
- 缓存:缓存优化后的执行方案。
- 执行阶段:执行最终查询方案并返回给用户数据。
预编译语句指的是在缓存之后,在执行阶段的之前的编译后的语句,通过占位符来替代查询查询参数。同样的SQL,如果参数不同普通的SQL语句每次请求都会进行编译,而预编译语句只会编译一次,在执行阶段会从缓存中取出预编译语句并将占位符替换成查询参数数据,而在这个阶段SQL 语句已经是编译后的语句,参数数据只能最为纯数据使用,不能作为SQL语句的一部分,通过SQL字符串的拼装已经不起作用,所以可以避免SQL注入。
Java 代码中使用预编译语句:
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, username);
pstmt.setString( 2, password);
ResultSet results = pstmt.executeQuery( );
PHP 中使用预编译语句:
$sth = $dbh->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
$sth->bindParam(1, $username, PDO::PARAM_STR, 20);
$sth->bindParam(2, $password, PDO::PARAM_STR, 16);
$sth->execute();
预编译语句需要数据库支持,不过目前主流的关系型数据库如 MySQL,PostgreSQL都支持预编译语句。
如果不可避免地使用 SQL 语句进行拼装,可以对用户输入数据进行转移,尤其是多单双引号的转义。
Java 中可以使用 Apache Common类库的 StringEscapeUtils
中的方法,例如:
StringEscapeUtils.escapeSql(sql);
StringEscapeUtils.escapeSql 方法在最新版的Apache Common 类库中被移除掉,按照官方文档的说法,是为了避免引起程序员在处理SQL时的产生误解,官方推荐使用与预编译语句,而不是拼装字符串的方法。
或者使用 ESAPI (OWASP Enterprise Security API),是一套开源的企业级的安全过滤组件。
Codec MYSQL_CODEC = new MySQLCodec(MySQLCodec.Mode.STANDARD);
String query = "SELECT * FROM users WHERE username = '"+ ESAPI.encoder().encodeForSQL(MYSQL_CODEC, username) + "' AND password = '" + ESAPI.encoder().encodeForSQL(MYSQL_CODEC, password) + "'";
在 PHP 中,如下面方法:
$username = mysql_real_escape_string($username);//或 addslashes($username)
$password = mysql_real_escape_string($password);
$sql = "SELECT * FROM users WHERE username = '$username'' AND password = '$password'";
另外,除了上述两种方案意外,还要用户输入的数据进行校验,Java 中可以使用 Apache Commons Validator 类库,PHP 中可以使用 filter_var 中的过滤器,可以参考(TODO)XSS 一节。
相关文章:

web网络安全
web安全 一,xss 跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时&…...

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码
目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分(Vue3)2.1. 新增依赖 cryp…...

安卓10 flutter webview 回退会闪退
现象 在安卓10设备上,访问了webview页面后,回退到其他页面后,大概率会闪退,请查看issuses https://github.com/flutter/flutter/issues/78405 解决思路:在回退前,先把webview销毁掉,重新生成一个…...

【Unity入门】物体5种移动方法
目录 一、通过修改位置来实现移动二、通过物理系统实现位移三、通过CharacterController组件四、通过输入控制物体移动 一、通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 使用Translate()函数 /*物体将向x方向移动1.5单位…...

Elasticsearch的 8.x常用api汇总
ES的查询语法比较复杂,对于初学者需要在不断练习中才会逐渐掌握,本文汇总了ES各种查询语法以及常用api,可以作为新手的实用笔记 首先,安装 Kibana! 下载Elasticsearch,官方下载页面;Elasticsearch 参考,官方文档;<...

k8syaml提供的几个有意思的功能,Kubernetes在线工具网站
k8syaml.cn 提供的几个有意思的功能。 一、yaml资源快速生成 之前编写operator的helm的时候就需要自己写deployment、service、configmap这些资源,那么多字段也记不清,都是先找个模版,然后copy改改,再看官方文档,添加…...

【图像分类】【深度学习】【Pytorch版本】 ResNeXt模型算法详解
【图像分类】【深度学习】【Pytorch版本】 ResNeXt模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】 ResNeXt模型算法详解前言ResNeXt讲解分组卷积(Group Converlution)分割-变换-合并策略(split-transform-merge)ResNeXt模型结构 ResNeXt Pytorch代码完整代码总…...

Android 14 应用适配指南
Android 14 应用适配指南:https://dev.mi.com/distribute/doc/details?pId1718 Android 14 功能和变更列表 | Android 开发者 | Android Developers 1.获取Android 14 1.1 谷歌发布时间表 https://developer.android.com/about/versions/14/overview#timeli…...

【AI美图提示词】第07期效果图,AI人工智能自动绘画,精选绝美版美图欣赏
AI诗配画 山水画中景如画,云雾缭绕峰峦间。桥畔流水潺潺响,诗意盎然山水间。上面的诗句和图片全部来自AI自动化完成,这就是技术的力量,接下来我们进行模型生成学习: 先上原始底图: 下面是模型生成效果图&a…...

前端知识(十三)——JavaScript监听按键,禁止F12,禁止右键,禁止保存网页【Ctrl+s】等操作
禁止右键 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右键禁止按键 // 监听按键 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…...

面向对象设计与分析(28)单例模式的奇异递归模板CRTP实现
前面我们介绍了单例模式的两种实现:懒汉模式和饿汉模式,今天我们以新的方式来实现可复用的单例模式。 奇异递归模板是指父类是个模板类,模板类型是子类类型,即父类通过模板参数可以知道子类的类型。 // brief: a singleton base…...

微信小程序 - 龙骨图集拆分
微信小程序 - 龙骨图集拆分 注意目录结构演示动画废话一下业务逻辑注意点龙骨JSON图集结构 源码分享dragonbones-split.jsdragonbones-split.jsondragonbones-split.wxmldragonbones-split.wxssimgUtil.js 参考资料 注意 只支持了JSON版本 目录结构 演示动画 Spine播放器1.5.…...

使用React 18和WebSocket构建实时通信功能
1. 引言 WebSocket是一种在Web应用中实现双向通信的协议。它允许服务器主动向客户端推送数据,而不需要客户端发起请求。在现代的实时应用中,WebSocket经常用于实时数据传输、聊天功能、实时通知和多人协作等场景。在本篇博客中,我们将探索如…...

vue3使用vue-router嵌套路由(多级路由)
文章目录 1、Vue3 嵌套路由2、项目结构3、编写相关页面代码3.1、编写route文件下 index.ts文件3.2、main.ts文件代码:3.3、App.vue文件代码:3.4、views文件夹下的Home文件夹下的index.vue文件代码:3.5、views文件夹下的Home文件夹下的Tigerhh…...

openGauss学习笔记-164 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-处理错误表
文章目录 openGauss学习笔记-164 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-处理错误表164.1 操作场景164.2 查询错误信息164.3 处理数据导入错误 openGauss学习笔记-164 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-…...

QT Widget - 随便画个圆
简介 实现在界面中画一个圆, 其实目的是想画一个LED效果的圆。代码 #include <QApplication> #include <QWidget> #include <QPainter> #include <QColor> #include <QPen>class LEDWidget : public QWidget { public:LEDWidget(QWidget *pare…...

js输入框部分内容不可编辑,其余正常输入,el-input和el-select输入框和多个下拉框联动后的内容不可修改
<tr>//格式// required自定义指令<e-td :required"!read" label><span>地区:</span></e-td><td>//v-if"!read && this.data.nationCode 148"显示逻辑<divclass"table-cell-flex"sty…...

分布式文件存储系统minio了解下
什么是minio minio 是一个基于 Apache License v2.0 开源协议的对象存储服务。非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小。 是一种海量、安全、低成本、高可靠的云存储…...

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI
在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest, ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…...

重新认识Word——尾注
重新认识Word——尾注 参考文献格式文献自动生成器插入尾注将数字带上方括号将参考文献中的标号改为非上标 多处引用一篇文献多篇文献被一处引用插入尾注有横线怎么删除?删除尾注 前面我们学习了如何给图片,公式自动添加编号,今天我们来看看毕…...

所有学前教育专业,一定要刷到这篇啊
我是真的希望所有学前教育的宝子都能刷到这篇啊啊,只要输入需求,几秒它就给你写出来了,而且不满意还可以重新写多,每次都是不一样的内容。重复率真的不高,需求越多,生成的文字内容越精准!&#…...

colmap三维重建核心逻辑梳理
colmap三维重建核心逻辑梳理 1. 算法流程束流2. 初始化3. 重建主流程 1. 算法流程束流 重建核心逻辑见 incremental_mapper.cc 中 IncrementMapperController 中 Reconstruct 初始化变量和对象判断是否有初始重建模型,若有,则获取初始重建模型数量&am…...

查询某个类是在哪个JAR的什么版本开始出现的方法
背景 我们在依赖第三方JAR时,同时也会间接的依赖第三方JAR引用的依赖,而当我们项目中某个依赖的版本与第三方JAR依赖的版本不一致时,可能会导致第三方JAR的在运行时无法找到某些方法或类,从而无法正常使用。 如我正在开发的一个…...

Linux本地搭建StackEdit Markdown编辑器结合内网穿透实现远程访问
文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7k Star!,它支持将Markdown笔记保…...

k8s中ConfigMap、Secret创建使用演示、配置文件存储介绍
目录 一.ConfigMap(cm) 1.适用场景 2.创建并验证configmap (1)以yaml配置文件创建configmap,验证变化是是否同步 (2)--from-file以目录或文件 3.如何使用configmap (1&#x…...

Linux服务器性能优化小结
文章目录 生产环境监测常见专业名词扫盲服务器平均负载服务器平均负载的定义如何判断平均负载值以及好坏情况如果依据平均负载来判断服务器当前状况系统平均负载和CPU使用率的区别 CPU上下文切换基本概念3种上下文切换进程上下文切换线程上下文切换中断上下文切换 查看上下文切…...

ELF文件结构
ELF文件结构 前文结尾说到编译器编译源代码后生成的文件叫做目标文件,而目标文件经过编译器链接之后得到的就是可执行文件。那么目标文件到底是什么?它和可执行文件又有什么区别?链接到底又做了什么呢?接下来,我们将探…...

【C++】有关string迭代器的几道OJ题详解
目录 一、字符串最后一个单词的长度 题目描述 完整代码 二、验证回文串 题目描述 完整代码 三、反转字符串 题目描述 完整代码 四、反转字符串中的单词 题目描述 完整代码 一、字符串最后一个单词的长度 原题链接 题目描述 计算字符串最后一个单词的长度ÿ…...

谷歌宣布向云计算客户开放 Gemini Pro,开发者可用其构建应用
12 月 14 日消息,美国时间周三,谷歌宣布了一系列升级的人工智能(AI)功能,旨在为其云计算客户提供更好的服务。这家科技巨头正试图赶上竞争对手,比如微软和 OpenAI,它们都在积极利用人工智能的热…...

软件测试用例经典方法 | 单元测试法案例
单元测试又称模块测试,是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验,检查程序在语法、格式和逻辑上的错误,并验证程序是否符合规范,以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…...