代码之家  ›  专栏  ›  技术社区  ›  Niyaz

即使删除了'character'字符,是否有方法插入SQL?

  •  12
  • Niyaz  · 技术社区  · 16 年前

    如果从SQL查询中删除所有的字符,是否还有其他方法对数据库进行SQL注入攻击?

    怎么做?有人能给我举个例子吗?

    14 回复  |  直到 13 年前
        1
  •  23
  •   Johan    16 年前

    是的,有。摘录 Wikipedia

    "SELECT * FROM data WHERE id = " + a_variable + ";"

    从这句话中可以清楚地看出,作者打算将一个变量作为一个与“id”字段相关联的数字。但是,如果它实际上是一个字符串,那么最终用户可以根据自己的选择操作语句,从而绕过转义字符的需要。例如,将变量设置为

    1;DROP TABLE users

    将从数据库中删除“users”表,因为SQL将按如下方式呈现:

    SELECT * FROM DATA WHERE id=1;DROP TABLE users;

    SQL注入是 一次简单的战斗。如果我是你,我会做非常仔细的研究。

        2
  •  15
  •   Raithlin    16 年前

    是的,这取决于您使用的语句。最好使用存储过程或至少参数化查询来保护自己。

    WikiPedia 用于预防样品。

        3
  •  6
  •   Veynom    16 年前

    是的,这是绝对可能的。

    如果您有一个表单,希望在其中生成下一个select语句的整数,则可以输入类似的内容:

    从中选择* thingy 其中attributeID=

    • 5(回答好,没问题)
    • 5滴桌 users (坏,坏,坏…)

    以下网站详细介绍了经典的SQL注入技术: SQL Injection cheat sheet .

    使用参数化查询或存储过程并没有更好的效果。这些只是使用传递的参数预先进行的查询,这些参数也可以是注入源。本页还介绍了: Attacking Stored Procedures in SQL .

    现在,如果你抑制简单的引用,你只会阻止一组给定的攻击。但不是全部。

    一如既往,不要相信来自外部的数据。在这三个级别过滤它们:

    • 明显内容的接口级别(下拉选择列表比自由文本字段更好)
    • 用于与数据性质(int、string、length)、权限(此用户是否可以在此页上使用此类型的数据)相关的检查的逻辑级别…
    • 数据库访问级别(转义简单引号…)。

    玩得开心,别忘了检查 WikiPedia 答案。

    /VEY

        4
  •  6
  •   Community CDub    8 年前

    我建议您将变量作为参数传递,而不是构建自己的SQL。否则,所有的方法都有一种进行SQL注入的方式,这种方式我们目前还不知道。

    您创建的代码如下所示:

    ' Not Tested
    var sql = "SELECT * FROM data WHERE id = @id";
    var cmd = new SqlCommand(sql, myConnection);
    cmd.Parameters.AddWithValue("@id", request.getParameter("id"));
    

    如果你有一个像我这样的名字,里面有一个。删除所有'-字符或将其标记为无效字符是非常烦人的。

    你也可能想看看这个 Stackoverflow question about SQL Injections .

        5
  •  3
  •   Johnny Bravado    16 年前

    参数化内联SQL或参数化存储过程是保护您自己的最佳方法。正如其他人指出的,仅仅剥离/转义单引号字符是不够的。

    您将注意到,我专门讨论“参数化”存储过程。如果您恢复到将过程传递的参数连接在一起,那么仅仅使用存储过程也是不够的。换句话说,在存储过程中包装完全相同的易受攻击的SQL语句并不会使其更加安全。您需要像处理内联SQL那样在存储过程中使用参数。

        6
  •  2
  •   Joel Coehoorn    16 年前

    而且-即使你只是寻找撇号,你也不想删除它。你想 逃跑 它。你可以用两个撇号来替换每一个撇号。

    但是参数化查询/存储过程要好得多。

        7
  •  2
  •   AviD    16 年前

    由于这是一个相对较老的问题,我不会费心写一个完整而全面的答案,因为答案的大部分方面都被一个或另一个海报提到过。
    不过,我觉得有必要提出另一个没有被任何人提及的问题——SQL走私。在某些情况下,可以将引号字符“走私”到查询中 即使你试图移除它 . 事实上,即使您使用了正确的命令、参数、存储过程等,这也是可能的。

    查看完整的研究论文 http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdf (透露,我是这方面的主要研究人员)或者只是谷歌的“SQL走私”。

        8
  •  2
  •   AndersTornkvist    13 年前

    . …呃,大约5000万种其他方式

    也许有点像 5; drop table employees; --

    产生的SQL可能类似于: select * from somewhere where number = 5; drop table employees; -- and sadfsf

    ( -- 开始评论)

        9
  •  1
  •   mdb    16 年前

    是的,绝对如此:根据您的SQL方言等,有许多方法可以实现不使用撇号的注入。

    针对SQL注入攻击的唯一可靠防御是使用数据库接口提供的参数化SQL语句支持。

        10
  •  1
  •   CJM    16 年前

    相反,我会坚持使用参数化查询,并完全消除这个问题。

        11
  •  0
  •   Leigh Caldwell    16 年前

    这取决于您如何组合查询,但本质上是的。

    例如,在Java中,如果你要这样做(故意的惊人例子):

     String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");
    

    然后你很有可能会接受注射攻击。

    Java有一些有用的工具来保护这些,例如PraveReDealScript(在哪里传递一个字符串,比如“从客户那里选择NAMEGID,ID=?”JDBC层在替换时处理转义?但是其他一些语言对此没有太大帮助。

        12
  •  0
  •   hollystyles    16 年前

    事情是撇号可能是真正的输入,当您在代码中使用内联SQL时,必须通过将它们加倍来避免它们。你要找的是一个regex模式,比如:

    \;.*--\
    

    用于过早结束正版语句的分号,一些插入的SQL后跟双连字符以注释原始正版语句中的尾随SQL。在攻击中可以省略连字符。

    因此,答案是:不,简单地删除撇号并不能保证SQL注入的安全性。

        13
  •  0
  •   Ken Ray    16 年前

    我只能重复别人说过的话。参数化SQL是一种可行的方法。当然,编写代码有点麻烦,但是一旦你完成了一次,就不难剪切和粘贴代码,并进行必要的修改。我们有许多.NET应用程序允许网站访问者指定一系列搜索条件,并且代码会动态地构建SQL Select语句-但是用户可以输入的所有内容都会进入一个参数。

        14
  •  0
  •   sal    16 年前

    当您期望一个数字参数时,您应该始终验证输入以确保它是数字的。除了有助于防止注入,验证步骤将使应用程序更加用户友好。

    如果您在预期id=1044时收到id=“hello”,最好向用户返回一个有用的错误,而不是让数据库返回一个错误。