flawopen.com/SQL Injection in PHP/Doctrine ORM
क्या Doctrine ORM SQL Injection से सुरक्षित है?
Bound parameters के साथ DQL सुरक्षित है। DQL या native SQL को string जोड़कर बनाने से raw query जैसा जोखिम लौट आता है।
$em->createQuery( "SELECT u FROM User u " . "WHERE u.id = $userId" );
$qb->select('u')
->from('User', 'u')
->where('u.id = :id')
->setParameter('id', $userId);
Bound values query structure को सुरक्षित नहीं करते
setParameter() DQL value को bind करता है, जिसे Doctrine query text से अलग SQL parameter बनाता है। createQuery() में input जोड़ना इस सुरक्षा को bypass करता है। Native SQL में भी यही नियम है: Connection::executeQuery() placeholders और parameter array के साथ सुरक्षित है, लेकिन SQL string में input interpolate करने पर नहीं।
Parameters identifiers का विकल्प नहीं हैं
Placeholder एक value दर्शाता है, DQL identifier, SQL column/table, operator या sort direction नहीं। ORM security guidance चेतावनी देता है कि QueryBuilder expression methods में user input देने पर injectable DQL बन सकता है। Expressions trusted code में रखें और चुने गए sort options को सख्त allow-list से map करें।
$qb->orderBy(
'u.' . $request->query->get('sort'),
$request->query->get('direction')
);
$fields = [
'name' => 'u.name',
'created' => 'u.createdAt',
];
$directions = ['asc' => 'ASC', 'desc' => 'DESC'];
$key = (string) $request->query->get('sort', 'name');
$sort = $fields[$key] ?? $fields['name'];
$requestedDirection = strtolower(
(string) $request->query->get('direction', 'asc')
);
$direction = $directions[$requestedDirection] ?? 'ASC';
$qb->orderBy($sort, $direction);
- ✓हर बाहरी value को setParameter() या DBAL placeholders से bind करें; उसे DQL/SQL में जोड़ें नहीं।
- ✓QueryBuilder expression methods और DQL fragments को code मानें। User-selected fields, directions, operators और functions allow-list से चुनें।
- ✓Native SQL के लिए placeholders वाला executeQuery($sql, $params) या executeStatement($sql, $params) उपयोग करें।
- ✓Data flow और query structure दोनों जाँचें। Parameterized value भी unauthorized records दिखा सकती है; authorization अलग से लागू करें।
Codebase की जाँच
rg -n -g '*.php' 'createQuery\(|orderBy\(|addOrderBy\(|executeQuery\(' .स्रोत और संदर्भ
- Doctrine ORM — QueryBuilder parameters
- Doctrine ORM — Security
- Doctrine DBAL — prepared queries और parameters
- FlawOpen — PHP SQL Injection