项目安全 XSS攻击

XSS攻击
1.OWASP----预防xss

OWASP是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。协助我们在日常的软件应用中能够更加使软件可信赖,和安全。我们在日常软件的开发的过程中,此组织也能为我们提供很多的解决方案及其安全标准

2.安全攻击

1 、DDos攻击
其最明显的特点就是发送大量的攻击数据包,消耗网络带宽资源,影响正常用户的访问。打个比方,每次传输只能是1k的包进行传输,但是ddos攻击,机会一次性发送大量10M的包,导致传输堵塞,大量等待,消耗资源
简单的解决方案:当遇到这种大量数据包,可以让他直接跳转到其他页面或者阐述通道
2.SQL注入攻击
Web页面查询时,恶意注入如:"1’ OR ‘1’='1"或者脚本。因此达到无账号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏。
简单的解决办法:后台使用预编译,可以 以通过数据库防火墙实现对SQL注入攻击的防范,同时后台对请求域中的参数进行校验

/**
 *防止SQL注入,对请求域中的参数进行校验拦截
 */
public class SqlFilterUtil
{
    
    private static final Logger LOG = LoggerFactory.getLogger(SqlFilterUtil.class);
    
    //SQL的注入关键字符,正则
    private static String[] badSqlRegs = {
        //"\"", //传json数据时会有双引号,不拦截
        "\\|", "[gG][rR][oO][uU][pP]_[cC][oO][nN][cC][aA][tT]", "[Tt][aA][bB][lL][eE]_[Ss][Cc][Hh][Ee][Mm][Aa]", "#",
        "exec", "\\d{1,10}\\s*+[>=<]\\s*+\\d{1,10}", "[iI][nN][sS][eE][rR][Tt]\\s++", "[dD][eE][lL][eE][Tt][eE]\\s++",
        "[Uu][Pp][Dd][Aa][Tt][Ee]\\s++", "[Dd][Rr][Oo][Pp]\\s++", "[Ww][Hh][Ee][Rr][Ee]\\s++", "\\s++[Oo][Rr]\\s++",
        "[Oo][Rr][Dd][Ee][Rr]\\s++[Bb][Yy]\\s++", //order by   \\s++表示隔了一个或者多个空白字符(\t\n\x0B\f\r)  
        "[Tt][Rr][Uu][Nn][Cc][Aa][Tt][Ee]\\s++", "[Ee][Xx][Ee][Cc]\\s++", "[Cc][Oo][Uu][Nn][Tt]\\(",
        "[Dd][Ee][Cc][Ll][Aa][Rr][Ee]\\s++", "[Aa][Ss][Cc]\\(", "[Dd][Ee][Ss][Cc]\\(", "[Mm][Ii][Dd]\\(",
        "[Cc][Hh][Aa][Rr]\\(", "[Uu][Nn][Ii][Oo][Nn]\\s++", "---*+\\s*+", //    --   sql的注释符, *+表示0个或多个
        "'*+\\s++[Aa][Nn][Dd]\\s++'*.*[>=<].*", //匹配如: ' AND f%='ffdse4555' 这种sql注入参数
        "[Ii][Nn]\\s*+\\(", "[Nn][Ee][Tt]\\s++[Uu][Ss][Ee][Rr]", "[Xx][Pp]_[Cc][Mm][Dd][Ss][Hh][Ee][Ll][Ll]",
        "[Nn][Ee][Tt]\\s++[Ll][Oo][Cc][Aa][Ll][Gg][Rr][Oo][Uu][Pp]\\s++[Aa][Dd][Mm][Ii][Nn][Ii][Ss][Tt][Rr][Aa][Tt][Oo][Rr]",};
    
    public boolean judgeSqlInject(HttpServletRequest request)
    {
        String badParamVal = "";
        boolean findBadParam = false;
        //获得所有请求参数名  
        Enumeration<String> params = request.getParameterNames();
        ok: while (params.hasMoreElements())
        {
            //得到参数名  
            String name = params.nextElement();
            //得到参数对应值  
            String[] values = request.getParameterValues(name);
            if (values == null || values.length == 0)
            {
                continue;
            }
            for (String paramVal : values)
            {
                if (hasInjectionSql(paramVal))
                {
                    badParamVal = paramVal;
                    findBadParam = true;
                    break ok; //跳出多重循环
                }
            }
        }
        
        if (findBadParam)
        {
            LogUtils.errorLog(LOG, "the request params contains sql keywords! ", null);
        }
        
        return findBadParam;
    }
    
    /**
     * <判断request域中参数值是否有sql注入的特殊字符>
     * <功能详细描述>
     * @param paraValStr
     * @return [参数说明]
     *
     */
    private boolean hasInjectionSql(String paraValStr)
    {
        if (StringUtils.isBlank(paraValStr))
        {
            return false;
        }
        Pattern pattern = null;
        for (String badSqlReg : badSqlRegs)
        {
            pattern = Pattern.compile(badSqlReg);
            Matcher matcher = pattern.matcher(paraValStr);
            if (matcher.find()) //匹配到含有sql注入的语句
            {
                return true;
            }
        }
        return false;
    }
    
}
3. XSS攻击

1,原理:
跨网站脚本(Cross-site scripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
2.防御XSS的七条原则
此博客已经写的很清楚,就不在此赘述,博客链接:https://www.cnblogs.com/xiaohouzai/p/8180474.html

/***对页面HTML中的关键字进行处理**、
public class HtmlStringUtil
{
  /**
  * HTML关键字处理<p>
  * 将空格,“&,<,>,\"转义
  * 
  * @param txt
  * @return String
  */
  public static String textToHtmlNoBR(String txt)
  {
      
      String result = txt;
      if (result == null)
      {
          return result;
      }
      result = replaceAll(result, "&", "&amp;");
      result = replaceAll(result, "<", "&lt;");
      result = replaceAll(result, ">", "&gt;");
      result = replaceAll(result, "\"", "&quot;");
      return result;
  }
  
  /**
   * <HTML关键字处理><p>
   * 将空格,换行,“&,<,>,\"转义
   * 
   * @param txt
   * @return String
   */
  public static String textToHtmlEx(String txt)
  {
      
      String result = txt;
      if (result == null)
      {
          return result;
      }
      result = replaceAll(result, "&", "&amp;");
      result = replaceAll(result, "<", "&lt;");
      result = replaceAll(result, ">", "&gt;");
      result = replaceAll(result, "\"", "&quot;");
      result = replaceAll(result, "\r\n", "<br>");
      result = replaceAll(result, "\r", "<br>");
      result = replaceAll(result, "\n", "<br>");
      return result;
  }
  
  /**
   * <HTML关键字至文本反处理>
   * 
   * @param str
   * @return String
   */
  public static String textToHtml(String str)
  {
      
      String result = str;
      if (result == null)
      {
          return result;
      }
      result = replaceAll(result, "&", "&amp;");
      result = replaceAll(result, "<", "&lt;");
      result = replaceAll(result, ">", "&gt;");
      result = replaceAll(result, "\"", "&quot;");
      result = replaceAll(result, "\r\n", "<br>");
      result = replaceAll(result, "\r", "<br>");
      result = replaceAll(result, "\n", "<br>");
      return result;
  }
  
  /**
   * 将'<' 转换成&lt这种形式
   * 
   * @param str
   * @return String
   */
  public static String textToHtmlNoBr(String str)
  {
      String result = str;
      if (result == null)
      {
          return result;
      }
      result = replaceAll(result, "&", "&amp;");
      result = replaceAll(result, "<", "&lt;");
      result = replaceAll(result, ">", "&gt;");
      return result;
  }
  
  /**
   * <字符串大量替换><br/>
   * 将str字符串中的replacing字符替换成replacement字符
   * 
   * @param src [替换字符源]
   * @param replacing  [替换目标字符]
   * @param replacement [替换结果字符]
   * 
   * @return String [替换结果]
   */
  public static String replaceAll(String src, String replacing,
          String replacement)
  {
      String result = null;
      StringBuilder builder = new StringBuilder(src);
      int searchIndex = 0;
      int replacingLength = replacing.length();
      int replacementLength = replacement.length();
      while (true)
      {
          int index = builder.indexOf(replacing, searchIndex);
          if (index == -1)
          {
              break;
          }
          builder.delete(index, index + replacingLength);
          builder.insert(index, replacement);
          searchIndex = index + replacementLength;
      }
      result = builder.toString();
      return result;
  }
  
  /**
   * <判断日期是否为空,格式化日期>
   * 
   * @param str
   * @return String
   */
  public static String delNull(Date date)
  {
      String returnStr = "";
      if (date != null)
      {
          SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
          returnStr = sf.format(date);
      }
      return returnStr;
  }
  
  /**
   * <判断字符串是否为空>
   * 
   * @param str
   * @return String
   */
  public static String delNull(String str)
  {
      String returnStr = "";
      if (StringUtils.isNotBlank(str))
      {
          returnStr = str;
      }
      return returnStr;
  }
  
  /**
   * <换行统一处理>
   * <功能详细描述>
   * @param str
   * @return String
   */
  public static String replaceDosLine(String str)
  {
      String result = replaceAll(str, "\r\n", "\n");
      result = replaceAll(result, "\n", "\r\n");
      return result;
      
  }
  
  /**
   * <sql特殊字符处理>
   * <功能详细描述>
   * @param str
   *
   * @return String
   */
  public static String replaceSql(String str)
  {
      String result = replaceAll(str, "%", "%25");
      result = replaceAll(result, "&", "%26");
      result = replaceAll(result, "\\", "%5c");
      result = replaceAll(result, "_", "%5f");
      return result;
      
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值