zoukankan      html  css  js  c++  java
  • 每个人都该懂点网络安全

    转自:http://blog.csdn.net/wenniuwuren/article/details/50768900
     
     
    一. 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. 对图片进行压缩,隐藏原图路径


  • 相关阅读:
    洛谷 1339 最短路
    洛谷 1330 封锁阳光大学 图论 二分图染色
    洛谷 1262 间谍网络 Tarjan 图论
    洛谷 1373 dp 小a和uim之大逃离 良心题解
    洛谷 1972 莫队
    洛谷 2158 数论 打表 欧拉函数
    洛谷 1414 数论 分解因数 水题
    蒟蒻的省选复习(不如说是noip普及组复习)————连载中
    关于筛法
    关于整数划分的几类问题
  • 原文地址:https://www.cnblogs.com/xiaohouzai/p/7645973.html
Copyright © 2011-2022 走看看