Tha*_*ham 9 java security jsf sql-injection code-injection
在我的项目中,我在表示层和持久层重复验证,希望提高安全性.所以我的问题是:标准JSF验证可以防止代码注入.
<h:inputText id="name" value="#{bean.customer.name}" required="true" requiredMessage="Validation Error: Value is required." title="Name" >
<f:validateLength maximum="40"/>
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
在这里,我验证字段是否为空,并验证字段长度.我知道验证字段长度会使代码注入变得更难,但有时你需要一个很长的字段长度,比如textArea
.如果这是脆弱的,我将如何解决它?非常感谢你提前.
Bal*_*usC 13
默认情况下,JSF通过转义用户控制的输入和组件来防止XSS 攻击.这可以通过设置属性来控制.你不必担心这个.UIInput
UIOutput
h:outputText
escape="false"
另一方面,防止SQL注入 攻击不是JSF的责任.您需要在持久层中处理此问题.例如JPA和/或Hibernate,当使用得很好时(即不在SQL /命名查询字符串中连接用户控制的输入),默认情况下也已经阻止了它.在普通的JDBC中,您需要确保使用PreparedStatement
而不是Statement
在SQL字符串中包含用户控制的输入.如果使用得当,您也无需担心JSF方面的问题.
注入攻击有一个共同的主题:由于应用程序中的各种缺陷,输入数据在某个时间点被转换并解释为代码.最常见的缺陷是未经正确编码或转义的未经过数据处理的数据.单独存在或不存在编码不能保护应用程序免受攻击 - 必须对允许将代码转换为数据的字符进行编码,以使它们不被区分为代码.
现在,从JSF的角度来看,设计人员已经深思熟虑地包含针对某些类型攻击的保护.由于它是一个表示层框架,因此存在防止XSS攻击(和CSRF攻击,尽管它与注入无关)的保护.在跨站点脚本和跨站点请求伪造的Seam框架页面中详细讨论了保护机制及其安全使用.Seam使用JSF,因此从XSS和CSRF保护JSF应用程序和Seam应用程序没有太大区别; 这些页面中的大多数建议都必须在JSF应用程序中保持良好状态.
但是,如果您需要保护自己免受其他突出的注入攻击,特别是SQL注入,您需要查看持久性框架提供的功能(假设您将使用它).如果您手动编写SQL查询并直接在代码中执行它们,请使用PreparedStatement对象来保护自己免受最常见的SQL注入攻击.如果你正在使用JPA,JDO等,你需要安全地使用这样的框架 - 大多数框架默认创建PreparedStatement对象,当查询被提供给它们时,通常不需要担心.
防止JPA中的SQL注入攻击
命名和本机查询将在内部转换为使用参数化查询的预准备语句.这是JPA提供商的责任.人们需要担心在交付给提供者之前构建的SQL查询.基本上,传递给EntityManager.createQuery()和EntityManager.createNativeQuery()的字符串不应具有连接的用户输入.
PS:CSRF保护功能存在于JSF 2中,而不存在于JSF 1.x中.它也仅出现在Seam的某些版本中(2.1.2以后).
归档时间: |
|
查看次数: |
8937 次 |
最近记录: |