如何防止javascript注入攻击

JavaScript010

如何防止javascript注入攻击,第1张

很多网站都有私信或者留言板功能。登录用户可以发表评论或者给其他用户(包括管理员)发送私信。一个最简单的模拟表单如下:

<form action="sendmessage.php" method="post'">

<textarea name="message"></textarea>

<input type="submit" value="send" />

</form>

当用户点击发送时,这条消息会被保存在数据库中指定的数据表中,另一个用户当打开这条消息的时候将看到发送的内容。但是,如果一个恶意攻击者发送的内容包含了一些javascript代码,这些代码用于偷取敏感的cookie信息。当用户打开看到这条消息的时候,恶意的javascript代码就会得到执行,造成敏感cookie信息泄漏。攻击者可以利用获得这些cookie信息进行session hijacking会话劫持,直接以合法用户的身份登录其他用户的账户。

恶意攻击者可以在消息框中加入一下javascript代码:

在java Web体系中,可以写自定义标签,过滤用户输入,也可以写一个filter过滤器。比如说自定义标签。

开发步骤:

1 写一个标签处理类

2  在/WEB-INF/目录下,写一个*.tld文件,目的是让Web容器知道自定义标签和标签处理类的对应关系

3 在JSP页面中,通过<%@taglib%>指令引用标签库.

4 部署web应用,访问simple.jsp即可

其中,标签处理类可以这样写,转义大于号,小于号等特殊符号。

package cn.itcast.web.jsp.tag

import java.io.IOException

import java.io.StringWriter

import javax.servlet.jsp.JspException

import javax.servlet.jsp.PageContext

import javax.servlet.jsp.tagext.JspFragment

import javax.servlet.jsp.tagext.SimpleTagSupport

//<simple:filter>标签处理类

public class FilterTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

JspFragment jspFragment = this.getJspBody()

StringWriter writer = new StringWriter()

jspFragment.invoke(writer)

String temp = writer.getBuffer().toString()

//结果必定是转义后的字符串

temp = filter(temp)

PageContext pageContext = (PageContext) this.getJspContext()

pageContext.getOut().write(temp)

}

public String filter(String message) {

        if (message == null)

            return (null)

        char content[] = new char[message.length()]

        message.getChars(0, message.length(), content, 0)

        StringBuffer result = new StringBuffer(content.length + 50)

        for (int i = 0 i < content.length i++) {

            switch (content[i]) {

            case '<':

                result.append("&lt")

                break

            case '>':

                result.append("&gt")

                break

            case '&':

                result.append("&amp")

                break

            case '"':

                result.append("&quot")

                break

            default:

                result.append(content[i])

            }

        }

        return (result.toString())

    }

}

过滤特定符号

    public static String guolv(String a) {

        a = a.replaceAll("%22", "")

        a = a.replaceAll("%27", "")

        a = a.replaceAll("%3E", "")

        a = a.replaceAll("%3e", "")

        a = a.replaceAll("%3C", "")

        a = a.replaceAll("%3c", "")

        a = a.replaceAll("<", "")

        a = a.replaceAll(">", "")

        a = a.replaceAll("\"", "")

        a = a.replaceAll("'", "")

        a = a.replaceAll("\\+", "")

        a = a.replaceAll("\\(", "")

        a = a.replaceAll("\\)", "")

        a = a.replaceAll(" and ", "")

        a = a.replaceAll(" or ", "")

        a = a.replaceAll(" 1=1 ", "")

        return a

    }