- 浏览: 118280 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
young_java:
<javascript>alert(0)</ ...
使用filter过滤xss攻击 -
javawang_java:
<scRript>a;ert(xs1)</s ...
使用filter过滤xss攻击 -
chenqili111:
chenqili111 写道富文本编辑器时也会阻止掉,请问下怎 ...
使用filter过滤xss攻击 -
chenqili111:
富文本编辑器时也会组织掉,请问下怎么搞
使用filter过滤xss攻击 -
zoboy:
的撒旦撒旦撒啊盛大盛大的撒大声的
Mule ESB的transformer(一)——基础transform及自定义transformer
先说一下实现思路:
1. 使用正则表达式的方式实现脚本过滤,这个方法准确率较高,但是可能根据不能的要求会变动;
2. 为了保证配置灵活(包括正则表达式灵活),使用xml配置文件的方式记录配置信息,配置信息包含是否开启校验、是否记录日志、是否中断请求、是否替换脚本字符等;
3. 为保证xml与正则表达式的特殊字符不冲突,使用<![CDATA[]]>标签存放正则表达式,但是在类中需要特殊处理;
4. 通过继承HttpRequestWrapper的方式实现request中header和parameter信息过滤;
5. xml解析使用dom4j,稍后会对这个工具的使用写一篇文章,暂时辛苦大家去网站查找资料(这篇文章很不错http://www.ibm.com/developerworks/cn/xml/x-dom4j.html);
6. 使用XSSSecurityManager类实现配置信息加载和处理,XSSSecurityConfig记录匹配信息,XSSSecurityCon标识程序所需常量;
附件包含源码,如果能帮我改进更好
package com.sg.security; import java.io.IOException; import java.util.Enumeration; import java.util.Map; import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; /** * @author winnie * @date * @describe request信息封装类,用于判断、处理request请求中特殊字符 */ public class XSSHttpRequestWrapper extends HttpServletRequestWrapper { /** * 封装http请求 * @param request */ public XSSHttpRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getHeader(String name) { String value = super.getHeader(name); // 若开启特殊字符替换,对特殊字符进行替换 if(XSSSecurityConfig.REPLACE){ XSSSecurityManager.securityReplace(name); } return value; } @Override public String getParameter(String name) { String value = super.getParameter(name); // 若开启特殊字符替换,对特殊字符进行替换 if(XSSSecurityConfig.REPLACE){ XSSSecurityManager.securityReplace(name); } return value; } /** * 没有违规的数据,就返回false; * * @return */ @SuppressWarnings("unchecked") private boolean checkHeader(){ Enumeration<String> headerParams = this.getHeaderNames(); while(headerParams.hasMoreElements()){ String headerName = headerParams.nextElement(); String headerValue = this.getHeader(headerName); if(XSSSecurityManager.matches(headerValue)){ return true; } } return false; } /** * 没有违规的数据,就返回false; * * @return */ @SuppressWarnings("unchecked") private boolean checkParameter(){ Map<String,Object> submitParams = this.getParameterMap(); Set<String> submitNames = submitParams.keySet(); for(String submitName : submitNames){ Object submitValues = submitParams.get(submitName); if(submitValues instanceof String){ if(XSSSecurityManager.matches((String)submitValues)){ return true; } }else if(submitValues instanceof String[]){ for(String submitValue : (String[])submitValues){ if(XSSSecurityManager.matches((String)submitValue)){ return true; } } } } return false; } /** * 没有违规的数据,就返回false; * 若存在违规数据,根据配置信息判断是否跳转到错误页面 * @param response * @return * @throws IOException * @throws ServletException */ public boolean validateParameter(HttpServletResponse response) throws ServletException, IOException{ // 开始header校验,对header信息进行校验 if(XSSSecurityConfig.IS_CHECK_HEADER){ if(this.checkHeader()){ return true; } } // 开始parameter校验,对parameter信息进行校验 if(XSSSecurityConfig.IS_CHECK_PARAMETER){ if(this.checkParameter()){ return true; } } return false; } }
/** * */ package com.sg.security; import java.io.IOException; 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.log4j.Logger; /** * @author winnie * @date * @describe 安全信息审核类 */ public class XSSSecurityFilter implements Filter{ private static Logger logger = Logger.getLogger(XSSSecurityFilter.class); /** * 销毁操作 */ public void destroy() { logger.info("XSSSecurityFilter destroy() begin"); XSSSecurityManager.destroy(); logger.info("XSSSecurityFilter destroy() end"); } /** * 安全审核 * 读取配置信息 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 判断是否使用HTTP checkRequestResponse(request, response); // 转型 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // http信息封装类 XSSHttpRequestWrapper xssRequest = new XSSHttpRequestWrapper(httpRequest); // 对request信息进行封装并进行校验工作,若校验失败(含非法字符),根据配置信息进行日志记录和请求中断处理 if(xssRequest.validateParameter(httpResponse)){ if(XSSSecurityConfig.IS_LOG){ // 记录攻击访问日志 // 可使用数据库、日志、文件等方式 } if(XSSSecurityConfig.IS_CHAIN){ httpRequest.getRequestDispatcher(XSSSecurityCon.FILTER_ERROR_PAGE).forward( httpRequest, httpResponse); return; } } chain.doFilter(xssRequest, response); } /** * 初始化操作 */ public void init(FilterConfig filterConfig) throws ServletException { XSSSecurityManager.init(filterConfig); } /** * 判断Request ,Response 类型 * @param request * ServletRequest * @param response * ServletResponse * @throws ServletException */ private void checkRequestResponse(ServletRequest request, ServletResponse response) throws ServletException { if (!(request instanceof HttpServletRequest)) { throw new ServletException("Can only process HttpServletRequest"); } if (!(response instanceof HttpServletResponse)) { throw new ServletException("Can only process HttpServletResponse"); } } }
/** * */ package com.sg.security; import java.util.Iterator; import java.util.regex.Pattern; import javax.servlet.FilterConfig; import org.apache.log4j.Logger; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * @author winnie * @date * @describe 安全过滤配置管理类,由XSSSecurityManger修改 */ public class XSSSecurityManager { private static Logger logger = Logger.getLogger(XSSSecurityManager.class); /** * REGEX:校验正则表达式 */ public static String REGEX; /** * 特殊字符匹配 */ private static Pattern XSS_PATTERN ; private XSSSecurityManager(){ //不可被实例化 } public static void init(FilterConfig config){ logger.info("XSSSecurityManager init(FilterConfig config) begin"); //初始化过滤配置文件 String xssPath = config.getServletContext().getRealPath("/") + config.getInitParameter("securityconfig"); // 初始化安全过滤配置 try { if(initConfig(xssPath)){ // 生成匹配器 XSS_PATTERN = Pattern.compile(REGEX); } } catch (DocumentException e) { logger.error("安全过滤配置文件xss_security_config.xml加载异常",e); } logger.info("XSSSecurityManager init(FilterConfig config) end"); } /** * 读取安全审核配置文件xss_security_config.xml * 设置XSSSecurityConfig配置信息 * @param path 配置文件地址 eg C:/apache-tomcat-6.0.33/webapps/security_filter/WebRoot/config/xss/xss_security_config.xml * @return * @throws DocumentException */ @SuppressWarnings("unchecked") public static boolean initConfig(String path) throws DocumentException { logger.info("XSSSecurityManager.initConfig(String path) begin"); Element superElement = new SAXReader().read(path).getRootElement(); XSSSecurityConfig.IS_CHECK_HEADER = new Boolean(getEleValue(superElement,XSSSecurityCon.IS_CHECK_HEADER)); XSSSecurityConfig.IS_CHECK_PARAMETER = new Boolean(getEleValue(superElement,XSSSecurityCon.IS_CHECK_PARAMETER)); XSSSecurityConfig.IS_LOG = new Boolean(getEleValue(superElement,XSSSecurityCon.IS_LOG)); XSSSecurityConfig.IS_CHAIN = new Boolean(getEleValue(superElement,XSSSecurityCon.IS_CHAIN)); XSSSecurityConfig.REPLACE = new Boolean(getEleValue(superElement,XSSSecurityCon.REPLACE)); Element regexEle = superElement.element(XSSSecurityCon.REGEX_LIST); if(regexEle != null){ Iterator<Element> regexIt = regexEle.elementIterator(); StringBuffer tempStr = new StringBuffer("^"); //xml的cdata标签传输数据时,会默认在\前加\,需要将\\替换为\ while(regexIt.hasNext()){ Element regex = (Element)regexIt.next(); String tmp = regex.getText(); tmp = tmp.replaceAll("\\\\\\\\", "\\\\"); tempStr.append(tmp); tempStr.append("|"); } if(tempStr.charAt(tempStr.length()-1)=='|'){ REGEX= tempStr.substring(0, tempStr.length()-1)+"$"; logger.info("安全匹配规则"+REGEX); }else{ logger.error("安全过滤配置文件加载失败:正则表达式异常 "+tempStr.toString()); return false; } }else{ logger.error("安全过滤配置文件中没有 "+XSSSecurityCon.REGEX_LIST+" 属性"); return false; } logger.info("XSSSecurityManager.initConfig(String path) end"); return true; } /** * 从目标element中获取指定标签信息,若找不到该标签,记录错误日志 * @param element 目标节点 * @param tagName 制定标签 * @return */ private static String getEleValue(Element element, String tagName){ if (isNullStr(element.elementText(tagName))){ logger.error("安全过滤配置文件中没有 "+XSSSecurityCon.REGEX_LIST+" 属性"); } return element.elementText(tagName); } /** * 对非法字符进行替换 * @param text * @return */ public static String securityReplace(String text){ if(isNullStr(text)){ return text; }else{ return text.replaceAll(REGEX, XSSSecurityCon.REPLACEMENT); } } /** * 匹配字符是否含特殊字符 * @param text * @return */ public static boolean matches(String text){ if(text==null){ return false; } return XSS_PATTERN.matcher(text).matches(); } /** * 释放关键信息 */ public static void destroy(){ logger.info("XSSSecurityManager.destroy() begin"); XSS_PATTERN = null; REGEX = null; logger.info("XSSSecurityManager.destroy() end"); } /** * 判断是否为空串,建议放到某个工具类中 * @param value * @return */ public static boolean isNullStr(String value){ return value == null || value.trim().equals(""); } }
/** * */ package com.sg.security; /** * @author winnie * 安全过滤配置信息类 */ public class XSSSecurityConfig { /** * CHECK_HEADER:是否开启header校验 */ public static boolean IS_CHECK_HEADER; /** * CHECK_PARAMETER:是否开启parameter校验 */ public static boolean IS_CHECK_PARAMETER; /** * IS_LOG:是否记录日志 */ public static boolean IS_LOG; /** * IS_LOG:是否中断操作 */ public static boolean IS_CHAIN; /** * REPLACE:是否开启替换 */ public static boolean REPLACE; }
/** * */ package com.sg.security; /** * @author winnie * @date * @describe */ public class XSSSecurityCon { /** * 配置文件标签 isCheckHeader */ public static String IS_CHECK_HEADER = "isCheckHeader"; /** * 配置文件标签 isCheckParameter */ public static String IS_CHECK_PARAMETER = "isCheckParameter"; /** * 配置文件标签 isLog */ public static String IS_LOG = "isLog"; /** * 配置文件标签 isChain */ public static String IS_CHAIN = "isChain"; /** * 配置文件标签 replace */ public static String REPLACE = "replace"; /** * 配置文件标签 regexList */ public static String REGEX_LIST = "regexList"; /** * 替换非法字符的字符串 */ public static String REPLACEMENT = ""; /** * FILTER_ERROR_PAGE:过滤后错误页面 */ public static String FILTER_ERROR_PAGE = "/common/filtererror.jsp"; }
xss_security_config.xml
<?xml version="1.0" encoding="UTF-8"?> <XSSConfig> <!-- 是否进行header校验 --> <isCheckHeader>false</isCheckHeader> <!-- 是否进行parameter校验 --> <isCheckParameter>true</isCheckParameter> <!-- 是否记录日志 --> <isLog>true</isLog> <!-- 是否中断请求 --> <isChain>false</isChain> <!-- 是否开启特殊字符替换 --> <replace>true</replace> <!-- 是否开启特殊url校验 --> <isCheckUrl>true</isCheckUrl> <regexList> <!-- 匹配含有字符: alert( ) --> <regex><![CDATA[.*[A|a][L|l][E|e][R|r][T|t]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: window.location = --> <regex><![CDATA[.*[W|w][I|i][N|n][D|d][O|o][W|w]\\.[L|l][O|o][C|c][A|a][T|t][I|i][O|o][N|n]\\s*=.*]]></regex> <!-- 匹配含有字符:style = x:ex pression ( ) --> <regex><![CDATA[.*[S|s][T|t][Y|y][L|l][E|e]\\s*=.*[X|x]:[E|e][X|x].*[P|p][R|r][E|e][S|s]{1,2}[I|i][O|o][N|n]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: document.cookie --> <regex><![CDATA[.*[D|d][O|o][C|c][U|u][M|m][E|e][N|n][T|t]\\.[C|c][O|o]{2}[K|k][I|i][E|e].*]]></regex> <!-- 匹配含有字符: eval( ) --> <regex><![CDATA[.*[E|e][V|v][A|a][L|l]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: unescape() --> <regex><![CDATA[.*[U|u][N|n][E|e][S|s][C|c][A|a][P|p][E|e]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: execscript( ) --> <regex><![CDATA[.*[E|e][X|x][E|e][C|c][S|s][C|c][R|r][I|i][P|p][T|t]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: msgbox( ) --> <regex><![CDATA[.*[M|m][S|s][G|g][B|b][O|o][X|x]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: confirm( ) --> <regex><![CDATA[.*[C|c][O|o][N|n][F|f][I|i][R|r][M|m]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: prompt( ) --> <regex><![CDATA[.*[P|p][R|r][O|o][M|m][P|p][T|t]\\s*\\(.*\\).*]]></regex> <!-- 匹配含有字符: <script> </script> --> <regex><![CDATA[.*<[S|s][C|c][R|r][I|i][P|p][T|t]>.*</[S|s][C|c][R|r][I|i][P|p][T|t]>.*]]></regex> <!-- 匹配含有字符: 含有一个符号: " --> <regex><![CDATA[[.&[^\"]]*\"[.&[^\"]]*]]></regex> <!-- 匹配含有字符: 含有一个符号: ' --> <regex><![CDATA[[.&[^']]*'[.&[^']]*]]></regex> <!-- 匹配含有字符: 含有回车换行 和 <script> </script> --> <regex><![CDATA[[[.&[^a]]|[|a|\n|\r\n|\r|\u0085|\u2028|\u2029]]*<[S|s][C|c][R|r][I|i][P|p][T|t]>.*</[S|s][C|c][R|r][I|i][P|p][T|t]>[[.&[^a]]|[|a|\n|\r\n|\r|\u0085|\u2028|\u2029]]*]]></regex> </regexList> </XSSConfig>
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 信息安全审核 --> <filter> <filter-name>XSSFiler</filter-name> <filter-class> com.sg.security.XSSSecurityFilter </filter-class> <init-param> <param-name>securityconfig</param-name> <param-value> /WebRoot/config/xss/xss_security_config.xml </param-value> </init-param> </filter> <!-- 拦截请求类型 --> <filter-mapping> <filter-name>XSSFiler</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>XSSFiler</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> </web-app>
- security_filter.zip (678.5 KB)
- 下载次数: 589
评论
11 楼
young_java
2017-12-28
<javascript>alert(0)</javascript>
10 楼
javawang_java
2016-12-02
<scRript>a;ert(xs1)</scri pt>
9 楼
chenqili111
2016-06-12
chenqili111 写道
富文本编辑器时也会阻止掉,请问下怎么搞
8 楼
chenqili111
2016-06-12
富文本编辑器时也会组织掉,请问下怎么搞
7 楼
lliiqiang
2015-12-11
有的时候需要富客户端很麻烦。
最好在防火墙智能判断一下,程序妥协配合一下
sql:禁止注释 常量条件 大小写混合 \u等编码转义
xss:标签中注释 大小写混合标识符 不符合xml规定 费时间属性有script代码\u %等编码转义 eval String.formCharCode等动态转义都有巨大的安全风险。
最好在防火墙智能判断一下,程序妥协配合一下
sql:禁止注释 常量条件 大小写混合 \u等编码转义
xss:标签中注释 大小写混合标识符 不符合xml规定 费时间属性有script代码\u %等编码转义 eval String.formCharCode等动态转义都有巨大的安全风险。
6 楼
jreey0391
2015-11-05
look.eye 写道
在登录地址后面加脚本为什么还是能弹出啊!
http://localhost:808/
/index.jsp?clientheight1=0'%22()%26%25<acx><ScRiPt%20>prompt(913252)</ScRiPt>&clientwidth1=0¶ms=
http://localhost:808/
/index.jsp?clientheight1=0'%22()%26%25<acx><ScRiPt%20>prompt(913252)</ScRiPt>&clientwidth1=0¶ms=
仔细看下代码,原始代码没有开始检测到之后终止请求,而是直接放过请求了,所以才没有效果
5 楼
jreey0391
2015-11-05
很好用,多谢,只是好像有些没写完的样子,比如配置文件中的是否开启替换,代码中并没有体现,还有是否开启特殊url校验 isCheckUrl 完全没有体现出来
4 楼
look.eye
2015-10-23
在登录地址后面加脚本为什么还是能弹出啊!
http://localhost:808/
/index.jsp?clientheight1=0'%22()%26%25<acx><ScRiPt%20>prompt(913252)</ScRiPt>&clientwidth1=0¶ms=
http://localhost:808/
/index.jsp?clientheight1=0'%22()%26%25<acx><ScRiPt%20>prompt(913252)</ScRiPt>&clientwidth1=0¶ms=
3 楼
long416811
2015-06-03
一直提示路径错误
2 楼
ouyangkang20
2013-09-30
配置拦截之后 是对所有的参数 都进行 验证吗?
站点流量很大 , 性能如何?
站点流量很大 , 性能如何?
1 楼
donyee
2013-07-09
发表评论
-
博客更新地址说明
2013-09-02 09:33 832个人偏好原因,今后的博客将发表在 http://my.os ... -
sybase使用proxool后的SET CHAINED错误
2013-04-01 09:55 1755公司原来使用dbcp连接池连接数据库,但是在 ... -
The 'select into' database option is not enabled for database ***
2013-03-19 17:18 1550在sybase进行列更新语句时,可能会遇到这样的错误 无法 ... -
TreeSet研究
2012-05-04 10:38 1044TreeSet拥有和Set的基础属性:不能重复。 同时 ... -
变量命名规则
2012-04-09 15:33 1309约定优于配置 1. 变量的声明和初始化尽可能放在第一次使 ... -
xstream自定义Converter的优化
2012-03-05 09:44 4552针对list类型的自定义Converter进行优化,提供参数实 ... -
xstream自定义Converter
2012-02-29 17:24 1651描述:当实体类中出现两个存放String类型的List集合时, ... -
Jcs对大数据量的处理方案
2012-01-16 18:26 1521Jcs的原理是利用缓存获取用户所需要的数据 ... -
java.lang.UnsupportedClassVersionError
2011-09-05 12:10 977java.lang.UnsupportedClassVersi ... -
SecureCRT连接VMWare中Linux
2011-04-13 23:30 5763说明Linux版本:RedHat 5.5(其他版本应该类似)W ... -
容器的特点
2011-03-10 22:27 996有幸参加一次电话面试,让我知道了一个成功的钓鱼人只和一只300 ... -
Oracle自定义异常类型及产生原因
2011-01-06 15:40 2345查找资料总结了ORACLE预定义异常及产生的原因,若有出入请多 ... -
Webwork中获取session信息类的封装
2011-01-05 16:56 1909webwork开发过程中,获取session中的信 ...
相关推荐
一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如...
Springboot中会使用FilterRegistrationBean来注册Filter,Filter是Servlet规范里面的,属于容器范围,Springboot中没有web.xml,那Springboot中,不用管Filter是如何交给Ser...SpringBoot整合XssFilter,Jsoup等实现...
SpringBoot +esapi springSecurity 过滤器链集成 实现防止xss攻击 实战代码
自定义一个Filter拦截器,使用 Filter来过滤浏览器发出的请求,检测每个请求的参数是否含有XSS攻击关键字,如果存在xss攻击关键字,转义特殊字符。 方法是实现一个自定义的 HttpServletRequestWrapper ,然后在 ...
首先说一下思路,防止这种类似于注入攻击,就是使用拦截器(Filter)处理特殊字符或过滤特殊字符 今天介绍一个方法,利用覆盖Servlet的getParameter方法达到处理特殊字符的目的来解决(防止)Xss攻击 web.xml,需要的...
所有需要的文件均在里面,超有所值
第8章 防御XSS攻击,介绍了一些防范XSS攻击的方法,例如,运用XSS Filter进行输入过滤和输出编码,使用Firefox浏览器的Noscript插件抵御XSS攻击,使用HTTP-only的Cookies同样能起到保护敏感数据的作用。
对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags这些函数都使用上了也不一定能保证绝对的...
java过滤器,XSS : 跨站脚本攻击(Cross Site Scripting),SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
Laravel XSS 过滤器 这个包添加了一个额外的过滤器来防止 xss 攻击...您可以使用 xss 过滤器清除 Xss 攻击中的输入 HTML 代码: <?php Route :: post ( '/' , array ( 'before' => 'xss' , function (){ // }));
SpringBoot整合XssFilter,Jsoup等实现请求参数的过滤,处理Xss攻击及sql注入
防止xss注入,有antlr-runtime和xssProtect两个jar包,及相关的filter过滤器。
asp-xss-filterThis is classical ASP, not ASP.NET!!!!这是经典ASP,不是ASP.NET!!!!Transplanted from (由项目移植)Although it is written by JScript, but can also be used in VBScript.(虽然它是由...
在.net环境里,一直没有好的Xss跨站脚本攻击过滤工具,于是将Java下的AntiSamy封装成了WebService,供.net程序调用。 运行环境是TOMCAT 7,JDK 1.6。 将War包复制到Tomcat安装目录下的webapps目录,然后启动Tomcat...
如果将过滤器与白名单方法一起使用,它将为XSS攻击的网站提供比使用黑名单方法的现有过滤器更严格的安全措施。 同时支持DOM和SAX解析器。XssPreventer 使用apache-common-lang3库防止XSS攻击。 只需按如下所示转换...
你还在为防范xss注入攻击而头疼吗,开源的XSS HTMLFILTER工具类能帮你过滤表单或链接中敏感的js html字符,有完整的源代码和代码示例 为您的系统增添xss的第一道防护
<?... namespace DMS\Filter; /** * Filter Object, responsible for retrieving the filtering rules ...dms-filter的php过滤库就是一个防止别人恶意攻击你的过滤库,有需要的朋友可以下载使用。
另外,可以通过Extension_XSSFilter::detectXSS($string)直接在您的扩展中使用XSS过滤器,该扩展Extension_XSSFilter::detectXSS($string)接受一个字符串,如果检测到XSS,则返回布尔值。 前端实用程序 从XSS Filter...
<?... ... use Filterus\Filter;...在PHP中,有些很有用的函数开源非常方便的防止你的网站遭受各种攻击,例如SQL注入攻击,XSS(Cross Site Scripting:跨站脚本)攻击等。简单的PHP过滤库就是这么一个简单好用的过滤库