کوئری رنر کو ریڈ-اونلی (Read-Only) بنانے کے لیے SQL کو پارس نہ کریں

SQL اسٹرنگز میں کی ورڈز (keywords) تلاش کر کے اپنے ڈیٹا بیس کو محفوظ بنانے کی کوشش کرنا چھوڑ دیں۔

اگر آپ SQL چلانے کے لیے کوئی ٹول بناتے ہیں، تو آپ کو ریڈ-اونلی (read-only) موڈ کی ضرورت ہوگی۔ آپ چاہتے ہیں کہ کسی غلطی سے ہونے والا UPDATE آپ کا ڈیٹا ڈیلیٹ نہ کر دے۔ آپ کا پہلا خیال شاید DELETE یا DROP جیسے الفاظ کو بلاک کرنے کا ہو سکتا ہے۔

ایسا ہرگز نہ کریں۔

اسٹرنگ چیکز (String checks) کو بائی پاس کرنا آسان ہے۔ ایک صارف DELETE کو چھپانے کے لیے WITH clause کا استعمال کر سکتا ہے۔ وہ کمانڈز کو چھپانے کے لیے کمنٹس (comments) کا استعمال کر سکتے ہیں۔ وہ ایسا فنکشن کال کر سکتے ہیں جو ٹیبل میں ڈیٹا لکھتا ہو۔ آخر کار آپ ایک ایسی ناکام جدوجہد میں الجھ جائیں گے جہاں ایک مسئلہ حل ہوتے ہی دوسرا سامنے آ جائے گا۔

سیکیورٹی کا معاملہ ڈیٹا بیس پر چھوڑ دیں۔

Postgres میں اس کے لیے ایک بلٹ ان (built-in) فیچر موجود ہے۔ آپ ایک ٹرانزیکشن (transaction) کو ریڈ-اونلی قرار دے سکتے ہیں۔ اس کے بعد سرور کسی بھی رائٹ (write) کمانڈ کو مسترد کر دے گا۔ اس میں CTEs، functions، اور DDL شامل ہیں۔

Python میں اسے صحیح طریقے سے نافذ کرنے کا طریقہ یہ ہے:

یہ طریقہ SQL ٹیکسٹ کا معائنہ نہیں کرتا۔ کوئری بالکل اسی طرح سرور پر جاتی ہے جیسے لکھی گئی ہو۔ آپ انجن کو یہ حکم دے رہے ہیں کہ وہ اس اصول پر عمل کرے۔

حفاظت کے لیے دو چیزیں ضروری ہیں:

  1. رائٹس (writes) سے تحفظ: ریڈ-اونلی ٹرانزیکشنز استعمال کریں۔
  2. ریسورس کے غلط استعمال سے تحفظ: ٹائم آؤٹس (timeouts) اور رو لمٹس (row limits) استعمال کریں۔

ایک ریڈ-اونلی کوئری بھی ایک بڑے join کے ذریعے آپ کے سسٹم کو کریش کر سکتی ہے۔ ریڈ-اونلی ٹرانزیکشن رائٹس کو تو روک دیتی ہے، لیکن یہ ریسورسز کے بھاری استعمال کو نہیں روکتی۔ ad-hoc SQL کو محفوظ بنانے کے لیے آپ کو ان دونوں کی ضرورت ہے۔

SQL کو پارس کرنا بند کریں۔ ڈیٹا بیس سے اپنا کام کرنے کا کہیں۔

ماخذ: https://dev.to/hitoshi1964/dont-parse-sql-to-make-a-query-runner-read-only-b62