0

我只是不明白。在获取数据方面,准备好的语句比未准备好的语句更安全。我不是在谈论写入数据库,只是在获取数据。我看不出 userFname 和 userLname 比 userEmail 和 userPassword 更安全。提前致谢。

$stmt = $mysqli->stmt_init();
    if ($stmt->prepare("SELECT userFname, userLname FROM users WHERE userEmail = ? and userPassword = ?")) {
        $stmt->bind_param("ss", $userEmail, $userPassword);
        $stmt->execute();
        $stmt->bind_result($userFname, $userLname);
        while ($stmt->fetch()) {
            //Remember first name, last name, and email
            $_SESSION['Email']=$userEmail;
            $_SESSION['Fname']=$userFname;
            $_SESSION['Lname']=$userLname;
            $stmt->close();
            //go to dashboard page
            header ("location: dashboard.php");    
        }
        $error2="Email and Password do not match, please try again."; 
    }
4

2 回答 2

0

我是 MySQL 的培训讲师。我正在向一组与会者讲述 SQL 注入的风险,其中一个人说,“告诉我”。

他递给我他的笔记本电脑,它的浏览器打开了他网站的登录屏幕(实际上它只是一个 QA 实例)。

由于对他的代码或数据库一无所知,我做出了一个有根据的猜测,他有一个像你这样的 SQL 查询,他没有使用查询参数,并且他没有正确地转义输入。我输入了一个用于登录的字符串,包括右引号和一些布尔表达式,然后我输入了随机击键作为密码。

他的应用程序验证了我的虚假登录,我就进去了。

我认为向您确切展示我是如何做到的并不合适,但这不是火箭科学——您只需要了解布尔代数的最低限度。

但关键是 SELECT 查询的 SQL 注入可以允许非法操作,就像修改数据的语句的 SQL 注入一样。


重新评论您对不良信息的评论:

查询参数确实不能被欺骗,也没有必要使用转义函数。

但是查询参数仅在您通常使用单个字符串、日期或数字文字的地方起作用。查询参数不能用于动态表名、列名、值列表、SQL 关键字、表达式等。对于这些,您仍然需要在调用 prepare()之前将应用程序变量插入到 SQL 查询中,就像老派一样,不安全的编程。因此,您仍然需要小心避免 SQL 注入漏洞。最好的方法是在将内容包含在 SQL 查询中之前将其列入白名单。

有关更多信息,请参阅我的演示SQL 注入神话和谬误,或我演示它的网络研讨会(免费,但需要注册)。我还在我的书《SQL 反模式:避免数据库编程的陷阱》的一章中写过关于 SQL 注入的内容。

于 2013-10-02T02:53:43.207 回答
0

SQL注入领域有一座巨大的巴比伦塔。

每个人都在使用十几个词,几乎不理解它们的意思,而且——更糟糕的是——对意思有自己的想法。

示例: 99% 的 PHP 用户会告诉您数据必须“转义”。虽然技术上的逃避是一种非常特殊的行为,但在一种情况下不足以保护,而在另一种情况下则无用且有害。

“清理”、“过滤”、“转义”、“准备好的语句”等列表中的每个其他单词也是如此。

因此,形象地说,每一次谈话都变成了盲人和聋人之间的争论。

所谓的东西也完全一样"input input"。这是另一个造成许多混乱和 - 更糟糕的是 - 漏洞的来源。然而,就其最明显的含义而言,它与 SQL 注入完全无关

因此,阅读来自各个站点的建议时请记住,您必须理解术语,并且——不仅如此——理解作者的意思。

回到你的问题,答案很简单:

  1. 准备好的语句必须用于动态进入查询的所有内容。
  2. 对于无法使用准备好的语句的情况,必须使用白名单代替。

这些规则很容易记住。所以 -不要在其中添加任何复杂性!不要用诸如“这些数据来自哪里?”之类的问题来困扰自己。“它在什么查询中进行?” - 它们没有用并且容易出错。

遵循这些规则并不容易,但这是另一个话题。

于 2013-10-02T14:23:05.297 回答