每个人都该懂点网络安全
Posted wenniuwuren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每个人都该懂点网络安全相关的知识,希望对你有一定的参考价值。
一. SQL注入(SQL Injection)
风险
数据库资料被窃取,被删除, 如果没做备份的话, 可能公司就废了
原理
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,提交一段数据库查询代码,操纵执行后端的 DB 查询,从而绕过认证机制,获得本不为用户所知数据的技术,甚至删除服务器的数据。
示例
statement = "SELECT * FROM Users WHERE id= " + variable + " ;
上面这条语句是很普通的一条 SQL,根据 id 查用户信息。如攻击者在输入变量的时候,输入以下内容 ‘007‘;drop table table_name。那么以上这条 SQL 语句在执行的时候就变为了 SELECT * FROM Users WHERE Value= ‘007‘;drop table table_name, 将导致表被删除。(仅仅是一种例子, DBA 运维控制权限当然也能防止这种情况出现)
防范
Java 防范 SQL 注入比较简单,需做到以下几点:
1、使用 Hibernate、Mybatis 等 ORM 框架传入参数
2、使用 PreparedStatement,预编译 SQL 语句
3、不使用直接拼接 SQL 字符串 (使用原生 SQL 的时候,参数交给 Hibernate 组装或者 Mybatis 参数用
#{} 传入)
二. 跨站脚本攻击(XSS)防范
风险
服务器遭受入侵(页面被修改),用户帐号被盗
原理
反射型跨站脚本攻击,是指攻击者发出一段带有漏洞的页面地址给用户,用户浏览后,会执行攻击者指定的 javascript 语句,导致用户 cookie 被窃取,技术高深的攻击者可以直接控制用户浏览器。
存储型跨站脚本攻击,是指攻击者把 JavaScript
内容,通过应用程序功能(例如存储个人简历),存到到数据库中,当用户浏览网站时,应用程序会显示这段恶意 JavaScript,从而导致用户 cookie 被窃取,技术高深的攻击者可以直接控制用户浏览器。
示例
<tr> <td><spring:message code="lable.field.user.company" /></td> <td>${username}</td> <td></td> </tr>
username 变量假设用户的数据为 <script src=xxx></script>
这样恶意脚本就会被执行。防范
private static final char[] QUOTE_ENCODE = """.toCharArray(); private static final char[] AMP_ENCODE = "&".toCharArray(); private static final char[] LT_ENCODE = "<".toCharArray(); public static final String escapeForHtml(String string) { if (string == null) { return null; } char ch; int i = 0; int last = 0; char[] input = string.toCharArray(); int len = input.length; StringBuffer out = new StringBuffer((int) (len * 1.3)); for (; i < len; i++) { ch = input[i]; if (ch > '>') { continue; } else if (ch == '<') { if (i > last) { out.append(input, last, i - last); } last = i + 1; out.append(LT_ENCODE); } else if (ch == '"') { if (i > last) { out.append(input, last, i - last); } last = i + 1; out.append(QUOTE_ENCODE); } } if (last == 0) { return string; } if (i > last) { out.append(input, last, i - last); } return out.toString(); }
三. 跨站请求伪造(CSRF)防范
风险
用户资料被修改,攻击者以用户身份执行任意操作
原理
CSRF 攻击主要是由攻击者在网页中植入恶意代码或连接,当受害人的浏览器执行恶意代码或者受害人点击连接后,攻击者就可以访问那些被害人身份验证后的网络应用。如果被害人采用多窗口浏览器,攻击者就可以以被害人身份控制浏览器中任何一个窗口中的Web应用。
示例
- 登陆自己的基于 Web 的邮箱帐户。
- 在一封重要邮件还没有收到之前,我决定先在网上随便看看,因此我在多窗口浏览器中新开了一个窗口。
- 我所访问的这个网站包含了隐藏代码。我的浏览行为激活了隐藏代码,并向我的电子邮件 Web 服务器发送了一个 HTML 请求。这个请求的内容可能是删除我的收件箱中的全部邮件。完了,中招了。
防范
- 开发一套 csrf 验证框架,当用户登录后,给用户的 cookie 中,生成一个随机 token。当用户访问表单页面时,自动在表单页面上加入 csrftoken 隐藏字段,和 form 一起提交到 action 中。action 中处理业务逻辑前验证 cookie 和 form 中提交的token是否一致。
- 开发人员要在 form 表单中,加上 $csrfToken.hiddenField,以便生成隐藏 csrftoken 字段。
四. 跨站 URL 重定向 (又叫自由重定向 Open Redirect ) 防范
风险
用户被钓鱼,帐号密码被盗
原理
破坏者可以拿着你的 url 做保护,然后把一个有害的网站的 url 放在重定向的参数中,然后发给受害者,受害者看到这个 url 后,发现是可以信任的,就点进去,然后就感染了病毒或者被迫做了其他事情.
示例
response.sendRedirect(request.getParameter("done"));
防范
程序框架拦截所有 302 跳转,验证跳转目的是否为白名单(自己的)网站,不在白名单中的跳转需提示用户,让用户选择是否需要继续跳转。
防范代码
public boolean sendRedirect(String url) { if (!StringUtil.isEmpty(url)) { try { url = url.trim(); if (!WHITE_DOMAIN_PATTERN.matcher(url).matches()) { url = "http://www.dxy.cn/redirect?url=" + URLEncoder.encode(url, "UTF-8"); } res.sendRedirect(url); return true; } catch (Throwable ex) { } } return false; } private static Pattern WHITE_DOMAIN_PATTERN = null; static { StringBuilder buff = new StringBuilder(); for (String domain : new String[] { “abc\\.(cn|com|net)", “aaa\\.cn", “bbb\\.(cn|com)", “ccc\\.cn" }) { if (buff.length() > 0) { buff.append("|"); } buff.append("(^http[s]?://[\\w-]+\\."); buff.append(domain); buff.append("(\\/.*)?$)"); } buff.append("|(^(?!http).+$)"); WHITE_DOMAIN_PATTERN = Pattern.compile(buff.toString(), Pattern.CASE_INSENSITIVE); }
五. 文件上传防范
风险
服务器被黑客控制
原理
攻击者通过附件上传漏洞,上传可执行脚本,从而控制服务器。
防范
- 验证文件扩展名,只允许上传白名单中的文件类型(前后端都加验证)
- 文件上传和下载使用不同的域名
- 上传文件路径随机产生,使攻击者不能猜测文件路径
- 对图片进行压缩,隐藏原图路径
以上是关于每个人都该懂点网络安全的主要内容,如果未能解决你的问题,请参考以下文章
学编程就是要成为程序员?可别犯这种傻!编程思维到底是什么,每个人都该知道!