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

我的代码对SQL注入有多脆弱?

  •  4
  • tkotitan  · 技术社区  · 15 年前

    好吧,我不希望这是一个黑客建议问题,所以请不要投反对票。我在一家网络商店工作,我发现我们的一些旧PHP页面在用户名中容易受到SQL注入的攻击,并且想知道有多糟糕。

    我们使用一个php字符串将来自日志的用户输入嵌入到登录表单中。

    $uname = $_POST['username'];
    $pass  = md5($_POST['pass']);
    $sql = "SELECT * FROM users WHERE username='$uname' AND password='$pass' AND userlevel='user'";
    ...
    

    然后我运行查询。

    现在,我不是SQL专家,我只是使用我可以在phpmyadmin上拼凑的东西。但是我可以不用用户名登录,而是使用:

    ' OR 1 '
    

    我知道要避开用户输入,我使用 mysql_real_escape_string .

    我的问题是,这段代码有多脆弱,有人能登录到这个页面而不需要密码吗?我想他们可能不需要用户名,但只能强行输入密码。但我不是SQL专家,我想知道是否可以对我们使用一些技巧。

    我们使用MySQL。

    我不需要任何关于输入验证的讲座,我知道这有多糟糕。我们应该做很多事情,比如页面上的超时和锁定,这样就不会被野蛮的强迫。

    5 回复  |  直到 10 年前
        1
  •  10
  •   chaos    15 年前

    “有人能登录这个页面而不需要密码吗”:是的,无关紧要。尝试用户名 yourfavoriteadmin' OR 1; -- .

    May as well link this, since certainly somebody will...

        2
  •  9
  •   Bombe    15 年前

    它非常脆弱。如果你知道像 mysql_real_escape_string 你为什么浪费时间问这个问题?你应该仔细阅读这段代码,修正它。你知道,就像, 全国妇女组织 .

        3
  •  2
  •   Brando    15 年前

    编写的代码在技术上完全没有漏洞。您的SQL查询包含变量$username,但您从不初始化它或将其设置为任何内容。这是一个bug,从MySQL中永远不会得到有效的结果。

    但是,一旦修复了这个bug,就应该使用mysql_real_escape_string()来转义变量。

    http://us.php.net/manual/en/function.mysql-real-escape-string.php

        4
  •  0
  •   mere-teresa    15 年前

    在任何SQL查询中使用之前都要清理数据,如果使用php>=5.2,则 the Filter functions .

    简单问题:为什么不更改pass='blabl'和username='bla'的顺序? 你有这个领域的索引吗?

    另一个问题:这条线有什么意义

    $uname = $_POST['username'];
    

    添加一个变量,只是为了在串联中引用/双引用效果?不过滤也不转义数据?

        5
  •  0
  •   Jim    11 年前

    尝试$\u post['username']的位置:

    no one'; delete from users --