項目安全 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;
      
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章