欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!
在我后台回复 「资料」 可领取
编程高频电子书!在我后台回复「面试」可领取
硬核面试笔记!
Java 项目安全面试实战
这一个模块讲一下在我们研发的系统中,可能会碰到哪些安全问题,黑客会以什么样的方式来对网站进行攻击
为什么我们作为一个 Java 开发人员,还要去了解安全相关的问题呢?
目前大多数技术人员对于项目安全方面的关注度并不是很高,之前在某几个互联网大厂中都发生过一些删库跑路的问题,影响系统的安全性和数据的安全性,并且如果以后作为一个负责人去带领开发一个项目,项目的安全性是很重要的,因此系统的安全在系统架构中处于一个非常重要的地位,如何去避免被黑客攻击导致系统故障以及避免系统的核心数据遭到泄露是非常重要的一个事情,我们作为开发人员,是一定要去了解常见的一些攻击手段,如果一无所知的话,就证明了我们的能力不够全面,可能就会导致面试结果不理想
我们作为开发人员,对安全方面的掌握程度达到 了解程度 就行,在系统中我们做一些简单的防御措施,之后将专业的安全防护问题交给专业的公司去做就可以了!
XSS 网络攻击
先说一下 XSS(Cross-Site Scripting,跨站脚本攻击)网络攻击,这是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到受害者访问的网页中
XSS 攻击的原理就是:
- 注入恶意脚本:攻击者将恶意脚本代码(html+javascript)嵌入到被攻击网站的前端代码中
- 受害者访问:当受害者访问到被攻击的网站时,这个网站会执行恶意的脚本,由于你认为这些脚本是可靠的,会允许执行
- 窃取用户数据:当恶意脚本被执行后,可能就会窃取用户的个人信息、篡改网页信息或者引导你到攻击者自己的网站中
XSS 攻击分为两种:反射型攻击 和 存储型攻击:
- 反射型攻击:这种类型的攻击通常通过URL参数传播。攻击者会想办法让你点击一个 URL 链接,这个 URL 链接指向的攻击者自己服务器上的一段恶意脚本,当你点击之后,恶意脚本就会被返回到浏览器中执行,之后就会控制你的浏览器中的行为了,这时恶意脚本有了你的 cookie 信息,会以你的个人身犯去去关注某个人或者发布一些内容等等(可以做任何事情)
- 存储型攻击:这种类型的攻击将恶意脚本存储在服务器上,通常是在数据库中。比如攻击者在网站中发布一条评论,其中包含了恶意脚本(js 脚本),那么当你去浏览攻击者发布的这一条评论后,会导致恶意脚本运行,控制你浏览器中的一切行为
XSS 攻击防护手段:
- 消毒机制:在将用户输入的数据输出到HTML页面之前,对其进行编码,以防止脚本执行。例如,将
<编码为<,>编码为>,"编码为",'编码为'等,将恶意脚本的<html>、<script>编码之后,就不会在浏览器中被执行了 - HttpOnly 方式:HttpOnly 用于设置 Cookie 的属性,表示浏览器只允许通过 HTTP 协议发送 Cookie,而不允许通过客户端脚本(如 JavaScript)访问,那么就算恶意脚本执行了,但是他们也无法读取和修改这些 Cookie,可以保护用户信息
SQL 注入攻击
SQL 注入攻击是攻击者在应用程序的数据库查询中插入恶意SQL代码,导致数据被恶意修改或丢失等问题
这里举个例子:
假设有一个登录表单,用户输入用户名和密码,然后服务器端的代码将这些信息用于数据库查询,以验证用户身份。如果这个查询没有正确处理用户输入,攻击者就可以利用SQL注入。
假设原始的SQL查询是这样的:
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
在没有防护的情况下,如果攻击者在用户名字段输入 ' OR 1=1 --,那么SQL查询将变成(其中 -- 在 SQL 中是注释,后边的 SQL 语句就失效了):
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '输入的密码';
由于 OR 1=1 始终为真,所以这个查询会返回所有用户的记录,而 -- 用于注释掉后面的 AND password 部分,这样攻击者就可以绕过密码验证。
SQL 注入防护措施:
保护数据库表结构:不要让别人知道数据库的表结构,不要将一些异常的 SQL 信息给回显到浏览器中,否则就会通过 SQL 语句被推测出来表结构,之后进行 SQL 注入攻击SQL 预编译:MyBatis 中也有防止 SQL 注入的措施,MyBatis 会将#{}的参数作为预编译语句的一部分进行处理,会对参数进行转义处理,那么传入进来的 SQL 语句就会被当作是参数,而不会作为 SQL 执行了,以此来防止 SQL 注入
<select id="selectUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>