php.doctrine.security.audit.doctrine-orm-dangerous-query.doctrine-orm-dangerous-query

Author
unknown
Download Count*
License
$QUERY
Detected string concatenation with a non-literal variable in a Doctrine QueryBuilder method. This could lead to SQL injection if the variable is user-controlled and not properly sanitized. In order to prevent SQL injection, use parameterized queries or prepared statements instead.
Run Locally
Run in CI
Defintion
rules:
- id: doctrine-orm-dangerous-query
languages:
- php
message: "`$QUERY` Detected string concatenation with a non-literal variable in
a Doctrine QueryBuilder method. This could lead to SQL injection if the
variable is user-controlled and not properly sanitized. In order to
prevent SQL injection, use parameterized queries or prepared statements
instead."
metadata:
category: security
cwe:
- "CWE-89: Improper Neutralization of Special Elements used in an SQL
Command ('SQL Injection')"
license: Commons Clause License Condition v1.0[LGPL-2.1-only]
owasp:
- A01:2017 - Injection
- A03:2021 - Injection
references:
- https://www.doctrine-project.org/projects/doctrine-dbal/en/current/reference/query-builder.html#security-safely-preventing-sql-injection
- https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
technology:
- doctrine
cwe2022-top25: true
cwe2021-top25: true
subcategory:
- vuln
likelihood: MEDIUM
impact: MEDIUM
confidence: MEDIUM
mode: taint
pattern-sinks:
- patterns:
- pattern: $SINK
- pattern-either:
- pattern-inside: $QUERY->add(...,$SINK,...)
- pattern-inside: $QUERY->select(...,$SINK,...)
- pattern-inside: $QUERY->addSelect(...,$SINK,...)
- pattern-inside: $QUERY->delete(...,$SINK,...)
- pattern-inside: $QUERY->update(...,$SINK,...)
- pattern-inside: $QUERY->insert(...,$SINK,...)
- pattern-inside: $QUERY->from(...,$SINK,...)
- pattern-inside: $QUERY->join(...,$SINK,...)
- pattern-inside: $QUERY->innerJoin(...,$SINK,...)
- pattern-inside: $QUERY->leftJoin(...,$SINK,...)
- pattern-inside: $QUERY->rightJoin(...,$SINK,...)
- pattern-inside: $QUERY->where(...,$SINK,...)
- pattern-inside: $QUERY->andWhere(...,$SINK,...)
- pattern-inside: $QUERY->orWhere(...,$SINK,...)
- pattern-inside: $QUERY->groupBy(...,$SINK,...)
- pattern-inside: $QUERY->addGroupBy(...,$SINK,...)
- pattern-inside: $QUERY->having(...,$SINK,...)
- pattern-inside: $QUERY->andHaving(...,$SINK,...)
- pattern-inside: $QUERY->orHaving(...,$SINK,...)
- pattern-inside: $QUERY->orderBy(...,$SINK,...)
- pattern-inside: $QUERY->addOrderBy(...,$SINK,...)
- pattern-inside: $QUERY->set($SINK,...)
- pattern-inside: $QUERY->setValue($SINK,...)
- pattern-either:
- pattern-inside: |
$Q = $X->createQueryBuilder();
...
- pattern-inside: |
$Q = new QueryBuilder(...);
...
pattern-sources:
- patterns:
- pattern-either:
- pattern: sprintf(...)
- pattern: |
"...".$SMTH
severity: WARNING
Examples
doctrine-orm-dangerous-query.php
<?php
function test1($input)
{
$queryBuilder = $conn->createQueryBuilder();
$queryBuilder
->select('id', 'name')
->from('users')
// ruleid: doctrine-orm-dangerous-query
->where('email = '.$input)
;
}
function test2($email, $input)
{
$queryBuilder = new QueryBuilder($this->connection);
$queryBuilder
->select('id', 'name')
->from('users')
->where('email = ?')
->setParameter(0, $email)
// ruleid: doctrine-orm-dangerous-query
->andWhere(sprintf('user = %s', $input))
;
}
function okTest1($input)
{
$queryBuilder = $conn->createQueryBuilder();
$queryBuilder
->select('id', 'name')
->from('users')
// ok: doctrine-orm-dangerous-query
->where('email = ?')
->setParameter(0, $input)
;
}
Short Link: https://sg.run/jwDJ