Php 这段代码在SQL注入中如何容易受到攻击?

Php 这段代码在SQL注入中如何容易受到攻击?,php,sql-injection,Php,Sql Injection,我正在审核以下代码: function getNormalizedLocationPath($path) { $path = is_scalar($path) ? strtolower(trim($path)) : ''; $path = preg_replace('/[^a-z0-9.]/', '', $path); return $path; } $path=getNormalizedLocationPath($_GET['path']); $sql= "INSER

我正在审核以下代码:

function getNormalizedLocationPath($path)
{
  $path = is_scalar($path) ? strtolower(trim($path)) : '';
  $path = preg_replace('/[^a-z0-9.]/', '', $path);

  return $path;
}

$path=getNormalizedLocationPath($_GET['path']);
$sql= "INSERT INTO paths VALUES (${path})";

$pdo = new PDO();
$pdo->query($sql);

正如您所看到的,这显然是一段易受SQL注入攻击的代码,但我很难证明这一点。如何证明此代码易受我的主管攻击?

老实说,此代码可能是安全的

我没怎么想过,想想什么边缘案例会让它变得不安全。比如,如果您使用的是旧版本的PHP,其中preg_replace不理解unicode序列或其他东西。这可以让人们绕过正则表达式过滤器,用unicode编码引号字符。我不知道

不值得再仔细考虑的原因是,还有另一种解决方案更易于编码,而且肯定是安全的:

$sql= "INSERT INTO paths VALUES (?)";

$pdo = new PDO();
$stmt = $pdo->prepare($sql);
$stmt->execute( [ $_GET['path'] ] );
通过使用这样的查询参数,$path的值将与查询分开,直到它准备好。因此,该值无法引入错误的引号字符或任何其他可能影响SQL语句语法的内容

因此,您根本不需要清理功能。*您可以删除一些代码,这些代码总是使项目更易于维护

你甚至不必问这个问题,寻求专家帮助来确定消毒是否完全安全


*至少不是为了防止SQL注入。为了应用程序功能,您可能需要更改该值,但无论对该值应用什么更改,如果使用查询参数,您都不必担心SQL注入漏洞。

因为“清理”功能只留下字符a-z、0-9和点,我不知道这里怎么会有这么大的破坏。“扩展”SQL语法超出预期范围,通常需要使用引号或大括号,或者至少在某处使用空格…由于在值周围不使用引号,因此此查询当然只适用于开始时的数值,除值关键字(如null mabye)之外的任何其他内容都会导致语法错误。