正如我们所知道的,避免sql注入的最好方法是使用带有绑定变量的预准备语句。但是我有疑问,如果我只使用准备好的语句而不使用绑定变量,比如下面客户id来自用户界面
String query ="select * from customer where customerId="+customerId;
PreparedStatement stmt = con.prepareStatement(query); //line1即使我没有使用绑定变量,第1行也会注意限制sql注入吗?
我同意下面是最好的方法,但如果上面的方法也考虑到限制sql注入,那么我更喜欢上面的方法(因为这是一个遗留项目)。
String query ="select * from customer where customerId=?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setInt(1, 100);没有使用绑定变量的预准备语句是否足以确保不可能进行sql注入?
发布于 2013-04-23 14:50:31
人们必须区分几个问题。
使用预准备语句本身不会有任何帮助。
而且一般情况下,使用无准备的方式也没有坏处。
只有当你需要在查询中插入动态部分时,它才能工作。因此,在后一种情况下,这样的动态部分必须通过占位符进入查询,实际值必须在稍后绑定(占位符是?或表示查询中实际数据的任何其他标记)。
“预准备语句”这个术语的含义是使用占位符表示进入查询的动态数据。所以,
所以,再说一次--只有在所有动态数据的预置语句中使用占位符才能起作用。它之所以有效,是因为:
inevitable.
的意义所在
发布于 2013-04-23 14:46:05
第1行不会检查开发人员是否想要删除表。如果您编写查询,则假定它是Ok的。
sql注入的目标是准备允许进行额外sql查询的值,而无需开发人员的意愿或知识。在属性中使用假值查询您的网站。示例:
id = "'); DROP ALL TABLES; --";
query = "select * from customer where customerId="+id;PreparedStatement确保使用setInt/setString/etc添加到查询中的特殊符号(如‘或’)不会干扰sql查询。
发布于 2013-08-23 21:15:04
我知道这是一个更老的帖子,我只想补充一点,如果你能确保你的查询只允许整数进入你的查询行1,你就可以避免注入攻击。字符串输入是注入攻击发生的地方。在上面的示例中,不清楚'customerId‘是哪一类变量,尽管它看起来像一个整数。因为问题被标记为Java,所以不能使用int进行注入攻击,所以应该没问题。
如果它是第1行中的字符串,您需要确信'customerId‘来自一个安全的来源,并且它必须是一个整数。如果它来自post表单或其他用户生成的字段,那么您可以尝试对其进行转义或将其转换为整数以确保无误。如果它是一个字符串,将其转换为整数,您将不需要绑定参数。
https://stackoverflow.com/questions/16162526
复制相似问题