`
武瑞华
  • 浏览: 10977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

url参数script注入攻击 防御

 
阅读更多

package net.survey.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * 处理非法字符
 *
 * @author   wuruihua
 * @myblog http://blog.sina.com.cn/ruihuawu
 * @create    2016年5月19日
 */
public class XssShieldUtil {

    private static List<Pattern> patterns = null;

    private static List<Object[]> getXssPatternList() {
        List<Object[]> ret = new ArrayList<Object[]>();

        ret.add(new Object[]{"<(no)?script[^>]*>.*?</(no)?script>", Pattern.CASE_INSENSITIVE});
        ret.add(new Object[]{"eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
        ret.add(new Object[]{"expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
        ret.add(new Object[]{"(javascript:|vbscript:|view-source:)*", Pattern.CASE_INSENSITIVE});
        ret.add(new Object[]{"<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
        ret.add(new Object[]{"(window\\.location|window\\.|\\.location|document\\.cookie|document\\.|alert\\(.*?\\)|window\\.open\\()*", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
        ret.add(new Object[]{"<+\\s*\\w*\\s*(oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror=|onerroupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmousout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onabort|onactivate|onafterprint|onafterupdate|onbefore|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)+\\s*=+", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
        return ret;
    }

    private static List<Pattern> getPatterns() {

        if (patterns == null) {

            List<Pattern> list = new ArrayList<Pattern>();

            String regex = null;
            Integer flag = null;
            int arrLength = 0;

            for(Object[] arr : getXssPatternList()) {
                arrLength = arr.length;
                for(int i = 0; i < arrLength; i++) {
                    regex = (String)arr[0];
                    flag = (Integer)arr[1];
                    list.add(Pattern.compile(regex, flag));
                }
            }

            patterns = list;
        }

        return patterns;
    }

    public static String stripXss(String value) {
        if(StringUtils.isNotBlank(value)) {

            Matcher matcher = null;

            for(Pattern pattern : getPatterns()) {
                matcher = pattern.matcher(value);
                // 匹配
                if(matcher.find()) {
                    // 删除相关字符串
                    value = matcher.replaceAll("");
                }
            }

            value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
        }

        return value;
    }
    public static boolean stripXSS(String value) {
        boolean result = false;
        if (value != null) {

            // Avoid null characters
            value = value.replaceAll("", "");

            // Avoid anything between script tags
            Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            // //如果找到则为true
            if (result)
                return result;

            // Avoid anything in a src='...' type of expression
            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            // Remove any lonesome </script> tag
            scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            // Remove any lonesome <script ...> tag
            scriptPattern = Pattern.compile("<script(.*?)>",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            // Avoid eval(...) expressions
            scriptPattern = Pattern.compile("eval\\((.*?)\\)",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            // Avoid expression(...) expressions
            scriptPattern = Pattern.compile("expression\\((.*?)\\)",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            // Avoid onload= expressions
            scriptPattern = Pattern.compile("onload(.*?)=",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;

            // Avoid alert:... expressions
            scriptPattern = Pattern.compile("alert", Pattern.CASE_INSENSITIVE);
            result = scriptPattern.matcher(value).find();// .replaceAll("");
            if (result)
                return result;
        }
        return result;
    }

}

0
0
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    web安全之XSS攻击及防御pdf

    这类攻击通常出现在URL参数中,例如在搜索框或链接中嵌入恶意代码。 ##### 2.2 持久型XSS 持久型XSS比反射型XSS更为危险,因为它涉及到了Web服务器本身的安全问题。在这种情况下,恶意脚本被直接存储在服务器上,...

    XSS跨站脚本攻击剖析与防御(目录)

    - **反射型XSS**:也称为非持久型XSS,通过URL参数直接实现,是利用网页返回的数据执行脚本。 - **DOM-based XSS**:利用页面中DOM节点的动态性质来修改当前页面的DOM环境,导致页面的某些部分加载恶意脚本。 #### ...

    java 请求参数过滤拦截

    这里的“java请求参数过滤拦截”主要是指在接口接收到用户输入的数据时,通过过滤器(Filter)对参数进行检查,防止恶意攻击者利用特殊字符执行SQL注入、跨站脚本攻击(XSS)等危害。下面我们将详细探讨这一主题。 ...

    跨站脚本攻击字符过滤

    跨站脚本攻击是一种注入攻击,攻击者通过在网页中插入恶意脚本代码,当用户浏览该页面时,恶意脚本就会被执行。这种攻击方式可以窃取用户的敏感信息(如Cookie和Session ID等),进而实施进一步的攻击行为。根据攻击...

    如何进行跨站脚本攻击--原理、检测与防御

    如果用户通过URL传递了一个恶意参数`name=lake&lt;script&gt;alert(123456)&lt;/script&gt;`,那么当页面加载时,用户的浏览器将尝试执行嵌入的`&lt;script&gt;`标签内的JavaScript代码。这将导致一个弹出窗口出现,显示出攻击者预设的...

    一个典型的XSS框架注入攻击的分析和预防.zip

    XSS(Cross-Site Scripting)框架注入攻击是网络安全领域中的常见威胁,它利用了Web应用程序未能充分过滤或编码用户输入的数据,导致恶意脚本在其他用户的浏览器中执行。这种攻击方式可以用来窃取用户的敏感信息,如...

    Nginx中防止SQL注入攻击的相关配置介绍

    在Nginx中防止SQL注入攻击是保护Web应用程序...总之,防止SQL注入攻击需要多层防御策略,包括但不限于Nginx配置、应用程序代码安全实践以及定期的安全更新和审计。通过这些措施,可以显著降低网站被SQL注入攻击的风险。

    web script injectioin

    4. **编码和解码**:正确地编码和解码数据,如URL、HTML和JSON,避免注入攻击。 5. **内容安全策略(CSP)**:CSP是一种有效的防御XSS的手段,它可以限制浏览器加载的资源类型和来源,阻止未经许可的脚本执行。 6. *...

    1、 web脚本攻击 2、 IIS安全设置

    例如,攻击者可以创建一个ASP页面(xsscks.asp),利用`document.URL`获取URL参数,然后用`document.write`将参数内容写入网页。当参数包含恶意脚本时,如`&lt;script&gt;alert(document.cookie)&lt;/script&gt;`,浏览器会执行...

    经典的PHP网站安全防御文章

    动态函数注入攻击(Dynamic Variable Evaluation) **攻击原理**:攻击者通过构造恶意变量名,使得程序调用恶意函数。 **防御措施**: - 避免使用动态函数调用。 - 对所有函数名进行严格的验证。 #### 14. URL...

    XSS跨站攻击,注入代码整理,大全

    - **反射型XSS**:恶意脚本通常通过URL参数传递,当用户访问该链接时,恶意脚本会被返回并在用户的浏览器中执行。 - **DOM-based XSS**:这种类型的XSS攻击是通过修改客户端的DOM来实现的,恶意脚本并不会被服务器...

    Web安全之XSS攻击与防御小结

    恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。诱使受害者打开受到攻击...

    深信服AF高级-A卷78分.docx

    - `http://www.example.com/group/members.php?id=2&query=123' %22%3E%3Cscript%3Ealert(1)%3C/script%3Exss`同样是SQL注入攻击的例子。 - SQL注入攻击不属于跨站脚本攻击,所以D选项是正确的。 9. **SQL注入...

    万能Asp防注入代码.txt

    这种简单的检测机制对于初学者来说是一个很好的起点,但在实际生产环境中,更建议使用参数化查询、存储过程等更安全的方法来预防SQL注入攻击。此外,对于安全性要求更高的系统,还需要结合其他安全措施如输入验证、...

    XSS注入知识点总结.pdf

    1. 反射型XSS:攻击者通过诱导受害者访问含有恶意脚本的URL触发,攻击脚本通常位于URL参数中,且不会被存储在服务器端,因此不属于持久性XSS。 2. 存储型XSS:攻击脚本被存储在服务器中(如数据库、文件等),当用户...

    web漏洞xss反射型实战挖洞

    2. **访问存在XSS漏洞的URL**:一旦发现可能的XSS点,你可以直接通过浏览器访问该URL,尝试修改参数以注入恶意脚本。例如,如果URL中包含一个用户可控的参数`name`,如`http://example.com/search?q=name`,你可以...

    xssprotect防止XSS攻击源码

    3. 防止URL重定向攻击:XSS攻击有时会利用URL重定向进行,因此需要检查请求中的URL参数,防止非法重定向。 4. 自定义配置:允许开发者根据项目需求,自定义需要过滤的参数和规则。 5. 日志记录:记录每次过滤操作,...

    PHP漏洞全解1

    SQL注入攻击(SQL injection)是另一种常见的威胁,攻击者通过插入恶意SQL代码到查询中,获取、修改或删除数据库中的数据。使用预处理语句和参数绑定是防止SQL注入的有效方法,比如使用PDO或mysqli扩展。 跨站请求...

    php漏洞全解1

    4. **SQL注入攻击(SQL injection)**:攻击者通过注入SQL语句,获取、修改、删除数据库中的数据。预防方法是使用预处理语句(如PDO或mysqli的预处理)和参数绑定,以及避免使用动态构造SQL语句。 5. **跨站请求伪造...

Global site tag (gtag.js) - Google Analytics