java sql注入防止_java - PreparedStatement如何避免或阻止SQL注入?

要了解PreparedStatement如何阻止SQL注入,我们需要了解SQL Query执行的各个阶段。

1.编译阶段。2.执行阶段。

每当SQL Server引擎收到一个查询时,它必须通过以下阶段,

wiRZS.png

解析和规范化阶段:在此阶段,将检查Query的语法和语义。 它检查是否引用表和查询中使用的列是否存在。它还有许多其他任务要做,但我们不详细说明。

编译阶段:在此阶段,查询中使用的关键字如select,from,where等将转换为格式机器可以理解。这是解释查询并确定要采取的相应动作的阶段。它还有许多其他任务要做,但我们不详细说明。

查询优化计划:  在此阶段,创建决策树以查找可以执行查询的方式。  它找出了执行查询的方式的数量以及与每种方式相关的成本  执行Query。  它选择执行查询的最佳计划。

缓存:在查询优化计划中选择的最佳计划存储在缓存中,以便随后进行时间相同的查询进来,它不必再次通过阶段1,阶段2和阶段3。当下次查询进入时,它将直接在Cache中检查并从那里获取执行。

执行阶段:在此阶段,将执行提供的查询,并将数据作为ResultSet对象返回给用户。

PreparedStatement API在上述步骤中的行为

PreparedStatements不是完整的SQL查询并包含占位符,在运行时由实际用户提供的数据替换。

每当包含占位符的任何PreparedStatment传入SQL Server引擎时,它通过以下阶段

解析和归一化阶段

编译阶段

查询优化计划

缓存(带有占位符的编译查询存储在缓存中。)

UPDATE用户设置用户名=? 和密码=? WHERE id =?

上面的查询将被解析,编译与占位符作为特殊处理,优化和得到缓存。此阶段的查询已经编译并以机器可理解的格式转换。所以我们可以说存储在缓存中的Query是预编译的只有占位符需要替换为用户提供的数据。

现在,在用户提供的数据进入运行时,从Cache中选取预编译查询,并使用用户提供的数据替换占位符。

kWnd1.png

(请记住,在使用者数据替换占位符后,最终查询不会再次编译/解释,SQL Server引擎将用户数据视为纯数据,而不是需要再次解析或编译的SQL; 这就是PreparedStatement的美丽。)

如果查询不必再次经历编译阶段,那么无论什么数据都替换了占位符被视为纯数据,对SQL Server引擎及其直接没有意义执行查询。

注意:解析阶段之后是编译阶段,它理解/解释查询结构,并给它有意义的行为。 在PreparedStatement的情况下,查询是只编译一次,缓存的编译查询一直被取回用户数据并执行。

由于PreparedStatement的一次编译功能,它没有SQL注入攻击。

您可以通过示例获得详细说明:[http://javabypatel.blogspot.in/2015/09/how-prepared-statement-in-java-prevents-sql-injection.html]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值