0

我正在使用准备好的语句将数据输入数据库,但我没有使用准备好的语句来获取数据。原因是代码有点小,而且从我读到的内容来看,它有点快。这有什么安全问题吗?

例子:

插入数据;

$stmt = mysqli_prepare($con, "INSERT USERS (userFname) ( VALUES (?)");
mysqli_stmt_bind_param($stmt, 's', $userFname); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt);

获取数据;

$query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$userEmail'");

这种方法与使用准备好的语句获取数据一样安全吗?

4

1 回答 1

0

在您的示例中,假设有一个表单登录

<input type="email" name="email"><button type="submit">login</button>

你的 php 脚本运行:

<?php
$email = $_POST['email'];
$query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$email'");

所以,这是一个攻击媒介,有人可以用你的数据库做“有趣的事情”。

现在,如果您的脚本从不与用户输入联系,并且它仅通过从记录中获取电子邮件来循环运行,然后获取您可能认为自己安全的相应用户。
但是你那里的那个来源有多安全?

你有一张桌子newsletter_signups

id| email                                      | registered
1 | billy_joe@outlook.com                      | 2017-04-02
2 | johnny@tables.com');Drop table `users`;--  | 2017-05-01

然后你开始循环遍历它。

foreach($newsletter_records as $record) {
    $email = $record['email'];
    $query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$email'");
    ... etc...
}

你可以想象那会造成的痛苦。

简而言之。您永远不能相信数据是安全的。
对数据保持偏执,并始终使用准备好的陈述。这应该是您的默认方式。即使它是 100% 安全的。
额外的好处是,您通常可以重用准备好的语句并交换变量,从而使您的代码运行得更快。

于 2018-02-14T16:25:07.563 回答