2009-02-20 11 views
15

के खिलाफ बचाव करने का सबसे अच्छा तरीका इस समय, मैं 'दीवार पर सब कुछ फेंक देता हूं और उपरोक्त मुद्दों को रोकने के लिए क्या चिपकता है' विधि लागू करता हूं। नीचे वह फ़ंक्शन है जिसे मैंने एक साथ जोड़ दिया है:mysql इंजेक्शन और क्रॉस साइट स्क्रिप्टिंग

function madSafety($string) 
{ 

$string = mysql_real_escape_string($string); 
$string = stripslashes($string); 
$string = strip_tags($string); 
return $string; 

} 

हालांकि, मुझे विश्वास है कि ऐसा करने का एक बेहतर तरीका है। मैं FILTER_ SANITIZE_STRING का उपयोग कर रहा हूं और यह पूरी तरह सुरक्षित नहीं है।

मुझे लगता है कि मैं पूछ रहा हूं, आप कौन से तरीके नियोजित करते हैं और वे कितने सफल हैं? धन्यवाद

+0

डुप्ले: http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php – troelskn

+0

यह दृष्टिकोण कई पहलुओं पर गलत है! मैंने नीचे एक उत्तर पोस्ट किया है और उनके लेखकों के विचारों से इनकार करने के लिए प्रत्येक प्रतिक्रिया -1 को रेट किया है। –

उत्तर

33

बस बहुत सारी चीज़ें जो आप वास्तव में समझ में नहीं आती हैं, आपकी मदद करने वाली नहीं है। आपको यह समझने की जरूरत है कि इंजेक्शन के हमले क्या हैं और वास्तव में आपको और कैसे करना चाहिए।

बुलेट बिंदुओं में:

  • Disable magic quotes। वे एक अपर्याप्त समाधान हैं, और वे मामलों को भ्रमित करते हैं।
  • एसक्यूएल में स्ट्रिंग को सीधे एम्बेड न करें। बाध्य पैरामीटर का उपयोग करें, या बचें (mysql_real_escape_string का उपयोग कर)।
  • अनसस्केप (उदाहरण के लिए stripslashes) जब आप डेटाबेस से डेटा पुनर्प्राप्त करते हैं।
  • जब आप एचटीएमएल में स्ट्रिंग एम्बेड करते हैं (उदाहरण के लिए जब आप echo), तो आपको स्ट्रिंग से बचने के लिए डिफ़ॉल्ट होना चाहिए (htmlentitiesENT_QUOTES के साथ)।
  • यदि आपको HTML में HTML-स्ट्रिंग एम्बेड करने की आवश्यकता है, तो आपको स्ट्रिंग के स्रोत पर विचार करना होगा। अगर यह अविश्वसनीय है, तो आपको इसे फ़िल्टर के माध्यम से पाइप करना चाहिए। strip_tags सिद्धांत में है कि आपको क्या उपयोग करना चाहिए, लेकिन यह त्रुटिपूर्ण है; इसके बजाय HtmlPurifier का उपयोग करें।

यह भी देखें: What's the best method for sanitizing user input with PHP?

+0

उत्कृष्ट का उपयोग करें - यह जो प्रतिक्रिया मैं लिख रहा था उससे काफी बेहतर है, अब छोड़ दिया गया है। +1 –

+0

हम सभी को वास्तव में अच्छा अनुस्मारक :) +1 – itsols

2

नहीं है! mysql_real_escape_string का उपयोग एसक्यूएल इंजेक्शन और stropslashes के खिलाफ आपको बचाने के लिए पर्याप्त है के बाद आप SQL इंजेक्शन के लिए कमजोर बनाते हैं। क्या तुम सच में यह चाहते हैं, उस में के रूप में से पहले डाल:

function madSafety($string) 
{ 
    $string = stripslashes($string); 
    $string = strip_tags($string); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

stripslashes वास्तव में उपयोगी है अगर आप mysql_real_escape_string कर रहे हैं नहीं है।

strip_tags एचटीएमएल/एक्सएमएल इंजेक्शन के खिलाफ सुरक्षा करता है, एसक्यूएल नहीं।

ध्यान देने योग्य महत्वपूर्ण बात यह है कि आपको अपने स्ट्रिंग्स अलग-अलग से बचने के लिए आपके द्वारा किए गए इमेडिएट उपयोग के आधार पर अलग होना चाहिए।

जब आप MYSQL अनुरोध कर रहे हैं mysql_real_escape_string का उपयोग करें। जब आप वेब पेज आउटपुट कर रहे हैं तो htmlentities का उपयोग करें। वेब लिंक बनाने के लिए urlencode का उपयोग करें ...

जैसा कि वर्टेक ने नोट किया, यदि आप प्लेसहोल्डर का हर तरह से उपयोग कर सकते हैं।

+5

दरअसल, mysql_real_escape_string पूरी तरह से सुरक्षित नहीं है। Http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html –

9

एसक्यूएल इंजेक्शन के खिलाफ सबसे अच्छा तरीका वैरिएबल को बांधना है, बल्कि स्ट्रिंग में "इंजेक्शन" करना है। http://www.php.net/manual/en/mysqli-stmt.bind-param.php

+0

स्वीकार्य टैग के साथ ध्यान से रहें - बहुत अच्छी तरह से किसी भी टैग में जेएस एम्बेडेड हो सकता है। –

+0

इसके अलावा - http://isisblogs.poly.edu/2008/08/16/php-strip_tags-not-a-complete-protection-against-xss/ –

+0

स्ट्रिप_टैग त्रुटिपूर्ण है .. स्ट्रिंग से बचें, या यदि आपको वास्तव में आवश्यकता है एचटीएमएल की अनुमति देने के लिए, htmlpurifier – troelskn

0

यह विषय इतना गलत है!

आपको उपयोगकर्ता के इनपुट को फ़िल्टर नहीं करना चाहिए! यह वह जानकारी है जो उसके द्वारा दर्ज की गई है। यदि मैं अपना पासवर्ड चाहता हूं तो मैं क्या करूँगा: '"'>s3cr3t<script>alert()</script>

अक्षरों को फ़िल्टर करें और मुझे एक बदले गए पासवर्ड से छोड़ दें, इसलिए मैं अपने पहले लॉगिन में भी सफल नहीं हो सकता? ये गलत है।

एसक्यूएल इंजेक्शन से बचने के लिए तैयार कथन या mysql_real_escape_string() का उचित समाधान है और अपने एचटीएमएल कोड को गड़बड़ाने से बचने के लिए वर्णों के संदर्भ-जागरूक भागने का उपयोग करें।

मुझे आपको याद दिलाना है कि वेब केवल उन तरीकों में से एक है जिसे आप उपयोगकर्ता द्वारा दर्ज की गई जानकारी का प्रतिनिधित्व कर सकते हैं। यदि आप कुछ डेस्कटॉप सॉफ़्टवेयर करते हैं तो क्या आप इस तरह के स्ट्रिपिंग स्वीकार करेंगे? मुझे उम्मीद है कि आपका जवाब नहीं है और आप समझेंगे कि यह सही तरीका क्यों नहीं है।

ध्यान दें कि विभिन्न संदर्भों में अलग-अलग वर्णों से बच जाना होगा।

<span title="{$user->firstName}">{$user->firstName}</span> 

हालांकि, '"><script>window.document.location.href="http://google.com"</script> की तरह बनना उपयोगकर्ता अपने पहले नाम की स्थापना की है, तो आप क्या करते हैं वाला है: उदाहरण के लिए, यदि आप टूलटिप के रूप में उपयोगकर्ता पहला नाम प्रदर्शित करने के लिए की जरूरत है, आप की तरह कुछ का उपयोग करेंगे? उद्धरण पट्टी? यह बहुत गलत होगा! इस गैर-अर्थ को करने के बजाय, डेटा को प्रस्तुत करते समय उद्धरणों से बचने पर विचार करें, इसे जारी रखते हुए नहीं!

एक और संदर्भ जो आपको विचार करना चाहिए वह मूल्य को प्रतिपादित करते समय है। पहले इस्तेमाल किए गए एचटीएमएल कोड पर विचार करें और कल्पना करें कि उपयोगकर्ता का पहला नाम <textarea> जैसा है। यह सभी HTML कोड को लपेट देगा जो इस textarea तत्व में निम्नानुसार है, इस प्रकार पूरे पृष्ठ को तोड़ देगा।

फिर भी - उस संदर्भ के आधार पर डेटा से बचने पर विचार करें जिसका आप इसका उपयोग कर रहे हैं!

पी। वास्तव में उन नकारात्मक वोटों पर प्रतिक्रिया कैसे करें। क्या आप, लोग वास्तव में मेरा जवाब पढ़ रहे हैं?

+0

मेरी टिप्पणी को हटाने के बजाय, कृपया यह समझने की कोशिश करें कि मैं क्या कह रहा था। यदि किसी उपयोगकर्ता के पास टैग के साथ उपयोगकर्ता नाम था, तो मैं टैग को पट्टी नहीं करता, मैं उपयोगकर्ता नाम को पूरी तरह से अस्वीकार कर दूंगा और उन्हें कम उपयोगकर्ता नाम के साथ आने के लिए मजबूर कर दूंगा, मुझे माफ कर दो, बेवकूफ। पासवर्ड अलग-अलग होंगे, निश्चित रूप से, लेकिन उनमें से

संबंधित मुद्दे