保护 Oracle 数据库免受 SQL 注入的影响



我在Symfony上,我不知道如何保护我的数据库免受sql注入。如果你有什么想法,我将不胜感激。

我用sql的函数:

public function getResult($$value)
{
$sql = "SELECT SOMETHING FROM SOMETHING smt
WHERE smt.THING = '".$value."'";
return $this->egee->executeQuery($sql);
}

这是我的执行查询功能:

public function executeQuery($sql) {
$entityManager = $this->em->getConnection('xxx');
$stmt = $entityManager->prepare($sql);
$stmt->execute();
return $stmt->fetch();
}

我准备好尝试使用BindParam,但它不适用于Oracle。 使用BindParam,我有这样的回应:

错误 503:服务不可用 由于维护停机或容量问题,服务器暂时无法满足您的请求。请稍后重试。

这是你怎么做的...对于任何和每个数据库:参数化查询。

您的 SQL 字符串现在变为:

SELECT SOMETHING FROM SOMETHING smt WHERE smt.THING = ?

请注意?(不在引号中...这不是一个字符的文本字符串(这表示查询参数。

现在,每次执行查询时,您都会提供一个包含要替换的每个参数值的array(),顺序从左到右。 每次执行查询时都可以使用不同的值(无需重新准备(,因为这些值不是查询的"一部分":它们是输入。

无论参数值包含什么内容,数据库引擎都不会将其视为数字或字符串以外的任何内容。 它永远不会将其视为"SQL的一部分"。 因此,SQL注入变得不可能。

此外,[二进制] 值直接使用,而不是从字符串解码。 因此,如果您想使用引号作为字符串参数值的一部分,则不会使用反斜杠"编码"它们。 (如果您提供了",那么"反斜杠后跟引号"是 SQL 将看到的参数值......完全可接受的两个字符值。

这里有一篇不错的文章:https://www.w3schools.com/php/php_mysql_prepared_statements.asp

Symfony手册中的Doctrine ORM文档显示了使用查询参数的示例:

https://symfony.com/doc/current/doctrine.html#querying-with-sql

$sql = '
SELECT * FROM product p
WHERE p.price > :price
ORDER BY p.price ASC
';
$stmt = $conn->prepare($sql);
$stmt->execute(['price' => $price]);

您不需要使用 BindParam。只需将哈希数组传递给execute(),其中哈希键是您放入 SQL 查询中的命名查询参数占位符。

最新更新