获取mysqli数据和安全性

时间:2013-09-21 17:24:11

标签: mysqli

我使用预准备语句将数据输入数据库,但我没有使用预准备语句来获取数据。原因是代码稍微小一些,从我读到的内容来看,它的速度要快一些。这有什么安全问题吗?

示例:

插入数据;

$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'");

这个方法和使用预处理语句获取数据一样安全吗?

1 个答案:

答案 0 :(得分: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%安全的。
额外的好处是,您通常可以重复使用预准备语句,只需交换变量,使代码运行得更快。