Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过替换单引号防止SQL注入_Php_Sql Injection - Fatal编程技术网

Php 通过替换单引号防止SQL注入

Php 通过替换单引号防止SQL注入,php,sql-injection,Php,Sql Injection,我已经读到,替换用户输入对于SQL注入是不安全的。 我想知道(可能有一个例子)这样的东西有什么不对(PHP): 我想知道这样的东西有什么不对(PHP) 这个主意 它在很久以前就被证明是有缺陷的 首先,这段代码确实会改变数据。这是进行抽象思考的好方法,但它会使您的应用程序在现实生活中崩溃。事实上,这是不可接受的行为。但是,您可以逃避引用,而不是替换它们 第二,您(和大多数PHP人员一样)误以为替换某些字符会使数据安全。而事实并非如此。每一个想要在注入保护领域重新发明轮子的PHP用户总是假设只有字符

我已经读到,替换用户输入对于SQL注入是不安全的。 我想知道(可能有一个例子)这样的东西有什么不对(PHP):

我想知道这样的东西有什么不对(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"]);

戏剧性地彼此分离。在这里,我们可能会陷入很多麻烦,比如双重逃避、错误逃避、根本无法逃避

这就是为什么很久以前手动逃生被认为是不良做法的原因

相反,必须使用事先准备好的声明,因为它们保证

  • 完成应用格式而不是愚蠢的“转义”或“替换”
  • 不同的格式应用于不同的数据类型
  • 应用的格式设置正确到位它必须在哪里-不早不晚
  • 无条件地应用正确的格式,独立于开发者的意愿或意愿

这就是为什么准备语句早就被认为是唯一正确的方法。

您可能想再转义几个字符,请参阅。还有一个有趣的问题,一个关于如何规避类似问题的实际例子,这确实是一个很好的例子。但是:我希望您不要以此为借口,不使用现有的基础设施来处理此问题,即现有的转义函数或更好的参数化查询。您应该使用数据库使用的任何转义机制,这将考虑字符集和特殊字符。不过,你真的应该使用PDO和预先准备好的语句。不要自己逃逸。你只是在重新创造(不完全地)其他人已经编写、测试和调试过的代码。穿上你真正的程序员裤子,使用参数化查询。告诉你怎么做。
$username = formatsql($_POST["username"]);
$password = formatsql($_POST["password"]);
$query = "SELECT id FROM utenti WHERE user='$username' AND password='$password'";