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

时间:2017-01-27 01:22:25

标签: php mysqli

当用户首次在我的网站上创建帐户时,他们会输入用户名和密码,这些都是通过准备好的语句来阻止SQL注入。但是后来我会从数据库中获取用户名并在查询中使用它。这仍然让我受到攻击吗?我是否还需要为此查询使用预准备语句?我是否需要为数据库中的所有用户输入信息使用预准备语句,即使它在第一次输入时已经通过了准备好的语句?假设在首次输入时通过预准备语句输入的所有数据都是安全的,是否安全?

1 个答案:

答案 0 :(得分:0)

是的,您必须始终使用带参数绑定的预处理语句。

准备好的语句并不是治愈SQL注入的神奇方法。他们甚至没有阻止SQL注入。准备好的语句使您可以使用参数绑定。正是这种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都将保持不变。