Foundationপ্রথম নীতি থেকে
LEVEL 10 · Computer Security

Prepared Statement

প্রিপেয়ার্ড স্টেটমেন্ট

Query structure আগে থেকে compile করে, data placeholder দিয়ে আলাদা পাঠানো — user input কখনো SQL syntax হিসেবে parse হয় না।

also: parameterized-query

# vulnerable
cursor.execute(f"SELECT * FROM users WHERE name='{name}'")
# safe — placeholder + আলাদা data channel
cursor.execute("SELECT * FROM users WHERE name=?", (name,))
  • Database driver query structure আর data দুইটা আলাদা message হিসেবে engine-কে পাঠায় — data-তে যেকোনো character থাকলেও তা কখনো syntax হিসেবে interpret হয় না
  • Escaping/blocklist-ভিত্তিক defense-এর চেয়ে শক্তিশালী — programmer discipline নয়, mechanism নিজেই নিশ্চয়তা দেয়
  • একই বাইন্ডিং trick command-injection-এ (argument list, shell=False) আর অনেক ORM-এর নিচেও প্রয়োগ করা আছে