FlawOpen

flawopen.com/Java में SQL Injection/MyBatis

MyBatis ${} बनाम #{}: SQL Injection से बचाव

संदर्भ पृष्ठ
संक्षिप्त उत्तर

#{value} को prepared statement के सुरक्षित value slot की तरह समझें: database इसे data मानता है। ${value} तैयारी से पहले SQL में text जोड़ता है।

Bound values बनाम raw SQL text

असुरक्षित — ${} raw text
<select id="getUser">
  SELECT * FROM users
  WHERE id = ${id}
</select>
// Raw substitution: the SQL text changes
Bound value — #{}
<select id="getUser">
  SELECT * FROM users
  WHERE id = #{id}
</select>
// MyBatis creates a PreparedStatement parameter

MyBatis में दोनों syntaxes क्यों हैं

#{} JDBC PreparedStatement parameter से मान bind करता है। Parameter table, column या sort direction जैसी SQL syntax नहीं बन सकता। ${} text सीधे बदलता है और escape नहीं करता। Static statements या <choose> branches चुनें; अन्यथा पूरा identifier server allowlist से लें, arbitrary request text न जोड़ें।

जब dynamic identifiers जरूरी हों

पूरे SQL identifier या fragment को allowlist करें

Bound parameter identifier की जगह नहीं लेता। Sorting choice को server के fixed SQL fragments से map करें या <choose> लें। Client का column, table या ASC/DESC सीधे ${} में न दें। Escaping arbitrary SQL को सुरक्षित नहीं बनाता।

MyBatis mapper की जाँच

rg -n -F '${' --glob '*.xml' --glob '*.java' .
XML और annotations के हर match की समीक्षा करें और value का स्रोत trace करें। Values के लिए #{}; ${} के लिए finite server allowlist जरूरी है। Search syntax ढूँढता है, indirect SQL निर्माण नहीं।

अक्सर पूछे जाने वाले प्रश्न

क्या annotation-based mapper पर भी लागू है?

हाँ। वही नियम हैं। @Select में ${column} raw text जोड़ता है; मान #{value} से bind करें और identifier allowlist करें।

क्या ${} खोज सुरक्षा साबित करती है?

नहीं। परिणामों की समीक्षा करें; SQL दूसरी जगह बन सकता है। XML और annotations जाँचें और test करें कि sorting केवल तय fragments चुने।

संदर्भ

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com MySQLi बनाम PDO: सुरक्षित Prepared Statements क्या NHibernate SQL Injection से बचाता है? MongoDB NoSQL Injection: सुरक्षित query filters Numeric ID में SQL Injection का जोखिम पैरामीटराइज़्ड क्वेरी क्या है? क्या Prisma $queryRaw SQL Injection से सुरक्षित है?