每个人都该懂点网络安全

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>
这样恶意脚本就会被执行。

防范

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


示例 
  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. 对图片进行压缩,隐藏原图路径



以上是关于每个人都该懂点网络安全的主要内容,如果未能解决你的问题,请参考以下文章

程序员都该懂的 UML 规范!

用Rust实现区块链 - 6 点对点网络(P2P)

学编程就是要成为程序员?可别犯这种傻!编程思维到底是什么,每个人都该知道!

访问共享点网络应用程序:更新数据宏导致无限循环

“小小的世界大大的你”演讲全文,这是衡中的呐喊,这是我们每个人都该为自己呐喊,我们不甘平庸

“小小的世界大大的你”演讲全文,这是衡中的呐喊,这是我们每个人都该为自己呐喊,我们不甘平庸