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

क्या ये दो कार्य स्वच्छता के लिए अधिक हैं?

ईमानदार होने के लिए, मुझे लगता है कि इन फ़ंक्शन के लेखक को या तो पता नहीं है कि XSS और SQL इंजेक्शन क्या हैं या वास्तव में उपयोग किए गए फ़ंक्शन क्या करते हैं।

केवल दो विषमताओं को नाम देने के लिए:

इसके अलावा:सामान्य तौर पर, एक्सएसएस की रक्षा करने वाले कार्य फिर से एसक्यूएल इंजेक्शन और इसके विपरीत की रक्षा के लिए उपयुक्त नहीं हैं। क्योंकि प्रत्येक भाषा और संदर्भ के अपने विशेष वर्ण होते हैं जिनका ध्यान रखने की आवश्यकता होती है।

मेरी सलाह है कि यह जानें कि कोड इंजेक्शन क्यों और कैसे संभव है और इससे कैसे बचाव किया जाए। जानें कि आप जिन भाषाओं के साथ काम कर रहे हैं, विशेष रूप से विशेष पात्र और उनसे कैसे बचें।

संपादित करें यहां कुछ (शायद अजीब) उदाहरण दिया गया है:कल्पना करें कि आप अपने उपयोगकर्ताओं को कुछ मूल्य इनपुट करने की अनुमति देते हैं जिसे यूआरआई में पथ खंड के रूप में उपयोग किया जाना चाहिए जिसका उपयोग आप onclick में कुछ जावास्क्रिप्ट कोड में करते हैं। मान बताइए। तो भाषा का संदर्भ इस तरह दिखता है:

  • HTML विशेषता मान
    • जावास्क्रिप्ट स्ट्रिंग
      • यूआरआई पथ खंड

और इसे और मज़ेदार बनाने के लिए:आप इस इनपुट मान को डेटाबेस में संग्रहीत कर रहे हैं।

अब इस इनपुट मान को अपने डेटाबेस में सही ढंग से संग्रहीत करने के लिए, आपको बस उस संदर्भ के लिए एक उचित एन्कोडिंग का उपयोग करने की आवश्यकता है जिसे आप अपनी डेटाबेस भाषा (यानी SQL) में सम्मिलित करने वाले हैं; बाकी कोई फर्क नहीं पड़ता (अभी तक)। चूंकि आप इसे SQL स्ट्रिंग घोषणा में सम्मिलित करना चाहते हैं, प्रासंगिक विशेष वर्ण वे वर्ण हैं जो आपको उस संदर्भ को बदलने की अनुमति देते हैं। स्ट्रिंग घोषणाओं के लिए ये वर्ण (विशेषकर) " . हैं , ' , और \ पात्रों से बचने की जरूरत है। लेकिन जैसा कि पहले ही कहा जा चुका है, तैयार कथन आपके लिए वह सब काम करते हैं, इसलिए उनका उपयोग करें।

अब जब आपके डेटाबेस में मूल्य है, तो हम उन्हें ठीक से आउटपुट करना चाहते हैं। यहां हम अंतरतम से सबसे बाहरी संदर्भ में आगे बढ़ते हैं और प्रत्येक संदर्भ में उचित एन्कोडिंग लागू करते हैं:

  • URI पथ खंड के लिए संदर्भ हमें उन सभी पात्रों (कम से कम) से बचने की जरूरत है जो हमें उस संदर्भ को बदलने दें; इस मामले में / (वर्तमान पथ खंड छोड़ें), ? , और # (दोनों यूआरआई पथ संदर्भ छोड़ते हैं)। हम rawurlencode का इस्तेमाल कर सकते हैं इसके लिए।
  • जावास्क्रिप्ट स्ट्रिंग के लिए संदर्भ हमें " . का ध्यान रखने की आवश्यकता है , ' , और \ . हम json_encode का इस्तेमाल कर सकते हैं इसके लिए (यदि उपलब्ध हो)।
  • HTML विशेषता मान के लिए हमें & का ध्यान रखना होगा , " , ' , और < . हम htmlspecialchars का उपयोग कर सकते हैं इसके लिए।

अब सब कुछ एक साथ:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

अब अगर $row['user-input'] "bar/baz" . है आउटपुट है:

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

लेकिन इन संदर्भों में इन सभी कार्यों का उपयोग करना कोई अतिश्योक्ति नहीं है। क्योंकि हालांकि संदर्भों में समान विशेष वर्ण हो सकते हैं, उनके पास अलग-अलग भागने के क्रम हैं। यूआरआई में तथाकथित प्रतिशत एन्कोडिंग है, जावास्क्रिप्ट में एस्केप सीक्वेंस हैं जैसे \" और HTML में वर्ण संदर्भ हैं जैसे &quot; . और इनमें से केवल एक फ़ंक्शन का उपयोग न करने से संदर्भ टूट जाएगा।



  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. मैं पायथन में mysqldump का उपयोग किए बिना एक MySQL डेटाबेस को कैसे डंप कर सकता हूं?

  3. PHP और MYSQL डेटाबेस कनेक्शन और टेबल निर्माण केवल एक बार

  4. त्रुटि संदेश:थ्रेड मुख्य org.hibernate.HibernateException में अपवाद:स्टैक्स स्ट्रीम तक पहुँचने में त्रुटि

  5. MySQL डेटाटाइम समय नहीं लौटा रहा है