&;-6ren">
gpt4 book ai didi

java - 使用 (.matches) boolean 语句可以防止 XSS 攻击吗?

转载 作者:行者123 更新时间:2023-12-01 13:19:48 24 4
gpt4 key购买 nike

我使用下面提到的 boolean 语句来了解从输入框中获取的字符串是否包含任何特殊字符。我想知道这是防止 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页面,在此处输入字符串并在提交时重定向到调用标签的不同页面。

<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>

最佳答案

事实上,您想要的是防止使用特殊字符的XSS攻击。所以你实际上不必关心字符串中存在的字符。您只需在对数据库执行任何操作之前使用与 PHP 中的 htmlspecialchars() 用途相同的函数将它们分隔开即可。

显然这种转换也可以在Java中完成。

要替换所有 HTML 实体 ( source ):

String source = "Escape the less than sign (<) and ampersand (&)";
String escaped = StringEscapeUtils.escapeHtml(source);
// Will output "Escape the less than sign (&lt;) and ampersand (&amp;)"

仅替换选定的字符子集 ( source ):

String escaped = StringUtils.replaceEach(source, new String[]{"&", "<"}, new String[]{"&amp;", "&lt;"});

编辑:

以您的示例为例,您必须在变量 reqnum 中使用空格特殊字符,因为您将在 SQL 请求中使用它:

String checkreq="";
String reqnum=(String)findrequestmodel.requestno.trim();
reqnum = StringEscapeUtils.escapeHtml(reqnum); // Espace special characters
// ... skipped code ...
rs=stmt.executeQuery(" select * from myadmin where reference_no='"+reqnum+"'"); // Safe

替代(更好)的解决方案

您不应该自己处理这个问题,而应该使用名为 PreparedStatement 的东西它可以为你做这件事,还有其他有用的东西。

关于java - 使用 (.matches) boolean 语句可以防止 XSS 攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com