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, "&", "&");
result = replaceAll(result, "<", "<");
result = replaceAll(result, ">", ">");
result = replaceAll(result, "\"", """);
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, "&", "&");
result = replaceAll(result, "<", "<");
result = replaceAll(result, ">", ">");
result = replaceAll(result, "\"", """);
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, "&", "&");
result = replaceAll(result, "<", "<");
result = replaceAll(result, ">", ">");
result = replaceAll(result, "\"", """);
result = replaceAll(result, "\r\n", "<br>");
result = replaceAll(result, "\r", "<br>");
result = replaceAll(result, "\n", "<br>");
return result;
}
/**
* 將'<' 轉換成<這種形式
*
* @param str
* @return String
*/
public static String textToHtmlNoBr(String str)
{
String result = str;
if (result == null)
{
return result;
}
result = replaceAll(result, "&", "&");
result = replaceAll(result, "<", "<");
result = replaceAll(result, ">", ">");
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;
}
}