একটি Query Runner-কে Read-Only করার জন্য SQL Parse করবেন না
SQL স্ট্রিং-এ কিওয়ার্ড চেক করে আপনার ডাটাবেস সুরক্ষিত করার চেষ্টা করা বন্ধ করুন।
আপনি যদি SQL চালানোর জন্য কোনো টুল তৈরি করেন, তবে আপনার একটি read-only মোড প্রয়োজন হবে। আপনি চান যাতে কোনো ভুলবশত UPDATE কমান্ড আপনার ডাটা মুছে না ফেলে। আপনার প্রথম চিন্তা হতে পারে DELETE বা DROP-এর মতো শব্দগুলো ব্লক করা।
এটি করবেন না।
String চেক করা খুব সহজেই বাইপাস করা যায়। একজন ব্যবহারকারী DELETE কমান্ড লুকিয়ে রাখার জন্য WITH clause ব্যবহার করতে পারেন। তারা কমান্ড লুকিয়ে রাখতে কমেন্ট ব্যবহার করতে পারেন। তারা এমন একটি ফাংশন কল করতে পারেন যা কোনো টেবিলে ডাটা লেখে। আপনি শেষ পর্যন্ত whack-a-mole-এর মতো একটি হারানো খেলায় জড়িয়ে পড়বেন।
ডাটাবেসকে সিকিউরিটি হ্যান্ডেল করতে দিন।
Postgres-এ এর জন্য একটি বিল্ট-ইন ফিচার রয়েছে। আপনি একটি transaction-কে read-only হিসেবে ঘোষণা করতে পারেন। এরপর সার্ভার যেকোনো write কমান্ড প্রত্যাখ্যান করবে। এটি CTEs, functions এবং DDL-কেও কভার করে।
Python-এ এটি সঠিকভাবে প্রয়োগ করার পদ্ধতি নিচে দেওয়া হলো:
autocommitFalse সেট করে একটি আসল transaction ব্যবহার করুন।- প্রথম কমান্ড হিসেবে
SET TRANSACTION READ ONLYচালান। - দীর্ঘ সময় ধরে চলা কুয়েরি আপনার সিস্টেম লক করা থেকে আটকাতে
statement_timeoutসেট করুন। - লক এবং স্ন্যাপশট রিলিজ করতে শেষে
rollback()ব্যবহার করুন।
এই পদ্ধতিতে SQL টেক্সট ইনস্পেক্ট করা হয় না। কুয়েরিটি ঠিক যেভাবে লেখা হয়েছে সেভাবেই সার্ভারে যায়। আপনি ইঞ্জিনকে নিয়মটি কার্যকর করার নির্দেশ দিচ্ছেন।
নিরাপত্তার জন্য দুটি অংশ প্রয়োজন:
- রাইট (writes) থেকে সুরক্ষা: read-only transaction ব্যবহার করুন।
- রিসোর্স অপব্যবহার থেকে সুরক্ষা: timeout এবং row limit ব্যবহার করুন।
একটি read-only কুয়েরি একটি বিশাল join-এর মাধ্যমে আপনার সিস্টেম ক্র্যাশ করাতে পারে। একটি read-only transaction রাইট অপারেশন বন্ধ করে, কিন্তু এটি অতিরিক্ত রিসোর্স ব্যবহার বন্ধ করে না। ad-hoc SQL-কে নিরাপদ করতে আপনার এই দুটিরই প্রয়োজন।
SQL parse করা বন্ধ করুন। ডাটাবেসকে তার কাজ করতে দিন।
উৎস: https://dev.to/hitoshi1964/dont-parse-sql-to-make-a-query-runner-read-only-b62