2016-09-21 128 views
2

我正在开发一个web应用程序,它通过HTML输入接受用户输入,并将它发送到我的tomcat服务器进行进一步处理。正确使用正则表达式时需要HTML转义吗?

目前我的工作流程是这样的:

客户

JS - > HTML需要输入 - >做正则表达式检查 - >如果全成 - > $。员额(...)

服务器

接收后的数据 - >做正则表达式检查 - >如果全成 - >处理数据

从我understandig这应该是罚款,也没有必要做HTML转义

我想知道是否有可能仍然是在东西是不允许潜行的方式。


进一步的思考:

在我的.java文件的

public void doPost(HttpServletRequest request, HttpServletResponse response){...} 方法执行下列操作以接收已发送的参数:

String post_param_1 = request.getParameter("param_1"); 

这(明明)必须在正则表达式检查可以在该特定参数上运行之前发生。

问题1:这可能是攻击者在java代码中潜入/导致不需要的行为的“开放窗口”吗?攻击者可以发送后请求与一个单独的工具,而不是通过正规的网站(例如)

问题2:如果Q#1被证明是真实的,可以做这样的事情:

request.getParameter("param_1").matches(regex_string) 

规避?

问题3:如果我的做法是足够的,它仍然需要做HTML转义在somepoint(可能在掠JS输入之间,并通过正则表达式运行之前)?

最后有没有人对这个主题有任何意见或建议,还是我缺少一些东西(比如在客户端和服务器上执行正则表达式检查太多)?

问候 Alkahna

回答

0

通过 “HTML转义” 你的意思是将HTML特殊字符(如<>),以他们的HTML实体(&lt;&gt;)假设,那么答案很简单:

当您将该输入显示回用户时,您只需转义用户提供的输入。

将其以纯文本格式*存储在数据库中。这允许更简单的后端文本处理(如搜索)以及可能的导出为其他非HTML格式。

只有在将文本插入到HTML页面时,才会使文本转义。例如说,你已经从检索数据库中的文本和存储在名为“文本”的请求属性,然后在你的JSP页面中,你会做以下任一:

<c:out value="${text}" /> 
${fn:escapeXml(text)} 

如有必要逃避任何特殊字符在这一点上。

如果您不是将输入存储在数据库中,而是对其进行其他操作,则应遵循相同的原则:以纯文本格式处理它,并且只有在将其插入到HTML文档中时才将其转义。


关于你的编号问题:

"Could this maybe be an "open window" for attackers to sneak in/ cause unwanted behaviour within the java-code?"

我真的不知道你在问什么,在这里。很明显,您需要从请求的参数映射中获取参数,以便对其执行任何操作。用户不能注入代码Java代码。

否则request.getParameter("param_1").matches(regex_string)可能会导致一个NullPointerException如果request.getParameter("param_1")回报null。你可能想要做这样的事情:

String post_param_1 = request.getParameter("param_1"); 
if (post_param_1 != null && post_param_1.matches(regex)) { 
    // param present and valid 
} 

我觉得我的这些答案,这个要点。


*当我说“它存储在纯文本格式”很明显,你需要正确防范SQL注入这样

+0

THX你的答案的时候。为了逃避一般:我只需要输入并在服务器端进行处理。文本显示已经处理完毕。对于'1)'它一般是针对注入攻击(JS也是)。这就是我想在这里安全的原因。对'2)'你是对的,那就是我现在在代码中已经做的事情。所以最后你可以说,我的方法足以防止错误输入(正则表达式),并通过自动注入攻击? – Alkahna

+0

是的,在向用户显示文本时转义是防止JS注入的必要条件。 – megaflop