热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何保证web安全

互联网发展初期,那还是IE浏览器的时代,那时大家上网的目的就是通过浏览器分享信息、获取新闻。随着互联网的快速发展,网页能做的事情越来越多,不仅可以看新闻、玩游戏,还能购物、聊天,这些功能极大地丰富了我们的生活。

如图所示,我们注册了一个 的用户名,所有能看到此用户名字的页面,都会弹出当前浏览器的 COOKIE,如果代码的逻辑是将 COOKIE 发送到攻击者的网站,攻击者就能冒充当前用户进行登录了。

XSS 攻击方式有很多,所有和用户交互的地方,都有可能存在 XSS 攻击。例如:

  • 所有 input 框。

  • window.location。

  • window.name。

  • document.referrer。

  • document.COOKIE。

  • localstorage。

  • ...

由于页面中与用户交互的地方非常多,肯定还有一些 XSS 的攻击方式没有被发现,而一旦被黑帽子发现,就可能造成严重的影响,所以我们务必引起重视。

1)XSS 攻击影响

被 XSS 攻击成功后,攻击者就可以获取大量的用户信息,例如:

识别用户 UA。识别用户浏览器扩展。识别用户浏览过的网站。(通过 CSS 的 Visited 属性。)获取用户真实的 IP。(通过 WebRTC 等。)盗取 COOKIE(伪造用户登录,窃取用户资料。)XSS 钓鱼。(向页面注入一个登录弹窗,让用户认为是网站内的登录弹窗(其实是钓鱼网站的),一旦用户登录,账号密码就泄露给了钓鱼网站。)

2)XSS 攻击防御

目前来说,XSS 已经得到了互联网行业的重视,许多开发框架都内置了安全的 HTML 渲染方法。

我们也可以自定义进行一些安全配置。

配置 HTTP 中的 http-only 头,让前端 JS 不能操作 COOKIE。输入检查,在用户提交数据时,使用 XssFilter 过滤掉不安全的数据。输出检查,在页面渲染的时候,过滤掉危险的数据。

简单就是说需要:禁止js操作COOKIE、提交时检查html、输出时检查html(可以通过转码)

2、CSRF 攻击

CSRF(Cross-site request forgery)跨站请求伪造,是一种利用用户身份,执行一些用户非本意的操作。

比如:

用户先登录了服务器 B,然后去访问服务器 C。服务器 C 通过恶意脚本,冒充 A 去调用服务器 B 上的某个功能,对于服务器 B 来说,还以为这是 A 发起的请求,就当作正常请求处理了。

试想一下,如果 C 冒充 A 进行了一次转账,必定会造成大量的经济损失。

1)CSRF 防御方式

防御 CSRF 主要有以下几种方式:

a、验证码Referer 检查

每一次请求都要求用户验证,以确保请求真实可靠。即:利用恶意脚本不能识别复杂的验证码的特点,保证每次请求都是合法的。

b、Referer 检查

检查发起请求的服务器,是否为目标服务器。即:HTTP 请求中的 Referer 头传递了当前请求的域名,如果此域名是非法服务器的域名,则需要禁止访问。

c、Token

利用不可预测性原则,每一请求必须带上一段随机码,这段随机码由正常用户保存,黑帽子不知道随机码,也就无法冒充用户进行请求了。

(学习视频分享:php视频教程)

3、点击劫持

点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。

就像一张图片上面铺了一层透明的纸一样,你看到的是攻击者的页面,但是其实这个页面只是在底部,而你真正点击的是被攻击者透明化的另一个网页。

1)点击劫持防御

由于点击劫持主要通过 iframe,所以在防御时,主要基于 iframe 去做。

方案一:frame busting

if (self !== top) {  // 跳回原页面
  top.location = self.location;
}

正常网站使用 JS 脚本判断是否被恶意网站嵌入,如:博客网站监测到被一个 iframe 打开,自动跳转到正常的页面即可。

方案二:使用 HTTP 中的 x-frame-options 头,控制 iframe 的加载,它有 3 个值可选:

DENY,表示页面不允许通过 iframe 的方式展示。SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示。ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示。

配置 iframe 的 sandbox 属性:sandbox = "allow-same-origin" ,则只能加载与主站同域的资源。

(二)服务端攻击

服务器端的攻击的方式也非常多,这里列举几个常见的。

SQL 注入攻击文件上传漏洞登录认证攻击应用层拒绝服务攻击webServer 配置安全

1、SQL 注入攻击

SQL 注入和 XSS 一样,都是违背了数据和代码分离原则导致的攻击方式。

如图所示,我们利用 SQL 注入,就能在不需要密码的情况下,直接登录管理员的账号。

攻击的前提是:后端只用了简单的拼接 SQL 的方式去查询数据。

// 拼接出来的 sql 如下:select * from user where username = 'admin' or 1=1 and password = 'xxx'
// 无论密码输入什么,这条 sql 语句都能查询到管理员的信息

除此之外,SQL 注入还有以下几种方式:

a、使用 SQL 探测,猜数据库表名,列名。

通过 MySQL 内置的 benchmark 探测数据库字段。如:一段伪代码 select database as current if current[0]==='a',benchmark(10000,'猜对了') 如果表明猜对了,就延迟 10 s 并返回成功。

b、使用存储过程执行系统命令

通过内置的方法或存储过程执行 shell 脚本。如:xp_cmdshell、sys_eval、sys_exec 等。

c、字符串截断

如:MySQL 在处理超长的字符串时,会显示警告,但会执行成功。注册一个 admin + 50 个空格的用户,会触发截断,最终新增一个 admin 用户,这样就能拥有管理员权限了。

1)SQL 注入防御

防止 SQL 注入的最好的办法就是,不要手动拼接 SQL 语句。

最佳方案,使用预编译语句绑定变量:通常是指框架提供的拼接 SQL 变量的方法。这样的语义不会发生改变,变量始终被当成变量。严格限制数据类型,如果注入了其他类型的数据,直接报错,不允许执行。使用安全的存储过程和系统函数。

2、CRLF 注入

在注入攻击中,换行符注入也是非常常见的一种攻击方式。

如果在 HTTP 请求头中注入 2 个换行符,会导致换行符后面的所有内容都被解析成请求实体部分。攻击者通常在 Set-COOKIE 时,注入换行符,控制请求传递的内容。

3、文件上传漏洞

上传文件是网页开发中的一个常见功能,如果不加处理,很容易就会造成攻击。

通常有以下几种 DDOS 攻击方式:

  • SYN Flood 洪水攻击

  • 利用 HTTP 3 次握手机制,消耗服务器连接资源。

  • 如:攻击者发起大量的 HTTP 请求,但并不完成 3 次握手,而是只握手 2 次,这时服务器端会继续等待直至超时。这时的服务器会一直忙于处理大量的垃圾请求,而无暇顾及正常请求。

  • Slowloris 攻击

  • 以非常低的速度发送 HTTP 请求头,消耗服务器连接资源。

  • 如:攻击者发送大量 HTTP 请求,但每个请求头都发的很慢,每隔 10s 发送一个字符,服务器为了等待数据,不得始终保持连接,这样一来,服务器连接数很快就被占光了。

  • HTTP POST DOS

  • 发送 HTTP 时,指定一个非常大的 Content-Length 然后以很长的间隔发送,消耗服务器连接资源。

  • CC 攻击

  • 针对一些非常消耗资源的页面,不断发起请求。

  • 如:页面中的某些页面,需要后端做大量的运算,或者需要做非常耗时的数据库查询。在大量的请求下,服务器的 CPU、内存等资源可能就被占光了。

  • Server Limit DOS

  • 通过 XSS 注入一段超长的 COOKIE,导致超出 Web 服务器所能承受的 Request Header 长度,服务器端就会拒绝此服务。

  • ReDOS

  • 针对一些缺陷的正则表达式,发起大量请求,耗光系统资源。

1)应用层拒绝服务攻击防御

对于应用层拒绝服务攻击,目前也没有特别完美的解决方案,不过我们还是可以进行一些优化。

应用代码做好性能优化合理使用 Redis、Memcache 等缓存方案,减少 CPU 资源使用率。网络架构上做好优化后端搭建负载均衡。静态资源使用 CDN 进行管理。限制请求频率服务器计算所有 IP 地址的请求频率,筛选出异常的 IP 进行禁用。可以使用 LRU 算法,缓存前 1000 条请求的 IP,如果有 IP 请求频率过高,就进行禁用。

其实,处理 DDOS 核心思路就是禁用不可信任的用户,确保资源都是被正常的用户所使用。

三、WebServer 配置安全

我们在部署 web 应用的时候,经常会用到 Nginx、Apache、IIS、Tomcat、Jboss 等 Web 服务器,这些服务器本身也存在一些安全隐患,如果配置不当,很容易收到攻击。

在配置 Web 服务器时,可以参考以下几点:

1、以用户权限运行 Web 服务器

遵守最小权限原则,以最小权限身份运行 Web 服务器,限制被入侵后的权限。

2、删除可视化后台

运行 Tomcat、Jboss 等 Web 服务器时,默认会开启一个可视化的运营后台,运行在 8080 端口,并且第一次访问是没有认证的。

攻击者可以利用可视化后台,远程加载一段 war 包或者上传木马文件,进行控制,所以我们需要删除可视化平台。

3、及时更新版本

主流的 Web 服务器,每隔一段时间就会修复一些漏洞,所以记得及时更新版本。


推荐阅读
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • (九)Docker常用安装
    一、总体步骤1、搜索镜像2、拉取镜像3、查看镜像4、启动镜像5、停止镜像6、移除镜像二、安装tomcat1、dockerhub上面查找tomcat镜像 dockersearchto ... [详细]
  • 最近帮人用Apache+Tomcat在同一台IP的服务器上设置多域名指向不同网站站点,花费了不少的时间。尤其是配置信息的时候,从网上找的资料有很多是错误的,误认不浅。所以今天特意把 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
author-avatar
温倩0918
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有