跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞。
sql注入
1、参数化查询预处理,如java使用PreparedStatement()处理变量。
2、转义敏感字符及字符串(SQL的敏感字符包括“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”&#43;”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><&#61;!-*/()|”,和”空格”)。
3、屏蔽出错信息&#xff1a;阻止攻击者知道攻击的结果。
4、在服务端正式处理之前对提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等&#xff0c;在确认客户端的输入合法之前&#xff0c;服务端拒绝进行关键性的处理操作。
跨站脚本
一般性建议&#xff1a;转义或过滤客户端提交的危险字符&#xff0c;客户端提交方式包含GET、POST、COOKIE、User-Agent、Referer、Accept-Language等&#xff0c;其中危险字符如下&#xff1a;
建议转义或过滤以下字符&#xff1a;
[1] |(竖线符号)
[2] & (& 符号)
[3];(分号)
[4] $(美元符号)
[5] %(百分比符号)
[6] &#64;(at 符号)
[7] &#39;(单引号)
[8] ""(引号)
[9] \&#39;(反斜杠转义单引号)
[10] \""(反斜杠转义引号)
[11] <>(尖括号)
[12] ()(括号)
[13] &#43;(加号)
[14] CR(回车符&#xff0c;ASCII 0x0d)
[15] LF(换行&#xff0c;ASCII 0x0a)
[16] ,(逗号)
[17] \(反斜杠)
[18] (空格)
[19] . (点号)
过滤以下关键字、标签&#xff1a;alert、img、script、document、document.title、document.write、eval、prompt、onclick、onerror、onmouseenter、onreadystatechange、confirm、Javascript、String.fromCharCode、onload、DYNSRC、LOWSRC、behavior、Vbscript、msgbox、mocha、livescript、。
开发语言的建议&#xff1a;
[1]严格控制输入&#xff1a;
Asp&#xff1a;request
Aspx&#xff1a;Request.QueryString、Form、COOKIEs、SeverVaiables等
Php&#xff1a;$_GET、$_POST、$_COOKIE、$_SERVER、$_GlOBAL、$_REQUEST等
Jsp&#xff1a;request.getParameter、request.getCOOKIEs 等
客户端提交的变量一般从以上函数获得&#xff0c;严格限制提交的数据长度、类型、字符集。
[2]严格控制输出&#xff1a;
HtmlEncode&#xff1a;对一段指定的字符串应用HTML编码。
UrlEncode&#xff1a;对一段指定的字符串URL编码。
XmlEncode&#xff1a;将在XML中使用的输入字符串编码。
XmlAttributeEncode&#xff1a;将在XML属性中使用的输入字符串编码
escape&#xff1a;函数可对字符串进行编码
decodeURIComponent&#xff1a;返回统一资源标识符的一个已编码组件的非编码形式。
encodeURI&#xff1a;将文本字符串编码为一个有效的统一资源标识符 (URI)。"
"get型xss&#xff1a;
跨站请求伪造
方案一、存在漏洞的页面加验证码或手机短信验证
方案二、检测HTTP请求中的访问来源是否可信&#xff0c;对http头中的referer进行过滤&#xff0c;只允许本域站点
方案三、一次性令牌Token
添加一个参数Token&#xff0c;其值是随机的。这样攻击者因为不知道Token而无法构造出合法的请求进行攻击。实现方法&#xff1a;首先服务器端要以某种策略生成随机字符串&#xff0c;作为令牌(token)&#xff0c;保存在 Session 里。然后在发出请求的页面&#xff0c;把该令牌以隐藏域一类的形式&#xff0c;与其他信息一并发出。在接收请求的页面&#xff0c;把接收到的信息中的令牌与 Session 中的令牌比较&#xff0c;只有一致的时候才处理请求&#xff0c;否则拒绝请求或者要求用户重新登陆验证身份。
Token 使用原则&#xff1a;
Token要足够随机————只有这样才算不可预测
Token是一次性的&#xff0c;即每次请求成功后要更新Token————这样可以增加攻击难度&#xff0c;增加预测难度
Token要注意保密性————敏感操作使用post&#xff0c;防止Token出现在URL中
方案四、临时COOKIE&#xff1a;对会话进行时效限制&#xff0c;将持久化的授权方法(例如COOKIE或者HTTP授权)切换为短时或瞬时的授权方法
方案五、session标记随机生成&#xff1b;确认已有的session标记无法被二次使用
方案六、过滤用户输入&#xff0c;例如论坛、博客等&#xff0c;不允许发布含有站内操作URL的链接(作用有限&#xff0c;因为可以通过qq、第三方网站进行发布&#xff0c;图片形式会自动加载等)
方案七、根据不可预测性原则&#xff0c;我们可以对参数进行加密从而防止CSRF攻击。"
已解密的登录请求对诸如用户名、密码和信用卡号之类的敏感输入字段进行加密传递
会话定置"COOKIE中的登陆前JSESSIONID与登陆后JESSIONID不能相同
例如在登录页面上加上一段代码&#xff1a;
request.getSession().invalidate() ; //清空session
if (request.getCOOKIEs()!&#61;null) {
COOKIE COOKIE &#61; request.getCOOKIEs()[0]; // 获取COOKIE
COOKIE.setMaxAge(0); // 让COOKIE过期
}"
文件上传
[1]严格判断上传文件的类型&#xff0c;设置上传文件白名单&#xff0c;只允许上传指定类型的文件。
[2]禁止在上传目录下执行脚本。
[3]上传文件的目录必须是http请求无法直接访问到的。如果需要访问的&#xff0c;必须上传到其他(和web服务器不同的)域名下&#xff0c;并设置该目录为不解析jsp等脚本语言的目录。
[4]上传文件要保存的文件名和目录名由系统根据时间生成&#xff0c;不允许用户自定义。
[5]图片上传&#xff0c;要通过处理(缩略图、水印等)&#xff0c;无异常后才能保存到服务器。"
jQuery跨站脚本
"升级Jquery到1.7版本以上&#xff0c;或在js中修改如下行&#xff0c;quickExpr &#61; /^(?:[^)[^>]*$|#([\w\-]&#43;)$)/
修改为&#xff1a;quickExpr &#61; /^(?:[^#)[^>]*$|#([\w\-]*)$)/"
启用了不安全的HTTP方法
修改web.xml,增加如下配置
CLIENT-CERT
Client Cert Users-only Area
BASIC
SSL
/oa/login.jsp
CONFIDENTIAL
fortune
/*
PUT
DELETE
HEAD
OPTIONS
TRACE
登录错误消息凭证枚举
对每个错误的登录尝试发出相同的错误消息&#xff0c;不管是哪个字段发生错误&#xff0c;特别是用户名或密码字段错误。
文件备份"删除备份文件。
.arc/.bac/.backup/.bak/.bck/.copy/.old/.orig/.sav/.save/.saved/.swp/.temp/.test/.tmp/.txt"。
以下是我自己写的一份拦截器&#xff0c;里面可以实现对http请求的参数拦截&#xff0c;解决跨站脚本注入&#xff1a;
package com.asiainfo.aiga.common.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
public class XSSCheckFilter implements Filter
{
private FilterConfig config;
private static String errorPath;//出错跳转的目的地
private static String[] excludePaths;//不进行拦截的url
private static String[] safeless &#61; { "
//"
//">",
//"",
//"/>",
//"%3c",
//"%3e",
//"%3c/",
//"/%3e"
};
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException
{
Enumeration params &#61; req.getParameterNames();
HttpServletRequest request &#61; (HttpServletRequest) req;
HttpServletResponse response &#61; (HttpServletResponse) resp;
boolean isSafe &#61; true;
String requestUrl &#61; request.getRequestURI();
if (isSafe(requestUrl))
{
requestUrl &#61; requestUrl.substring(requestUrl.indexOf("/"));
if (!excludeUrl(requestUrl))
{
while (params.hasMoreElements())
{
String cache &#61; req.getParameter((String) params.nextElement());
if (StringUtils.isNotBlank(cache))
{
if (!isSafe(cache))
{
isSafe &#61; false;
break;
}
}
}
}
}
else
{
isSafe &#61; false;
}
if (!isSafe)
{
request.setAttribute("msg", "There is some illegal characters in paramters.");
request.getRequestDispatcher(errorPath).forward(request, response);
return;
}
else
{
String referer &#61; request.getHeader("referer");
if (!("/index.jsp".equals(request.getServletPath()) || "/refresh.jsp".equals(request.getServletPath())))
{
if(request.getServletPath()!&#61;null&&request.getServletPath().endsWith(".action")){
}else if (referer &#61;&#61; null || !referer.contains(request.getServerName()))
{
System.out.println("跨站请求伪造");
//转到一个错误的图片
request.getRequestDispatcher(errorPath).forward(request, response);
}
}
}
filterChain.doFilter(req, resp);
}
private static boolean isSafe(String str)
{
if (StringUtils.isNotBlank(str))
{
for (String s : safeless)
{
String[] strs &#61; str.split("/");
for (String urlStr : strs)
{
if (s.equals(urlStr.toLowerCase()))
{
return false;
}
}
}
}
return true;
}
private boolean excludeUrl(String url)
{
if (excludePaths !&#61; null && excludePaths.length > 0)
{
for (String path : excludePaths)
{
if (url.toLowerCase().equals(path))
{
return true;
}
}
}
return false;
}
public void destroy()
{
}
public void init(FilterConfig config) throws ServletException
{
this.config &#61; config;
errorPath &#61; config.getInitParameter("errorPath");
String excludePath &#61; config.getInitParameter("excludePaths");
if (StringUtils.isNotBlank(excludePath))
{
excludePaths &#61; excludePath.split(",");
}
}
}