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;
}
}