Symfony手册中有关Doctrine ORM的文档显示了使用查询参数的示例:
我正在使用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()
,其中包含要替换的每个参数值,从左到右。每次执行查询(无需重新准备)
无论参数值包含什么,数据库引擎都不会将其视为数字或字符串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查询中放置的命名查询参数占位符。
Symfony手册中有关Doctrine ORM的文档显示了使用查询参数的示例: