我想知道这样的事情有什么问题(PHP)
这个想法。
很久以前就被证明是有缺陷的。
首先,这段代码确实改变了数据。这是抽象思考的好方法,但它会使您的应用程序在现实生活中崩溃。事实上,这是不可接受的行为。但是,您可以转义引号而不是替换它们。
其次,您(像大多数 PHP 人一样)误以为替换某些字符可以使您的数据安全。虽然不是。每个关心在注入保护领域重新发明轮子的 PHP 用户总是假设只有字符串被添加到查询中。他们从来没有明确地意识到这一点,也没有想象 SQL 查询中存在任何其他部分。虽然这样的替换对于任何其他 SQL 文字来说都像鸡一样无害。你的函数的名字就是我的话的确切证明。
说,你有这样的代码
$limit = formatsql($_POST["limit"]);
$query = "SELECT id FROM utenti LIMIT $limit";
这将欢迎任何脚本小子与您的数据库一起玩。
此外,您的推理中有一个术语“用户输入”,这是二阶注入的确定标志。
更进一步,让我们观察两种应用程序:某种愚蠢的主页脚本和相对较大的 Web 应用程序。尽管您的代码对于前者来说是完全正确的,但在后者中规则会发生变化。有时我们可以有这两个部分的代码
$username = formatsql($_POST["username"]);
$password = formatsql($_POST["password"]);
和
$query = "SELECT id FROM utenti WHERE user='$username' AND password='$password'";
彼此戏剧性地分开。在这里,我们可能会陷入很多麻烦,例如双重转义,错误转义,根本不转义。
这就是为什么手动转义在很久以前就被认为是不好的做法的原因。
相反,必须使用准备好的语句,因为它们保证
- 应用完整的格式而不是愚蠢的“转义”或“替换”
- 对不同的数据类型应用不同的格式。
- 格式应用在它必须的地方 ——不是迟早的事。
- 无条件地应用适当的格式,独立于开发人员的意愿或空气。
这就是为什么很久以前准备好的语句就被认为是唯一正确的方法了。