保护 Oracle 数据库免受 SQL 注入

Protect Oracle database against SQL Injection

我在使用 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:服务不可用 由于维护停机或容量问题,服务器暂时无法为您的请求提供服务。请稍后再试。

以下是您的操作方法...使用任何和每个数据库:参数化查询。

您的 SQL 字符串现在变为:

SELECT SOMETHING FROM SOMETHING smt WHERE smt.THING = ?

注意 ? (不在引号中...这不是单字符文字字符串) 这表示查询参数。

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

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

另外,[binary]值是直接使用的,而不是从字符串中解码出来的。所以,比如说,如果你想使用引号作为你的字符串参数值的一部分,你 不会 "encode" 它们带有反斜杠。 (如果您提供了 \",那么 "a backslash followed by a quote mark" 就是 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 查询中输入的命名查询参数占位符。