我从数据库中提取了一些数据(在进入数据库的过程中,使用准备好的语句对这些数据进行了净化(。当使用这些数据时,我认为我必须使用htmlspecialchar((函数,但由于使用了包含特殊字符的密码,这破坏了代码,因为它显然将<
变成了一个html实体。
我的想法是正确的吗?如果代码在进入数据库时被清除,并且没有被物理输出到html页面,我就不必为下面的内容添加任何额外的安全性?
我最初将代码封装在htmlspecialchar((中的while
循环中,例如$db_id = htmlspecialchars($row['ID']);
,这就是我发现它破坏代码的原因。
if (isset($_POST['login'])) {
$email = $_POST['email'];
$stmt = $connection->prepare("SELECT * FROM users WHERE email = ? ");
$stmt->bind_param("s", $email );
$stmt->execute();
$result = $stmt->get_result();
// assign columns from the database to variables
while ($row = mysqli_fetch_array($result)) {
$db_id = $row['ID'];
$db_firstname = $row['firstname'];
$db_email = $row['email'];
$db_password = $row['password'];
}
$stmt->close();
$connection->close();
// code will go here that checks if the email and password match and then create a $_SESSION
}
您当前的代码是正确和安全的。你不需要其他任何东西。
没有所谓的输入净化准备好的语句不会净化数据。它们可以防止SQL注入,因为数据是与查询分开发送的。
htmlspecialchars()
可防止XSS。当您将数据输出到HTML中时,可以使用它。不要在输入时使用它,因为它会损坏您的数据。
切勿以任何方式修改密码。直接在输入上使用password_hash()
,并将其保存到数据库中。