点击上方“码农进阶之路”,选择“设为星标”
回复“面经”获取面试资料
写在前面
网络安全在后端开发中其实问到的频率并不是很高,但是为了做到不留任何漏网之题,还是建议大家抽时间了解下这块的内容,至少常见的攻击手段极其防御措施要交接下,不至于在面试时遇到此类问题什么也回答不上来。
网络安全专题
和后端开发相关的网络安全主要是一些代码漏洞,比如说:跨站脚本漏洞、注入式攻击漏洞、程序拒绝服务攻击漏洞等等。下面就几个经常在面试中问到的问题进行展开说明。
01
SQL 注入
百度百科对 SQL 的定义
所谓SQL注入,就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。
具体来说,它是利用现有应用程序,将(恶意的)SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如:先前的很多影视网站泄露 VIP 会员密码大多就是通过 WEB 表单递交查询字符暴出的,这类表单特别容易受到 SQL 注入式攻击。
之所以会出现 SQL 注入这种恶意攻击,是因为我们在日常开发中有时候需要根据实际场景结合用户的输入数据动态的构造 SQL 语句。那么,如果用户输入的数据被构造成恶意 SQL,并且 Web 应用也没有对动态构造的 SQL 进行输入参数的安全性检查,则会带来不可预测的危险。
- SQL 注入的步骤
1. 寻找注入点,构造 SQL 攻击语句;
2. 传入 SQL 语句动态参数;
3. 用户构造 SQL 语句;
4. 将 SQL 语句发送给数据库;
5. 执行 SQL 语句;
6. 返回 SQL 语句执行的结果给用户。
**SQL 注入的案例
**-- 创建 USERS 表
插入一条用户记录:
INSERT INTO USERS(username,password)
在插入上诉一条用户后,我们就可以用该用户的用户名和密码进行登录了。但是如果我们的代码里没有进行特殊字符过滤等安全防护逻辑处理,那么就有可能会受到 SQL 注入攻击。如下:
select * from users where username = '' or 1 = 1#' and password=md5('')
我们知道“#”在 MySQL 中是注释符,这样 # 号后面的所有内容都将被 MySQL 视为注释内容,这样就不会去执行了,即上面的 SQL 语句就等价于:
select * from users where usrername='' or 1 = 1
因为 1 = 1 永远都是成立的,因此上面的 SQL 语句将会查询出所有的 user 信息。
- 防范措施
1. 输入验证:检查用户输入的合法性,尽量的限制用户输入特殊的符号,确信输入的内容只包含合法的数据。
2. 使用参数化查询:Java 中的 PreparedStatement 是预先编译的 SQL 语句,可以传入适当参数并且多次执行。由于没有拼接的过程,因此可以防止 SQL 注入的发生。
3. SQL 语句中尽量不要省略单引号或者将单引号转换为两个连续的单引号。
4. 对于常用的方法加以封装,避免直接暴漏 SQL 语句。
02
跨站脚本攻击
百度百科对跨站脚本攻击的定义:
跨站脚本攻击(也称为 XSS)指利用网站漏洞从用户那里恶意盗取信息。
XSS 攻击通常指黑客通过 "HTML 注入" 篡改了页面,插入了恶意脚本。XSS的攻击目标是为了盗取客户端的 cookie 或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。
- XSS 攻击分类
1. 反射型 XSS攻击:又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性 XSS 包含一个带 XSS 攻击的链接,即每次攻击需要用户的点击。
2. 存贮型 XSS 攻击:又称为持久型跨站点脚本,它一般发生在 XSS 攻击向量存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的 XSS 相比非持久性 XSS,攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。
3. 基于 DOM 的 XSS 跨站脚本攻击:通过修改页面 DOM 节点数据信息而形成的 XSS 跨站脚本攻击。不同于反射型 XSS 和存储型 XSS,基于 DOM 的 XSS 跨站脚本攻击往往需要针对具体的 javascript DOM 代码进行分析,并根据实际情况进行 XSS 跨站脚本攻击的利用。
- XSS 攻击举例
例如:我们常用的留言板,用户可以在上面留下自己的想法:
<input type=“text” name=“content” value=“码农求职小助手”>
正常的操作程序将用户的留言存储到数据库,当其他用户访问留言板,其他用户的留言就可以显示出来。
<input type=“text” name=“content” value= “<script>alert(‘hacker code!’)</script>”>
但是如果我们在 value 上加上恶意攻击代码,然后将数据存储到数据库里,这样其他人查看留言板时就会执行这些恶意攻击的代码了。
- 防范措施
1. 设置 HttpOnly: 浏览器禁止页面的 JavaScript 访问带有 HttpOnly 属性的Cookie。现在主流浏览器都已支持 HttpOnly。如果是业务需要增加 cookie,同时需要给这个 cookie 设置为 HttpOnly 属性。
2. 输入检查:在获取到用户输入数据后要先检查数据中是否包含<、>、‘、”等危险字符,如果包含要考虑对这些字符进行过滤或转码。
3. 输出检查:在 html 标签或在 html 属性中输出变量时,做一些防御措施。
03
跨站请求伪造
百度百科上对于“跨站请求伪造”讲解的特别详细:
百度百科对跨站请求伪造的定义:
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比, XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了 web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
- 案例
假如:一家银行用以运行转账操作的 URL 地址如下:
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码:
<img src="http://www.examplebank.com/withdraw?account=XiaoMaNong&amount=1000&for=Badman">
如果有账户名为 XiaoMaNong 的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失 1000 资金。
- 防范措施
1. 检查 Referer 字段
HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer 字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer 字段地址通常应该是转账按钮所在的网页地址,应该也位于 www.examplebank.com 之下。而如果是 CSRF 攻击传来的请求,Referer 字段会是包含恶意网址的地址,不会位于 www.examplebank.com 之下,这时候服务器就能识别出恶意的访问。
这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。
2. 添加校验 token
由于 CSRF 的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在 cookie 中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行 CSRF 攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过 CSRF 传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验 token 的值为空或者错误,拒绝这个可疑请求。
3. 及时清除认证 cookie
CSRF 攻击是有条件的,当用户访问恶意链接时,认证的 cookie 仍然有效,所以当用户关闭页面时要及时清除认证 cookie,可以减小跨站请求伪造攻击的风险。
04
拒绝服务攻击
百度百科上对拒绝服务攻击的定义:
拒绝服务攻击即是攻击者想办法让目标机器停止提供服务,是黑客常用的攻击手段之一。其实对网络带宽进行的消耗性攻击只是拒绝服务攻击的一小部分,只要能够对目标造成麻烦,使某些服务被暂停甚至主机死机,都属于拒绝服务攻击。
拒绝服务攻击问题也一直得不到合理的解决,究其原因是因为网络协议本身的安全缺陷,从而拒绝服务攻击也成为了攻击者的终极手法。攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用 IP 欺骗,迫使服务器把非法用户的连接复位,影响合法用户的连接。
拒绝服务(Denial of Service,简称 DoS):是一种简单的破坏性攻击。通常是利用传输协议下的某个弱点、系统存在的漏洞、或服务器的漏洞。对目标系统发起大规模的进攻。用超出目标处理能力的海量数据包消耗可用系统资源、宽带资源等,造成程序缓冲区溢出错误,使其他合法用户无法正常请求。最终致使网络服务瘫痪,甚至系统死机。
- 攻击方式
1. 通过向服务器提交大量请求,打垮服务器;
2. 通过使网络过载来干扰甚至阻断正常的网络通讯;
3. 阻断某一用户访问服务器。
- 攻击现象
1. 服务器被打垮崩溃;
2. 网络中存在着大量的无用的数据包。
3. 服务器上有大量等待的 TCP 连接。
- 防范措施
1. 关闭不必要的服务;
2. 及时更新系统补丁;
3. 限制同时打开的 Syn 半连接数目;
4. 缩短 Syn 半连接的 time out 时间。
5. 采取合适的安全域划分,配置防火墙,入侵检测和防范系统,减缓攻击。
05
其他面试题
1、Web 服务器被入侵后该如何排查?
1. 查看下 Web 服务器日志
2. 看看有没有异常端口开放
3. 使用安全狗等服务器安全软件清扫
2、别的网站使用爬虫技术爬你的网站怎么办?****有没有安全措施?
单位时间内请求次数超过某个阈值就让输入验证码,可以极大降低抓取的速度,如果多次超过某个阈值可以加入黑名单。还有就是页面内容使用 json 返回,数据经常更换格式。
3、常见的 Web 漏洞有哪些?
1. 跨站请求攻击漏洞
2. 跨站请求伪造漏洞
2. SQL 注入漏洞
3. 拒绝服务攻 击漏洞
4. 加密漏洞
5. 缓存漏洞
6. 输入验证漏洞
7. 链接跟踪漏洞
往期精选
2019秋招:460道Java后端面试高频题答案版【模块一:Java基础】
2019秋招:460道Java后端面试高频题答案版【模块二:Java集合类】
2019秋招:460道Java后端面试高频题答案版【模块三:Java并发】
2019秋招:460道Java后端面试高频题答案版【模块四:Java虚拟机】
2019秋招:460道Java后端面试高频题答案版【模块五:计算机网络】
2019秋招:460道Java后端面试高频题答案版【模块六:计算机操作系统】
2019秋招:460道Java后端面试高频题答案版【模块七:设计模式】
码农进阶之路
长按二维码关注
面经 | 原理 | 源码 | 实战 | 工具
本文分享自微信公众号 - 码农进阶之路(SYJava)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。