我使用预准备语句将数据输入数据库,但我没有使用预准备语句来获取数据。原因是代码稍微小一些,从我读到的内容来看,它的速度要快一些。这有什么安全问题吗?
示例:
插入数据;
$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'");
这个方法和使用预处理语句获取数据一样安全吗?
答案 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%安全的。
额外的好处是,您通常可以重复使用预准备语句,只需交换变量,使代码运行得更快。