सुरक्षित
query.SQL.Text := 'select * from table_name where name=:Name';
यह कोड सुरक्षित है क्योंकि आप पैरामीटर का उपयोग कर रहे हैं।
पैरामीटर हमेशा SQL-इंजेक्शन से सुरक्षित होते हैं।
असुरक्षित
var Username: string;
...
query.SQL.Text := 'select * from table_name where name='+ UserName;
असुरक्षित है क्योंकि उपयोगकर्ता नाम name; Drop table_name;
जिसके परिणामस्वरूप निम्नलिखित क्वेरी निष्पादित की जा रही है।
select * from table_name where name=name; Drop table_name;
साथ ही असुरक्षित
var Username: string;
...
query.SQL.Text := 'select * from table_name where name='''+ UserName+'''';
क्योंकि यह यदि उपयोगकर्ता नाम ' or (1=1); Drop Table_name; --
इसके परिणामस्वरूप निम्नलिखित प्रश्न होंगे:
select * from table_name where name='' or (1=1); Drop Table_name; -- '
लेकिन यह कोड सुरक्षित है
var id: integer;
...
query.SQL.Text := 'select * from table_name where id='+IntToStr(id);
क्योंकि IntToStr()
केवल पूर्णांकों को स्वीकार करेगा ताकि कोई SQL कोड इस तरह से क्वेरी स्ट्रिंग में इंजेक्ट नहीं किया जा सके, केवल संख्याएं (जो वास्तव में आप चाहते हैं और इस प्रकार अनुमति दी गई है)
लेकिन मैं वह काम करना चाहता हूं जो पैरामीटर के साथ नहीं किया जा सकता
पैरामीटर का उपयोग केवल मानों के लिए किया जा सकता है। वे फ़ील्ड नामों या तालिका नामों को प्रतिस्थापित नहीं कर सकते हैं। इसलिए यदि आप इस क्वेरी को निष्पादित करना चाहते हैं
query:= 'SELECT * FROM :dynamic_table '; {doesn't work}
query:= 'SELECT * FROM '+tableName; {works, but is unsafe}
पहली क्वेरी विफल हो जाती है क्योंकि आप तालिका या फ़ील्ड नामों के लिए पैरामीटर का उपयोग नहीं कर सकते हैं।
आपको स्ट्रिंग की जांच करनी होगी tablename
स्वीकृत नामों की सूची के विरुद्ध
Const
ApprovedTables: array[0..1] of string = ('table1','table2');
procedure DoQuery(tablename: string);
var
i: integer;
Approved: boolean;
query: string;
begin
Approved:= false;
for i:= lo(ApprovedTables) to hi(ApprovedTables) do begin
Approved:= Approved or (lowercase(tablename) = ApprovedTables[i]);
end; {for i}
if not Approved then exit;
query:= 'SELECT * FROM '+tablename;
...
ऐसा करने का यही एकमात्र तरीका है, जिसके बारे में मुझे पता है।
BTW आपके मूल कोड में एक त्रुटि है:
query.SQL.Text := 'select * from table_name where name=:Name where id=:ID';
होना चाहिए
query.SQL.Text := 'select * from table_name where name=:Name and id=:ID';
आपके पास दो where
नहीं हो सकते हैं एक (उप) क्वेरी में है