保护Oracle数据库防止SQL注入

问题描述 投票:-1回答:2

我正在使用Symfony,但我不知道如何保护数据库免受sql注入。如果您有任何想法,我将不胜感激。

我的SQL函数:

  public function getResult($$value)
    {
        $sql = "SELECT SOMETHING FROM SOMETHING smt
                WHERE smt.THING = '".$value."'";

        return $this->egee->executeQuery($sql);

    }

这是我的executeQuery函数:

   public function executeQuery($sql) {

        $entityManager = $this->em->getConnection('xxx');

        $stmt = $entityManager->prepare($sql);

        $stmt->execute();

       return $stmt->fetch();
    }

我已经尝试使用BindParam,但是它不适用于Oracle。对于BindParam,我有以下响应:

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

php sql oracle symfony4 sql-injection
2个回答
2
投票

这里是您对任何一个数据库的操作方式... 参数化查询。] >>

您的SQL字符串现在变为:

SELECT SOMETHING FROM SOMETHING smt WHERE smt.THING = ?

注意? (不带引号...这不是一个字符的文字字符串)

这表示查询参数。

现在,每次执行查询时,您将提供一个array(),其中包含要替换的每个参数值,从左到右。每次执行查询(无需重新准备)

时都可以使用不同的值,因为这些值不是查询的“一部分”:它们是inputs。

无论参数值包含什么,数据库引擎都不会将其视为数字或字符串value

以外的其他值。它永远不会将其视为“ SQL的一部分”。因此,SQL注入变得不可能。

此外,[binary]值直接使用,而不是从字符串中解码。因此,如果您想将引号用作字符串参数值的一部分,则将不会

用反斜杠“编码”它们。 (如果提供了\",则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查询中放置的命名查询参数占位符。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.