ESAPI中ESAPI.encoder()。encodeForSQL的validation.properties的用途是什么?

时间:2016-02-06 18:14:05

标签: java esapi

我在Java中使用ESPAI进行SQLInjection预防。 我只使用ESAPI.encoder().encodeForSQL(ORACLE_CODEC,queryparam))方法。

如果我在validation.properties中未包含esapi.properties,我会IllegaleStateException

请告诉我为什么encodeForSQL()需要validation.properties。

2 个答案:

答案 0 :(得分:2)

我实际上更担心您使用ESAPI来停止SQL注入。通常,这是通过将有问题的SQL查询重写为参数化版本来实现的,例如使用PreparedStatement或使用PreparedStatement的JPA实现。我只是想让您注意,使用ESAPI对SQL进行编码只具有临时补救的设计意图,因为特定查询过于复杂而无法在事件响应情况下重写。如果您使用encodeForSQL() ,请注意它是一个创可贴解决方案,用于解决编写得不好的SQL查询的永久性问题。 应该期望查询将被重写,对esapi的需求将消失。

这是因为您从ESAPI获得的性能不会比正确编写的PreparedStatement更好。

ESAPI需要两个文件才能正常运行。 ESAPI.propertiesvalidation.properties。这些文件是必需的,因为为了加载大多数类,他们需要从这些文件中读取选项和设置。您没有提供堆栈跟踪,因此无法诊断确切的问题,但如果您提供这些文件,问题就会消失。

ESAPI.properties validation.propeties

答案 1 :(得分:1)

ESAPI验证程序对输入执行了许多安全检查,例如canonicalisation和白名单验证。请注意,所有这些验证规则都是在 canonicalisation之后应用的。 不允许使用双编码字符(即使涉及不同的编码)。 使用:

首先在下面设置一个模式。您可以选择任何您想要的名称,以

为前缀
Validation.Email=^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$

然后你可以在你的代码中验证这样的模式:

Validator.getInstance().getValidDataFromBrowser( "Email", input );
Validator.getInstance().isValidDataFromBrowser( "Email", input );