我在Java中使用ESPAI进行SQLInjection预防。
我只使用ESAPI.encoder().encodeForSQL(ORACLE_CODEC,queryparam))
方法。
如果我在validation.properties
中未包含esapi.properties
,我会IllegaleStateException
。
请告诉我为什么encodeForSQL()需要validation.properties。
答案 0 :(得分:2)
我实际上更担心您使用ESAPI来停止SQL注入。通常,这是通过将有问题的SQL查询重写为参数化版本来实现的,例如使用PreparedStatement
或使用PreparedStatement
的JPA实现。我只是想让您注意,使用ESAPI对SQL进行编码只具有临时补救的设计意图,因为特定查询过于复杂而无法在事件响应情况下重写。如果您使用encodeForSQL()
,请注意它是一个创可贴解决方案,用于解决编写得不好的SQL查询的永久性问题。 应该期望查询将被重写,对esapi的需求将消失。
这是因为您从ESAPI获得的性能不会比正确编写的PreparedStatement
更好。
ESAPI需要两个文件才能正常运行。 ESAPI.properties
和validation.properties
。这些文件是必需的,因为为了加载大多数类,他们需要从这些文件中读取选项和设置。您没有提供堆栈跟踪,因此无法诊断确切的问题,但如果您提供这些文件,问题就会消失。
答案 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 );