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

SQL注入级联与参数

  •  4
  • Baahubali  · 技术社区  · 8 年前

    "SELECT * from tblBlah where userId" +userId

    但这个问题不是“

    "SELECT * from tblBlah where userId = @userId";

    2 回复  |  直到 8 年前
        1
  •  7
  •   Tim Biegeleisen    8 年前

    在第一个查询的情况下,有人可以将以下值传递给 userId :

     = 3; DELETE FROM tblBlah;
    

    SELECT * from tblBlah where userId= 3; DELETE FROM tblBlah;
    

    当然,这对您的数据库来说是灾难性的。

    我认为在第二个查询的情况下,数据库将在内部将其编译为单个查询 SELECT 陈述参数值将插入占位符所在的位置,但仅作为数据。即使我们尝试了以下任务:

    @userId = '= 3; DELETE FROM tblBlah;';
    

    我们将以以下查询结束:

    SELECT * from tblBlah where userId = '= 3; DELETE FROM tblBlah;';
    

    换句话说,我们试图注入代码,但我们真正能做的就是注入一个字符串 参数 . 这可能会引发错误的查询,但不允许恶意用户调用 DELETE

    这是一个简单的例子,展示了准备好的语句的威力。对于准备好的语句,在查询实际运行之前,已经编译了查询的常规模板或结构。语句的某些部分具有参数占位符,但这些占位符不会通过串联来改变查询,而只能通过分配定位值来改变查询。

        2
  •  1
  •   Troyer    8 年前

    第一次查询时,数据库不知道它是否有更多的条件,或者查询的确切目的是什么,然后数据库会盲目地信任查询。

    我现在用例子来解释。

    如果您喜欢:

    SELECT * FROM table WHERE User=' + User + ' AND Pwd=' + Pass
    

    有人可以轻松地在那里注入SQL,只需向用户填充 '' AND 1=1-- -- 将注释掉查询的第二部分,条件为true,然后打印表数据。

    SELECT * FROM table WHERE User='' AND 1=1-- AND Pwd=' + Pass
    

    现在,让我们使用参数进行操作:

    SELECT * FROM custTable WHERE User= @user AND Pass=@password
    
    //Someone filled the userfield with SQL injection:
    @user = "'' AND 1=1--"
    @password = ""
    

    SELECT * FROM custTable WHERE User= '' AND 1=1-- AND Pass=@password
    

    查询看起来相同,但工作方式不同,数据库将处理查询,获得@username参数和一个空白密码,然后它将显示为false。

    我想补充一点,这取决于您如何使用SQL参数以及您使用哪种语言编程,这或多或少是安全的,但最安全的方法之一是使用带有参数化查询的存储过程。