【发布时间】:2014-04-04 04:30:13
【问题描述】:
我正在使用下面提到的布尔语句来了解我从输入框中得到的字符串是否包含任何特殊字符。我想知道这是防止XSS攻击的好方法吗?这个过滤器可以绕过吗?
!id.matches(".*[%#^<>&;'\0-].*")
这是完整的代码
package pack.java;
import pack.java.findrequestmodel;
import java.io.*;
import java.lang.*;
import org.apache.commons.lang.StringEscapeUtils;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class findrequestcontrol extends TagSupport
{
HttpServletRequest request;
HttpServletResponse response;
public int doStartTag() throws JspException
{
request = (HttpServletRequest) pageContext.getRequest();
response = (HttpServletResponse) pageContext.getResponse();
return EVAL_PAGE;
}
public ResultSet check()
{
JspWriter out = pageContext.getOut();
Connection con;
ResultSet rs = null;
CallableStatement stmt;
String checkreq = "";
String reqnum = (String) findrequestmodel.requestno.trim();
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException ex)
{
}
try
{
if (!reqnum.matches(".*[%#^<>&;'\0-].*") )
{
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","gaurav","oracle");
stmt=con.prepareCall("begin requestdetail(?); end;");
stmt.setString(1,reqnum);
rs=stmt.executeQuery();
}
else
out.println("Invalid Number");
}
catch(SQLException ex)
{
}
catch(Exception ex)
{
}
return rs;
}
public int doEndTag() throws JspException
{
JspWriter out=pageContext.getOut();
ResultSet rs=check();
try
{
if (!rs.next())
{
out.println("no data found");
}
else
{
out.println("<table border=2>");
out.println("<tr>");
out.println("<th>EmployeId</th>");
out.println("</tr>");
do
{
out.println("<tr>");
out.println("<td>"+rs.getString(1)+"</td>");
out.println("</tr>");
} while (rs.next());
}
}
catch(Exception ex)
{
}
return super.doEndTag();
}
}
下面是jsp页面,这里输入字符串,提交时重定向到另一个调用tag的页面。
<html>
<head>
</head>
<body>
<form method=post>
<input type=text style="color:grey" name=reqno </br>
<input type = submit name = submit value = Submit>
<%
String r=request.getParameter("reqno");
String btn=request.getParameter("submit");
HttpSession session1=request.getSession();
session1.setAttribute("requestno",r);
if (btn != null)
response.sendRedirect("findrequest1.jsp");
%>
</form>
</body>
</html>
这里调用了标签
<jsp:useBean id="MrBean" class="pack.java.findrequestmodel"/>
<jsp:setProperty name="MrBean" property="requestno" value=""/>
<%@ taglib uri="/WEB-INF/jsp2/taglib8.tld" prefix="easy" %>
<html>
<head>
<body>
<form method=post>
<input type = submit name = submit value = Back>
<%
HttpSession mysession = request.getSession();
String req = (String) mysession.getAttribute("requestno");
MrBean.setRequestno(req);
String btn = request.getParameter("submit");
if (btn != null)
response.sendRedirect("findrequest.jsp");
%>
<easy:myTag8/>
</form>
</body>
</html>
【问题讨论】:
-
哪种编程语言? JavaScript ?
-
您还需要为查询使用准备好的语句,而不是连接语句。既然您担心安全问题,那就是第一个安全漏洞。
-
@tom- 是的,我肯定会对代码进行更多更改以防止 SQL 注入,但是你能告诉我如何以及在哪里使用 StringEscapeUtils.escapeHtml 在我的代码中。
-
您在正确的位置拥有它,但您缺少一个“+”。
out.println("<td>"+StringEscapeUtils.escapeHtml(rs.getString(1))+"</td>");
标签: java xss boolean-expression