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.mzph.cn/news/215355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于北京医学sci论文翻译

在医学领域,翻译论文是一项非常重要的工作。医学论文的翻译需要准确、专业、严谨,同时也需要考虑到医学领域的特殊性和复杂性。那么,如何翻译医学论文呢?北京医学SCI论文翻译哪家好呢? 首先,需要具备专业的…

多目标跟踪数据集

目录 DanceTrack数据集 自己改进的可视化代码: DanceTrack数据集 DanceTrack 是一个大规模的多对象跟踪数据集。用于在遮挡、频繁交叉、同样服装和多样化身体姿态条件下对人进行跟踪。强调运动分析在多对象跟踪中的重要性。 GitHub地址:https://github.com/DanceTrack/Dan…

python自动化测试实战 —— 单元测试框架

软件测试专栏 感兴趣可看:软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识: 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

swing快速入门(五)

注释很详细,直接上代码 上一篇 本篇新增内容: 1.布局管理器BorderLayout 2.自适应尺寸方法pack() import java.awt.*; public class swing_test_3 {public static void main(String[] args) {Frame framenew Frame("演示BorderLayout");//…

第十六届山东省职业院校技能大赛高职组“应用软件系统开发”赛项样题

第十六届山东省职业院校技能大赛 高职组“应用软件系统开发”赛项样题 目录 一.竞赛须知 二.竞赛任务标题二 模块一:系统需求分析(25分) 模块二:软件系统开发(55分) 模块三&am…

【APP安卓测试工具】adb(Android Debug Bridge)

1.常见的命令 列出已连接的设备 adb device安装 adb install <APK文件路径>卸载 adb uninstall <APK文件路径>启动和停止 adb shell am start -n <包名>[/<Activity>]adb shell am force -stop <包名>截屏和录屏 adb shell screencap <文件路…

cordic 算法学习记录

参考&#xff1a;b站教学视频FPGA&#xff1a;Cordic算法介绍与实现_哔哩哔哩_bilibili FPGA硬件实现加减法、移位等操作比较简单&#xff0c;但是实现乘除以及函数计算复杂度高且占用资源多&#xff0c;常见的计算三角函数/平方根的求解方式有①查找表&#xff1a;先把函数对应…

JVM面试连环炮:你准备好迎接挑战了吗?

在Java开发领域&#xff0c;JVM面试一直是一个热门话题。作为一名优秀的开发者&#xff0c;你是否已经准备好迎接这场挑战了呢&#xff1f;今天&#xff0c;我们就来深度解析一下JVM面试的热点问题&#xff0c;帮助你更好地应对面试&#xff0c;一举拿下offer&#xff01; 1、…

Python 使用sphinx生成API文档

目录 前言: 项目层级 Python项目docstring规范 Example Google Style Python Docstrings Example NumPy Style Python Docstrings reStructuredText Style 设置代码docstrings风格(pycharm) 安装sphinx 创建sphinx文档项目 配置conf.py文件 编译代码为api文档 编译…

vim + ctags 跳转, 查看函数定义

yum install ctags Package ctags-5.8-13.el7.x86_64 already installed and latest version 创建 /home/mzh/pptp-master/tags.sh #!/usr/bin/shWORKDIR/home/mzh/pptp-masterfind ${WORKDIR} -name "*.[c|h]" | xargs ctags -f ${WORKDIR}/tags find /usr/inclu…

final的安全发布

final的安全发布 两个关键字“发布”“安全” 所谓发布通俗一点的理解就是创建一个对象&#xff0c;使这个对象能被当前范围之外的代码所使用 比如Object o new Object(); 然后接下来使用对象o 但是对于普通变量的创建&#xff0c;之前分析过&#xff0c;大致分为三个步骤&am…

k8s之身份认证与权限

Kubernetes 中提供了良好的多租户认证管理机制&#xff0c;如 RBAC、ServiceAccount 还有各种策略等。 通过该文件可以看到已经配置了 RBAC 访问控制 /usr/lib/systemd/system/kube-apiserver.service 1.1 认证 所有 Kubernetes 集群有两类用户&#xff1a;由 Kubernetes 管理的…

mysql数据库学习笔记(1)

今天开始学mysql数据库&#xff0c;为什么要学这个呢&#xff0c;因为数据库可结构化存储大量的数据信息&#xff0c;方便用户进行有效的检索和访问。数据库可有效地保持数据信息的一致性、完整性、降低数据冗余。数据库可满足应用的共享和安全方面的要求&#xff0c;把数据放在…

java--认识异常、自定义异常

1.异常体系 Error&#xff1a;代表的系统级别错误(属于严重问题)&#xff0c;也就是说系统一旦出现问题&#xff0c;sun公司会把这些问题封装成Error对象给出来&#xff0c;说白了&#xff0c;Error是给sun公司自己用的&#xff0c;不是给我们程序员用的&#xff0c;因此我们开…

MacOS下homebrew的安装与使用

安装Homebrew //删除原来的文件&#xff0c;可以在删除前查看下Cellar文件夹下已安装的包,homebrew将工具安装在这个文件夹下&#xff0c;并在/usr/local/bin下建立连接 sudo -irm -rf /usr/local/Cellar /usr/local/.gi sudo chown -R liudong /usr/local //更新文件属主为liu…

114. 二叉树展开为链表 --力扣 --JAVA

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 解题思路 …

通过Ai帮我们写前端界面设计

现在我要写一个前端界面&#xff0c;from表单&#xff0c;让用户登录使用的&#xff0c;提交表单之前先分析用户名和密码是否填的完成&#xff0c;并且检查密码必须满足 包含大小写&#xff0c;数字&#xff0c;密码长度必须在8到20之间&#xff0c;不满足不可以提交。用户名必…

ethtool

ethtool ethtool是一个常用的命令行工具&#xff0c;用于配置和查询以太网接口的驱动程序和硬件参数。它提供了一种简单的方式来检查和修改网络接口的设置&#xff0c;以及获取与以太网接口相关的统计数据和状态信息。 ethtool可以执行以下常见的操作&#xff1a; 查询接口信息…

【Hadoop】修改YARN配置文件

本节需要修改的 YARN 配置文件保存在$HADOOP_HOME/etc/haoop 目录下&#xff0c;需要修改的文件共有 7 个&#xff0c;分别是&#xff1a;core-site.xml, hadoop-env.sh, hdfs-site.xml, yarn-site.xml, yarn-env.sh, mapred-site.xml, slave. 这些文件的用途&#xff1a; core…

Mysql:慢cpu过高慢sql查询方法

通过 processlist查询较为便捷&#xff0c;只是结果的info中只会显示sql的前100个字符。 show processlist 通过下面语句查询可显示当前正在执行的完整sql。 SELECT * FROM information_schema.processlist WHERE COMMAND ‘Query’; 借助navicate数据库工具的监控功能查询库的…