为数据库中的数据准备的语句

问题描述 投票:1回答:1

[当用户首次在我的网站上建立帐户时,他们输入用户名和密码,这两者都通过准备好的语句进行放置,以防止SQL注入。但是稍后,我将从数据库中获取用户名,并在查询中使用该用户名。这仍然让我容易受到攻击吗?我是否还需要为此查询使用准备好的语句?我是否需要对数据库中所有用户输入的信息都使用预处理语句,即使该信息在初次输入时已经通过了预处理语句?可以安全地假设首次输入时通过准备好的语句存储的所有数据都是安全的吗?

php security mysqli sql-injection
1个回答
0
投票

是,您必须始终将预准备语句与参数绑定一​​起使用。

准备好的语句并不是治愈SQL注入的神奇方法。他们甚至没有阻止SQL注入。准备好的语句使您可以使用parameter binding。正是这种SQL和数据的分离保护了您免受SQL注入的侵害。

不安全的准备好的陈述:

$id = $_GET['id'];
$stmt = $mysqli->prepare("SELECT * FROM park WHERE id=$id");
$stmt->execute();

由于仍在直接将变量注入SQL,因此容易受到SQL注入的攻击。这些变量的内容来自哪里都无所谓。事实上,您在SQL中使用未知值使它容易受到攻击。

安全的准备好的声明:

$id = $_GET['id'];
$stmt = $mysqli->prepare('SELECT * FROM park WHERE id=?');
$stmt->bind_param('s', $id);
$stmt->execute();

您可以看到,我使用了一个占位符,然后使用了一个名为bind_param()的方法。这种方式将变量与SQL分开,并且SQL永远不会改变。无论在$id中传递什么值,SQL都将保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.