JSF中的CSRF、XSS,如何防止SQL注入攻击?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (103)

我有一个基于JSF的Web应用程序,MySQL作为DB。我已经实现了代码,以防止CSRF在我的应用程序中。

现在,由于我的底层框架是JSF,我想我不必处理XSS攻击,因为它已经由UIComponent。我不会在任何视图页面中使用任何JavaScript。我真的需要实现代码来防止XSS攻击吗?

对于DB,我们在所有DB交互中使用准备好的语句和存储过程。

提问于
用户回答回答于

XSS

JSF被设计成内置XSS预防。你可以安全地重新显示使用任何JSF组件,用户控制的输入(请求头(包括cookie!)、请求参数(以及保存在DB!中的请求参数)和请求主体(上传的文本文件等)。

<h:outputText value="#{user.name}" />
<h:outputText value="#{user.name}" escape="true" />
<h:inputText value="#{user.name}" />
etc...

注意,当您在Facelets上使用JSF2.0时,您可以在模板文本中使用EL,如下所示:

<p>Welcome, #{user.name}</p>

这也将隐式地逃脱。你不一定需要<h:outputText>给你。

当你明确地逃逸用户控制输入escape="false":

<h:outputText value="#{user.name}" escape="false" />

那你就有了一个潜在的XSS攻击洞!

itemLabelEscapedMojarra中的bug<2.2.6

<f:selectItems value="#{bean.entities}" var="entity" itemValue="#{entity}"
    itemLabel="#{entity.someUserControlledProperty}" itemLabelEscaped="true" />

CSRF

JSF2.x已经在javax.faces.ViewState使用服务器端状态保存时,表单中的隐藏字段。

SQL注入

将用户控制的输入连接到sql字符串中,如下所示

String sql = "SELECT * FROM user WHERE username = '" + username + "' AND password = md5(" + password + ")";
String jpql = "SELECT u FROM User u WHERE u.username = '" + username + "' AND u.password = md5('" + password + "')";

Enduser选择以下名称,会发生什么情况:

x'; DROP TABLE user; --

你应该在适用的情况下使用参数化查询。

String sql = "SELECT * FROM user WHERE username = ? AND password = md5(?)";
String jpql = "SELECT u FROM User u WHERE u.username = ?1 AND u.password = md5(?2)";

在普通JDBC中,您需要使用PreparedStatement若要填充参数值,并在JPA(和Hibernate)中,Query对象也为此提供了setter。

用户回答回答于

我不会在任何视图页面中使用任何JavaScript。即使我使用,我真的需要实现代码来绕过XSS攻击。

即使在页面中不使用JavaScript,也可能容易受到XSS的攻击。XSS发生在没有正确编码的情况下合并由攻击者控制的内容时。

response.write("<b>" + x + "</b>")

攻击者可能导致x若要包含包含JavaScript的HTML,则容易受到XSS的攻击。

通常,解决方案是编码。$x以及攻击者控制的任何其他值,然后将它们包含在生成的HTML中。

response.write("<b>" + escapePlainTextToHtml(x) + "</b>")

<shameless-plug>

您还可以使用一种模板语言来自动编码输出以防止XSS。

扫码关注云+社区

领取腾讯云代金券