Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

डेल्फी - एसक्यूएल इंजेक्शन के खिलाफ रोकें

सुरक्षित

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 नहीं हो सकते हैं एक (उप) क्वेरी में है



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सामान्य कॉलम (ए, बी) और (ए, सी) के साथ 2 प्रश्नों को केवल एक (ए, बी, सी) में कैसे बदलें?

  2. Oracle:डेटा आयात करते समय संभावित एन्कोडिंग समस्याएं

  3. ओरेकल के एंटिटी फ्रेमवर्क समर्थन के साथ पास्कल केस को कैसे बल दें?

  4. डेटाटाइम फ़ील्ड को SQL (Oracle) में केवल एक दिनांक फ़ील्ड में कनवर्ट करें

  5. Oracle:समूहीकृत परिणामों में एक अवर्गीकृत स्तंभ को समेकित करने का तरीका