FlawOpen

flawopen.com/SQL Injection in PHP/Doctrine ORM

क्या Doctrine ORM SQL Injection से सुरक्षित है?

Reference page
संक्षिप्त उत्तर

Bound parameters के साथ DQL सुरक्षित है। DQL या native SQL को string जोड़कर बनाने से raw query जैसा जोखिम लौट आता है।

असुरक्षित — input DQL syntax बनता है
$em->createQuery(
  "SELECT u FROM User u "
  . "WHERE u.id = $userId"
);
सुरक्षित — केवल trusted expressions
$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 करें।

असुरक्षित — input DQL syntax बनता है
$qb->orderBy(
  'u.' . $request->query->get('sort'),
  $request->query->get('direction')
);
सुरक्षित — केवल trusted expressions
$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);

Codebase की जाँच

rg -n -g '*.php' 'createQuery\(|orderBy\(|addOrderBy\(|executeQuery\(' .
हर match में concatenation/interpolation, expression APIs में user input, और fixed allow-list से बाहर identifiers जाँचें। Search results review candidates हैं, exploitability का प्रमाण नहीं।

स्रोत और संदर्भ

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com EF Core FromSqlRaw: सुरक्षित पैरामीटरयुक्त SQL FastAPI SQL इंजेक्शन: Pydantic क्या रोकता है और क्या नहीं GORM Raw SQL: Go में SQL injection रोकें क्या Quotes Escape करना SQL Injection रोकने के लिए काफ़ी है? SQL इंजेक्शन रोकने के लिए ORM का उपयोग काफ़ी है? क्या Knex.js SQL Injection से सुरक्षित है?