保护 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 查询中输入的命名查询参数占位符。
我在使用 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 查询中输入的命名查询参数占位符。