首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带预准备语句而不带绑定变量的SqlInjection?

带预准备语句而不带绑定变量的SqlInjection?
EN

Stack Overflow用户
提问于 2013-04-23 14:33:32
回答 3查看 1.8K关注 0票数 1

正如我们所知道的,避免sql注入的最好方法是使用带有绑定变量的预准备语句。但是我有疑问,如果我只使用准备好的语句而不使用绑定变量,比如下面客户id来自用户界面

代码语言:javascript
复制
String query ="select * from customer where customerId="+customerId;
PreparedStatement stmt = con.prepareStatement(query); //line1

即使我没有使用绑定变量,第1行也会注意限制sql注入吗?

我同意下面是最好的方法,但如果上面的方法也考虑到限制sql注入,那么我更喜欢上面的方法(因为这是一个遗留项目)。

代码语言:javascript
复制
String query ="select * from customer where customerId=?";
  PreparedStatement stmt = con.prepareStatement(query); 
  stmt.setInt(1, 100);

没有使用绑定变量的预准备语句是否足以确保不可能进行sql注入?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-23 14:50:31

人们必须区分几个问题。

使用预准备语句本身不会有任何帮助。

而且一般情况下,使用无准备的方式也没有坏处。

只有当你需要在查询中插入动态部分时,它才能工作。因此,在后一种情况下,这样的动态部分必须通过占位符进入查询,实际值必须在稍后绑定(占位符是?或表示查询中实际数据的任何其他标记)。

“预准备语句”这个术语的含义是使用占位符表示进入查询的动态数据。所以,

  • 如果查询中没有动态部分,那么显然根本不会有注入,即使没有使用准备好的statements.
  • if您正在使用一个准备好的语句,但是将值直接注入到查询中而不是绑定它们-这将是完全开放的注入。

所以,再说一次--只有在所有动态数据的预置语句中使用占位符才能起作用。它之所以有效,是因为:

inevitable.

  • prepared
  • 每个动态值都必须正确地进行格式化(或处理)inevitable.
  • prepared语句在查询执行前的唯一正确位置进行正确的格式化(或处理),因此,我们的安全不会依赖于像
    • 这样不可靠的来源某些“神奇”的特性,这些特性宁可破坏数据也不能保证数据的安全。
    • 是一个(或几个)程序员的善意,他们可以决定格式化(或不格式化)程序流中的某个地方的变量。这就是伟大importance.

的意义所在

  • 预准备语句会影响要进入查询的值,但不会影响源变量,该变量保持不变,并可在后续代码中使用(通过电子邮件发送或显示的on-screen).
  • prepared语句可以显著缩短应用程序代码,在幕后执行所有格式设置(*仅在驱动程序允许的情况下)。
票数 1
EN

Stack Overflow用户

发布于 2013-04-23 14:46:05

第1行不会检查开发人员是否想要删除表。如果您编写查询,则假定它是Ok的。

sql注入的目标是准备允许进行额外sql查询的值,而无需开发人员的意愿或知识。在属性中使用假值查询您的网站。示例:

代码语言:javascript
复制
        id = "'); DROP ALL TABLES; --";
        query = "select * from customer where customerId="+id;

PreparedStatement确保使用setInt/setString/etc添加到查询中的特殊符号(如‘或’)不会干扰sql查询。

票数 1
EN

Stack Overflow用户

发布于 2013-08-23 21:15:04

我知道这是一个更老的帖子,我只想补充一点,如果你能确保你的查询只允许整数进入你的查询行1,你就可以避免注入攻击。字符串输入是注入攻击发生的地方。在上面的示例中,不清楚'customerId‘是哪一类变量,尽管它看起来像一个整数。因为问题被标记为Java,所以不能使用int进行注入攻击,所以应该没问题。

如果它是第1行中的字符串,您需要确信'customerId‘来自一个安全的来源,并且它必须是一个整数。如果它来自post表单或其他用户生成的字段,那么您可以尝试对其进行转义或将其转换为整数以确保无误。如果它是一个字符串,将其转换为整数,您将不需要绑定参数。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16162526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档