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攻击的主要原因有以下几点:

  1. 随机性:Token是由服务器生成的随机字符串,每次请求都会生成一个新的Token,并将其与用户会话相关联。攻击者无法获知这个随机字符串,因此无法构造有效的伪造请求。

  2. 不自动发送:与Cookies不同,Token不会自动附加在每个请求中。在需要验证用户身份的请求中,服务器会要求客户端主动发送该Token。这样,即使攻击者成功伪造了请求,但缺少正确的Token,服务器会拒绝执行该请求。

  3. 防止被窃取Cookies存储在浏览器中,容易受到XSS(跨站脚本攻击)等攻击手段的窃取。而Token通常是存储在HTTP请求头中或作为请求参数发送,不会自动附加到每个请求中,因此更难以被窃取

虽然Cookies也可以采取一些措施来减少CSRF攻击的风险(如SameSite属性、HttpOnly属性等),但这些措施仍然无法完全防止CSRF攻击。相比之下,Token通过引入随机性和主动验证的方式,提供了更可靠的防护机制。

需要注意的是,为了保证Token的安全性,开发者需要采取一些措施,例如使用HTTPS协议传输、设置适当的Token过期时间、确保Token的随机性和独一性等。只有在正确实施的情况下,Token才能有效地防止CSRF攻击。

2.3.为什么Token存储在HTTP请求头中或作为请求参数中,就不容易被窃取?Cookies存储在浏览器中,容易被窃取?

Token 存储在 HTTP 请求头或请求参数中相较于存储在浏览器的 Cookies 中,更难被窃取的原因主要有以下几点:

  1. 存储位置不同:Cookies 是存储在客户端浏览器中的,而 HTTP 请求头或请求参数通常是由服务端返回给客户端,然后由客户端发送给服务端的。由于服务端可以采用一些安全措施来保证 Token 的传输过程的安全性,例如使用 HTTPS 加密传输,因此 Token 存储在 HTTP 请求头或请求参数中更难被窃取。

  2. 相对短暂:为了确保 Token 的安全性,它们通常被设定为相对短暂的有效期,一旦过期就需要重新获取。这样即使攻击者窃取到 Token,也只能在一段时间内进行恶意操作。相比之下,Cookies 可能会存储很长时间,具有较高的风险。

  3. 不可见性: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 一节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/246830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国际语音通知系统有哪些应用场景?

国际语音通知系统操作简单、安全性高、实用性强,可广泛应用于国际航空、国际银行、出海游戏、跨国旅游、跨国金融等行业。 1.会议通知 企业人事管理人员使用语音通知的方式,快速通知参会人员。 2.订单通知 企业通过语音通知向客户发送订单确认通知&a…

RCE漏洞基础及CTF绕过

1.漏洞成因 可以对系统命令执行函数和调用代码函数传递的值进行控制。 2.系统执行命令函数 system() exec() exec会执行系统命令,保存回显最后一行而且单exec不输出结果 shell_exec() 不会输出结果,保存所有回显 passthru() 和system一样 popen() …

STM32F407-14.3.2-03 中心对齐模式

中心对齐模式(递增/递减计数) 在中心对齐模式下,计数器从 0 开始计数到自动重载值(TIMx_ARR 寄存器的内容)— 1,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之…

LLM(七)| Mamba:LLM新架构的浅探

目前大型语言模型(LLM)领域发展如火如荼,本文将重点探索在单个消费级GPU上可以有效运行的小型模型(≤7B个参数)。 我们将从以下几个方面重点介绍基于新架构的语言模型:🐍Mamba模型(h…

HTTP 302错误:临时重定向

在Web开发中,HTTP状态码是用于表示Web服务器响应的各种状态。其中,HTTP 302错误表示临时重定向,这意味着请求的资源已被临时移动到其他位置,并且服务器已经提供了新的URL,以便客户端可以重新发送请求。 了解HTTP 302错…

「Verilog学习笔记」RAM的简单实现

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1ns module ram_mod(input clk,input rst_n,input write_en,input [7:0]write_addr,input [3:0]write_data,input read_en,input [7:0]read_addr,output reg…

2023PCTF Double_SS

记录一下 ssrf配合 ssti的结合 首先开启环境 明显的ssrf 让我们访问 5555端口 使用http协议访问 url127.0.0.1:5555 告诉我们去访问 name 并且给我们key url127.0.0.1:5555/name 出现报错 说我们不是admin 然后我们往下看 我们使用file协议读取app/app.py urlfile:///app…

基于ssm的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统,来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术,MYSQL数据库存储数据,基于SSMVue框架开发。在网站的整个开发过程中,首先对…

Python自动化:selenium常用方法总结

使用的Python版本为3.8,selenium版本为4.15.2 Python自动化:selenium常用方法总结 1. 三种等待方式2. 浏览器操作3. 8种查找元素的方法4. 高级事件 1. 三种等待方式 强制等待 使用模块time下的sleep()实现等待效果隐式等待 使用driver.implicitly_wait()方法&#…

大数据云计算——使用Prometheus-Operator进行K8s集群监控

大数据云计算——使用Prometheus-Operator进行K8s集群监控 一、 背景 在非operator配置的普罗中我们监控k8s集群都是通过配置configmap进行服务发现和指标拉取。切换到prometheus-operator难免会有些使用问题。不少用户已经习惯底层配置自动发现的方式。当过渡到servicemonit…

【docker】常用命令

启动docker服务 systemctl start docker 停止docker服务 systemctl stop docker 重启docker服务 systemctl restart docker 查看docker服务状态 systemctl status docker 设置开机启动docker服务 systemctl enable docker 设置关闭开机启动docker服务 systemctl disable …

Excel实现字母+数字拖拉自动递增,步长可更改

目录 1、带有字母的数字序列自增加(步长可变) 2、仅字母自增加 3、字母数字同时自增 1、带有字母的数字序列自增加(步长可变) 使用Excel通常可以直接通过拖拉的方式,实现自增数字&#xf…

02基于matlab的卡尔曼滤波

基于matlab的卡尔曼滤波,可更改状态转移方程,控制输入,观测方程,设置生成的信号的噪声标准差,设置状态转移方差Q和观测方差R等参数,程序已调通,需要直接拍下。

luttuce(RedisTempate)实现hash expire lua脚本

话不多说先放脚本: local argv ARGV local length #argv if length > 0 then local unpackArgs {} for i 1, length - 1 dotable.insert(unpackArgs, argv[i]) end if redis.call(exists, KEYS[1]) 1 thenredis.call(del, KEYS[1])redis.call(hset, KEYS[…

前端自定义icon的方法(Vue项目)

第一步:进入在线的编辑器进行设计 好用:百度字体编辑器 比如先导入有个ttf文件 添加新字体 双击每个模块进入编辑区域 更改相应的信息,比如name 编辑完了进行导出文件(各种格式就行了)就行了 第二步:在项目中asset文件储存这些文…

十指波教育怎么样,课程是最新的吗

我们所有的课程内容,每年都会更新。 可以看一下我们的B站: 但是说到底,我们做私教服务 和那些传统的培训还是有很大区别。 传统培训机构不管线上还是线下主要是在卖一套课程的课程,可能是直播或者面授,你花钱买到的…

亚马逊云科技助力泡泡玛特快速部署全球弹性资源,打造国潮出海文化

企业全球化的终极目标就是品牌出海。1978年伴随着改革开放,中国企业开始放眼望世界输出中国产品,经过多年锤炼后,中国企业如TCL、泡泡玛特在不同的行业重塑版图,对外输出中国品牌,赢得了全球市场,中国企业实…

代码随想录算法训练营第52天| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

JAVA代码编写 300.最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1…

Talk | 上海交通大学魏思哲: CoBEVFlow-解决车-车/路协同感知的时序异步问题

本期为TechBeat人工智能社区第556期线上Talk。 北京时间12月14日(周四)20:00,上海交通大学硕士生—魏思哲的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “CoBEVFlow-解决车-车/路协同感知的时序异步问题”,介绍了他的团队…

“机器人V2.0时代已来”-任务规划难题迎刃而解,世界因机器人改变而翻转!

01-VILA背景简介 2022年,Michael Ahn, Anthony Brohan等人提出“Do as i can, not as i say: Grounding language in robotic affordances”算法。本文指出虽然大型语言模型可以编码关于世界的丰富语义知识,而这些知识对旨在对用自然语言表达的高级、时…