每个人都该懂点网络安全
2016-02-29 22:35
357 查看
一. 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 被窃取,技术高深的攻击者可以直接控制用户浏览器。
示例
username 变量假设用户的数据为 <script src=xxx></script>
这样恶意脚本就会被执行。
1、对文本进行输入或输出过滤(html escape),严格控制输入或输出都能达到目的,整站策略应保持一致。
2、标识用户登录的 Cookie 设置 httponly
防范代码
三. 跨站请求伪造(CSRF)防范
示例
登陆自己的基于 Web 的邮箱帐户。
在一封重要邮件还没有收到之前,我决定先在网上随便看看,因此我在多窗口浏览器中新开了一个窗口。
我所访问的这个网站包含了隐藏代码。我的浏览行为激活了隐藏代码,并向我的电子邮件 Web 服务器发送了一个 HTML 请求。这个请求的内容可能是删除我的收件箱中的全部邮件。完了,中招了。
开发一套 csrf 验证框架,当用户登录后,给用户的 cookie 中,生成一个随机 token。当用户访问表单页面时,自动在表单页面上加入 csrftoken 隐藏字段,和 form 一起提交到 action 中。action 中处理业务逻辑前验证 cookie 和 form 中提交的token是否一致。
开发人员要在 form 表单中,加上 $csrfToken.hiddenField,以便生成隐藏 csrftoken 字段。
四. 跨站 URL 重定向 (又叫自由重定向 Open Redirect ) 防范
用户被钓鱼,帐号密码被盗
原理
破坏者可以拿着你的 url 做保护,然后把一个有害的网站的 url 放在重定向的参数中,然后发给受害者,受害者看到这个 url 后,发现是可以信任的,就点进去,然后就感染了病毒或者被迫做了其他事情.
防范
程序框架拦截所有 302 跳转,验证跳转目的是否为白名单(自己的)网站,不在白名单中的跳转需提示用户,让用户选择是否需要继续跳转。
防范代码
五. 文件上传防范
服务器被黑客控制
攻击者通过附件上传漏洞,上传可执行脚本,从而控制服务器。
防范
验证文件扩展名,只允许上传白名单中的文件类型(前后端都加验证)
文件上传和下载使用不同的域名
上传文件路径随机产生,使攻击者不能猜测文件路径
对图片进行压缩,隐藏原图路径
风险
数据库资料被窃取,被删除, 如果没做备份的话, 可能公司就废了原理
所谓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>
这样恶意脚本就会被执行。
防范
1、对文本进行输入或输出过滤(html escape),严格控制输入或输出都能达到目的,整站策略应保持一致。2、标识用户登录的 Cookie 设置 httponly
防范代码
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); }
五. 文件上传防范
风险
服务器被黑客控制
原理
攻击者通过附件上传漏洞,上传可执行脚本,从而控制服务器。 防范
验证文件扩展名,只允许上传白名单中的文件类型(前后端都加验证)
文件上传和下载使用不同的域名
上传文件路径随机产生,使攻击者不能猜测文件路径
对图片进行压缩,隐藏原图路径
相关文章推荐
- 第一行代码-10.2 使用HTTP协议访问网络
- tcp/ip基础(一)
- 轻松把玩HttpClient之封装HttpClient工具类(六),封装输入参数,简化工具类
- App UI 体验设计:内存、磁盘与网络如何优雅的同步数据?
- 通过java.net.URLConnection发送HTTP请求的方法
- Centos&安装的时候提示无可用的网络设备
- JAVASE基础 Item -- 网络编程
- HTTP与TCP的关系,无连接、无状态详解
- JSP_006_HttpSession之原理
- TCP的三次握手和四次挥手
- Nginx模块 ngx_http_limit_req_module 限制请求速率
- libcurl库进行http通讯-基于 C 的 HTTP 客户端
- libcurl库进行http通讯-基于 C 的 HTTP 客户端
- JavaEE SSH框架整合(三) struts2 异常、http错误状态码处理
- 网络编程中的一些问题总结
- 网络编程API-下 (I/O复用函数)
- Java 网络编程(二) 两类传输协议:TCP UDP
- Java 网络编程(一) 网络基础知识
- ESP8266 WiFi串口模块的学习与使用(一)
- HttpURLConnection用法详解