跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞。



  • sql注入

1、参数化查询预处理,如java使用PreparedStatement()处理变量。

2、转义敏感字符及字符串(SQL的敏感字符包括“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><=!-*/()|”,和”空格”)。

3、屏蔽出错信息:阻止攻击者知道攻击的结果。

4、在服务端正式处理之前对提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作。



  • 跨站脚本

一般性建议:转义或过滤客户端提交的危险字符,客户端提交方式包含GET、POST、COOKIE、User-Agent、Referer、Accept-Language等,其中危险字符如下:

建议转义或过滤以下字符:

[1] |(竖线符号)

[2] & (& 符号)

[3];(分号)

[4] $(美元符号)

[5] %(百分比符号)

[6] @(at 符号)

[7] '(单引号)

[8] ""(引号)

[9] \'(反斜杠转义单引号)

[10] \""(反斜杠转义引号)

[11] <>(尖括号)

[12] ()(括号)

[13] +(加号)

[14] CR(回车符,ASCII 0x0d)

[15] LF(换行,ASCII 0x0a)

[16] ,(逗号)

[17] \(反斜杠)

[18]  (空格)

[19] . (点号)

过滤以下关键字、标签: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、expression。



开发语言的建议:

[1]严格控制输入:

    Asp:request

    Aspx:Request.QueryString、Form、Cookies、SeverVaiables等

    Php:$_GET、$_POST、$_COOKIE、$_SERVER、$_GlOBAL、$_REQUEST等

    Jsp:request.getParameter、request.getCookies 等

    客户端提交的变量一般从以上函数获得,严格限制提交的数据长度、类型、字符集。



[2]严格控制输出:

    HtmlEncode:对一段指定的字符串应用HTML编码。

    UrlEncode:对一段指定的字符串URL编码。

    XmlEncode:将在XML中使用的输入字符串编码。

    XmlAttributeEncode:将在XML属性中使用的输入字符串编码 

    escape:函数可对字符串进行编码

    decodeURIComponent:返回统一资源标识符的一个已编码组件的非编码形式。

    encodeURI:将文本字符串编码为一个有效的统一资源标识符 (URI)。"
"get型xss:



  • 跨站请求伪造

方案一、存在漏洞的页面加验证码或手机短信验证 

方案二、检测HTTP请求中的访问来源是否可信,对http头中的referer进行过滤,只允许本域站点 

方案三、一次性令牌Token 

添加一个参数Token,其值是随机的。这样攻击者因为不知道Token而无法构造出合法的请求进行攻击。实现方法:首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则拒绝请求或者要求用户重新登陆验证身份。 

Token 使用原则: 

Token要足够随机————只有这样才算不可预测 

Token是一次性的,即每次请求成功后要更新Token————这样可以增加攻击难度,增加预测难度 

Token要注意保密性————敏感操作使用post,防止Token出现在URL中 

方案四、临时cookie:对会话进行时效限制,将持久化的授权方法(例如cookie或者HTTP授权)切换为短时或瞬时的授权方法 

方案五、session标记随机生成;确认已有的session标记无法被二次使用 

方案六、过滤用户输入,例如论坛、博客等,不允许发布含有站内操作URL的链接(作用有限,因为可以通过qq、第三方网站进行发布,图片形式会自动加载等) 

方案七、根据不可预测性原则,我们可以对参数进行加密从而防止CSRF攻击。"

已解密的登录请求 对诸如用户名、密码和信用卡号之类的敏感输入字段进行加密传递

会话定置 "COOKIE中的登陆前JSESSIONID与登陆后JESSIONID不能相同

例如在登录页面上加上一段代码:

request.getSession().invalidate() ;         //清空session
if (request.getCookies()!=null) {
Cookie cookie = request.getCookies()[0]; // 获取cookie
cookie.setMaxAge(0); // 让cookie过期
}"
  • 文件上传

[1]严格判断上传文件的类型,设置上传文件白名单,只允许上传指定类型的文件。

[2]禁止在上传目录下执行脚本。

[3]上传文件的目录必须是http请求无法直接访问到的。如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置该目录为不解析jsp等脚本语言的目录。

[4]上传文件要保存的文件名和目录名由系统根据时间生成,不允许用户自定义。

[5]图片上传,要通过处理(缩略图、水印等),无异常后才能保存到服务器。"

  • jQuery跨站脚本

"升级Jquery到1.7版本以上,或在js中修改如下行,quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/

修改为:quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/"



  • 启用了不安全的HTTP方法

修改web.xml,增加如下配置

<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
<auth-method>BASIC</auth-method>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/oa/login.jsp</url-pattern>
</web-resource-collection> <user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint> <!-- 禁止不安全的http方法 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>fortune</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint></auth-constraint>
</security-constraint>
  • 登录错误消息凭证枚举

对每个错误的登录尝试发出相同的错误消息,不管是哪个字段发生错误,特别是用户名或密码字段错误。

文件备份 "删除备份文件。

.arc/.bac/.backup/.bak/.bck/.copy/.old/.orig/.sav/.save/.saved/.swp/.temp/.test/.tmp/.txt"。



以下是我自己写的一份拦截器,里面可以实现对http请求的参数拦截,解决跨站脚本注入:

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 = { "<script", //需要拦截的JS字符关键字
"</script", "<iframe", "</iframe", "<frame", "</frame", "set-cookie", "%3cscript", "%3c/script", "%3ciframe", "%3c/iframe", "%3cframe", "%3c/frame", "src=\"javascript:", "<body", "</body", "%3cbody", "%3c/body", "alert", "script", "document", "document.title", "document.write", "eval", "prompt", "onreadystatechange", "javascript", "msgbox"
//"<",
//">",
//"</",
//"/>",
//"%3c",
//"%3e",
//"%3c/",
//"/%3e"
}; public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException
{
Enumeration params = req.getParameterNames();
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp; boolean isSafe = true;
String requestUrl = request.getRequestURI();
if (isSafe(requestUrl))
{
requestUrl = requestUrl.substring(requestUrl.indexOf("/"));
if (!excludeUrl(requestUrl))
{
while (params.hasMoreElements())
{
String cache = req.getParameter((String) params.nextElement());
if (StringUtils.isNotBlank(cache))
{
if (!isSafe(cache))
{
isSafe = false;
break;
}
}
}
}
}
else
{
isSafe = false;
}
if (!isSafe)
{
request.setAttribute("msg", "There is some illegal characters in paramters.");
request.getRequestDispatcher(errorPath).forward(request, response);
return;
}
else
{
String referer = request.getHeader("referer");
if (!("/index.jsp".equals(request.getServletPath()) || "/refresh.jsp".equals(request.getServletPath())))
{
if(request.getServletPath()!=null&&request.getServletPath().endsWith(".action")){ }else if (referer == 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 = str.split("/");
for (String urlStr : strs)
{
if (s.equals(urlStr.toLowerCase()))
{
return false;
}
}
}
}
return true;
} private boolean excludeUrl(String url)
{
if (excludePaths != 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 = config;
errorPath = config.getInitParameter("errorPath");
String excludePath = config.getInitParameter("excludePaths");
if (StringUtils.isNotBlank(excludePath))
{
excludePaths = excludePath.split(",");
}
}
}

解决跨站脚本注入,跨站伪造用户请求,sql注入等http安全漏洞的更多相关文章

  1. Web安全之跨站伪造请求(CSRF)

    CSRF简介 CSRF全称跨站伪造请求(Cross-site request forgery)也称为one click attack/session riding,还可以缩写为XSRF 通俗说就是利用 ...

  2. django表单验证和跨站伪造csrf

    Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> < ...

  3. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  4. web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入

    web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...

  5. CSRF跨站伪造请求

    一.什么是CSRF CSRF(Cross Site Request Forgery) 跨站请求伪造.也被称为One Click Attack和Session Riding,通常缩写为CSRF或XSRF ...

  6. [oldboy-django][4python面试]有关csrf跨站伪造请求攻击

    1 csrf定义 - csrf定义:Cross Site Request Forgery,跨站请求伪造 举例来说: 网站A伪造了一个图片链接: <a href="http://www. ...

  7. 渗透之路基础 -- 跨站伪造请求CSRF

    漏洞产生原因及原理 跨站请求伪造是指攻击者可以在第三方站点制造HTTP请求并以用户在目标站点的登录态发送到目标站点,而目标站点未校验请求来源使第三方成功伪造请求. XSS利用站点内的信任用户,而CSR ...

  8. JavaScript 跨站伪造请求-CSRF

    CSRF: Cross-Site Request Forgery CSRF 概念 `定义`: 是一种对网站的而已利用,也被称之为one-click-attack 或者 session riding, ...

  9. csrf_token(跨站伪造)

     Django跨站请求伪造 跨站请求伪造(Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSR ...

随机推荐

  1. (译)Web是如何工作的:给Web开发新手的初级读物

    原文地址:https://medium.freecodecamp.org/how-the-web-works-a-primer-for-newcomers-to-web-development-or- ...

  2. Java学习笔记2(输入与随机数简单介绍)

    输入: import java.util.Scanner; public class ScannerDemo{ public static void main(String[ ] args){ Sca ...

  3. windows第七层负载均衡--基于IIS的ARR负载均衡

    载均衡有很多种方法,有硬件负载均衡,软件负载均衡,还可以从域名解析下手. 不过,今天只讲软件负载均衡 软件负载均衡一般分两种,从网络协议来讲(tcp/ip),主要集中在第四层和第七层进行负载均衡. 第 ...

  4. JavaScript获取当前url路径

    1.假设当前页完整地址是:http://localhost:61768/Home/Index?id=2 //获取当前窗口的Url var url = window.location.href; //结 ...

  5. MySQL(九)之数据表的查询详解(SELECT语法)一

    这一篇是MySQL中的重点也是相对于MySQL中比较难得地方,个人觉得要好好的去归类,并多去练一下题目.MySQL的查询也是在笔试中必有的题目.希望我的这篇博客能帮助到大家! 重感冒下的我,很难受!k ...

  6. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  7. Kibana使用高德地图

    Kibana使用高德地图 说明 目前Kibana默认自带的地图全部是英文,更换高德地图对地图汉化 修改配置 1.编辑kibana配置文件kibana.yml,最后面添加 tilemap.url: 'h ...

  8. spring自带定时器

    http://www.cnblogs.com/pengmengnan/p/6714203.html 注解模式的spring定时器1 , 首先要配置我们的spring.xmlxmlns 多加下面的内容. ...

  9. 快速搭建appium自动测试环境

    首先申明本文是基本于Python与Android来快速搭建Appium自动化测试环境: 主要分为以下几个步骤: 前提条件: 1)安装与配置python环境,打开 Python官网,找到"Do ...

  10. 关于STM32驱动DS1302实时时钟的一点思考

    之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO设置不就行了 ...