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

每个人都该懂点网络安全

一.SQL注入(SQLInjection)风险数据库资料被窃取,被删除,如果没做备份的话,可能公司就废了原理所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字
一. 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}


username 变量假设用户的数据为  这样恶意脚本就会被执行。

防范

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 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应用。


示例 
  1. 登陆自己的基于 Web 的邮箱帐户。
  2. 在一封重要邮件还没有收到之前,我决定先在网上随便看看,因此我在多窗口浏览器中新开了一个窗口。
  3. 我所访问的这个网站包含了隐藏代码。我的浏览行为激活了隐藏代码,并向我的电子邮件 Web 服务器发送了一个 HTML 请求。这个请求的内容可能是删除我的收件箱中的全部邮件。完了,中招了。

防范

  1. 开发一套 csrf 验证框架,当用户登录后,给用户的 COOKIE 中,生成一个随机 token。当用户访问表单页面时,自动在表单页面上加入 csrftoken 隐藏字段,和 form 一起提交到 action 中。action 中处理业务逻辑前验证 COOKIE 和 form 中提交的token是否一致。
  2. 开发人员要在 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);
}



五. 文件上传防范

风险

服务器被黑客控制

原理

攻击者通过附件上传漏洞,上传可执行脚本,从而控制服务器。 


防范
  1. 验证文件扩展名,只允许上传白名单中的文件类型(前后端都加验证)
  2. 文件上传和下载使用不同的域名
  3. 上传文件路径随机产生,使攻击者不能猜测文件路径
  4. 对图片进行压缩,隐藏原图路径




推荐阅读
author-avatar
莫不静了_660
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有