𝗗𝗼𝗻'𝘁 𝗣𝗮𝗿𝘀𝗲 𝗦𝗤𝗟 𝘁𝗼 𝗠𝗮𝗸𝗲 𝗮 𝗤𝘂𝗲𝗿𝘆 𝗥𝘂𝗻𝗻𝗲𝗿 𝗥𝗲𝗮𝗱-𝗢𝗻𝗹𝘆

SQL சரங்களில் (strings) உள்ள முக்கிய வார்த்தைகளை (keywords) சரிபார்ப்பதன் மூலம் உங்கள் தரவுத்தளத்தைப் (database) பாதுகாக்க முயற்சிப்பதை நிறுத்துங்கள்.

நீங்கள் SQL-ஐ இயக்க ஒரு கருவியை உருவாக்குகிறீர்கள் என்றால், உங்களுக்கு ஒரு read-only முறை தேவைப்படும். ஒரு தற்செயலான UPDATE மூலம் உங்கள் தரவு அழிப்பதைத் தடுக்க நீங்கள் விரும்புவீர்கள். DELETE அல்லது DROP போன்ற வார்த்தைகளைத் தடுப்பதே உங்கள் முதல் எண்ணமாக இருக்கலாம்.

இதைச் செய்யாதீர்கள்.

String சோதனைகளை எளிதாகத் தவிர்க்க (bypass) முடியும். ஒரு பயனர் DELETE கட்டளையை மறைக்க WITH clause-ஐப் பயன்படுத்தலாம். கட்டளைகளை மறைக்க அவர்கள் comments-களைப் பயன்படுத்தலாம். ஒரு அட்டவணையில் (table) தரவை எழுதும் ஒரு function-ஐ அவர்கள் அழைக்கலாம். இறுதியில் நீங்கள் ஒரு தோல்வியடையும் விளையாட்டை (whack-a-mole) விளையாடிக்கொண்டிருப்பீர்கள்.

பாதுகாப்பைக் கையாள தரவுத்தளத்தையே (database) அனுமதிக்கவும்.

Postgres-இல் இதற்கென ஒரு built-in வசதி உள்ளது. நீங்கள் ஒரு transaction-ஐ read-only என்று அறிவிக்கலாம். அதன் பிறகு சர்வர் எந்த write கட்டளையையும் நிராகரிக்கும். இது CTEs, functions மற்றும் DDL ஆகிய அனைத்தையும் உள்ளடக்கும்.

Python-இல் இதைச் சரியாகச் செயல்படுத்துவது எப்படி:

இந்த அணுகுமுறை SQL உரையை (text) ஆய்வு செய்வதில்லை. வினவல் (query) எழுதப்பட்டபடியே சர்வருக்குச் செல்கிறது. விதியை நடைமுறைப்படுத்துமாறு நீங்கள் engine-இடம் கூறுகிறீர்கள்.

பாதுகாப்பு இரண்டு பகுதிகளைக் கொண்டது:

  1. எழுதும் முறையிலிருந்து பாதுகாப்பு: read-only transactions-களைப் பயன்படுத்தவும்.
  2. வளங்களின் துஷ்பிரயோகத்திலிருந்து பாதுகாப்பு: timeouts மற்றும் row limits-களைப் பயன்படுத்தவும்.

ஒரு read-only query, ஒரு மிகப்பெரிய join மூலம் உங்கள் அமைப்பை (system) முடக்கிவிடக்கூடும். ஒரு read-only transaction எழுதும் முறைகளைத் தடுக்கிறது, ஆனால் அதிகப்படியான வளப் பயன்பாட்டை (resource use) தடுப்பதில்லை. ad-hoc SQL-ஐப் பாதுகாப்பாக மாற்ற உங்களுக்கு இவை இரண்டும் தேவை.

SQL-ஐ parse செய்வதை நிறுத்துங்கள். அதன் வேலையைச் செய்ய தரவுத்தளத்திடம் கேளுங்கள்.

Source: https://dev.to/hitoshi1964/dont-parse-sql-to-make-a-query-runner-read-only-b62