2010-01-12 8 views
8

यूआरएल की जाएगीक्या एक यूआरएल के लिए "पर्याप्त सफ़ाई" है

  1. एक MySQL डेटाबेस
  2. उपयोगकर्ता के प्रोफ़ाइल पर एक चित्र प्रदर्शित करने के लिए प्रयोग किया जाता है में सहेजा गया

होगा strip_tags() और mysql_real_escape_string() पर्याप्त हो?

+1

मुझे इसी तरह के प्रश्न के कुछ अच्छे उत्तर प्राप्त हुए; यदि आप चाहें तो http://stackoverflow.com/questions/549987/what-is-the-best-way-to-filter-urls-for-input देखें। माइक बोर्स के उत्तर के सुझाव के मुताबिक सबसे अच्छा समाधान यूआरएल को पूरी तरह से पुनर्निर्माण करना है। – JAL

उत्तर

16

"पर्याप्त स्वच्छता" पूरी तरह से निर्भर करता है कि आप किस पर्यावरण के बारे में बात कर रहे हैं। MySQL के लिए स्वच्छता को वेब आउटपुट के लिए स्वच्छता से पूरी तरह से अलग किया जाना चाहिए, और आपको बहुत परेशानी से बचने के लिए उन्हें अलग से संभालना चाहिए।

MySQL

  • mysql_real_escape_string() के लिए साफ करना डेटा का एक टुकड़ा स्वच्छ और यह एक SQL क्वेरी के अंदर डाल करने के लिए सुरक्षित कर देगा।
  • स्ट्रिंग के अंदर HTML टैग जैसे किसी अन्य प्रकार के दुर्भावनापूर्ण डेटा को पूरी तरह से अनदेखा किया जाना चाहिए। इसे यहां हेरफेर करने की कोशिश करने से आपको सिरदर्द हो जाएगा क्योंकि आप डेटाबेस से बाहर निकलने के बाद इसे "अन-मैनिपुलेट" करने का प्रयास करते हैं। खराब "वेब डेटा" आपके डेटाबेस को नुकसान नहीं पहुंचा सकता है।

उत्पादन समय में उत्पादन

  • htmlspecialchars($val) के लिए साफ करना क्योंकि < और > पात्रों को उनके इकाई अभ्यावेदन में बदला जाता है और टैग सीमांकक के रूप में प्रदान नहीं, गाया जा रहा से किसी भी दुर्भावनापूर्ण टैग नहीं कर पाएगा।
  • आप <input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />

यही होना चाहिए आप सभी की जरूरत है, जब तक आप विशेष आवश्यकताओं है के रूप में कुछ किसी HTML तत्व के उद्धृत विशेषता के अंदर है कि, इस तरह के outputting रहे हैं अगर ENT_QUOTES संशोधक का उपयोग करें। strip_tags() वास्तव में स्वच्छता के लिए उपयोग नहीं किया जाना चाहिए, क्योंकि इसे बुरी तरह से बना HTML के साथ बेवकूफ बनाया जा सकता है। स्वच्छता एक योग्य लक्ष्य है, और यदि आप अपने संदर्भों को अलग रख सकते हैं, तो आप उनके बीच डेटा हेरफेर के साथ कम समस्याओं में भाग लेंगे।

+1

+1 केवल जब इसकी आवश्यकता हो तो sanitizing। बेशक, एसक्यूएल के लिए sanitizing * बुराई * है, बस parametrized प्रश्नों का उपयोग करें ... – sleske

+0

@sleske - हाँ, यह आजकल प्रचलित ज्ञान है। एसक्यूएल के लिए स्वच्छता हालांकि बुरा नहीं है। कई सिस्टम पुराने डेटाबेस संस्करणों या ड्राइवरों का उपयोग करेंगे, और शायद MySQLi तक पहुंच नहीं हो सकती है। एकमात्र कारण sanitizing एक बुरा प्रतिनिधि हो जाता है क्योंकि लोग * इसे करने के लिए भूल जाते हैं *। तैयार प्रश्न मैन्युअल स्वच्छता (अन्य फायदों के बीच) को दूर करें। – zombat

+0

आपका मतलब क्या है "पैरामीट्रिज्ड क्वेरीज़"? – aslum

1

स्ट्रिप_टैग() पर गिनने की बजाए स्ट्रिंग पर HTMLentities() को कॉल करना संभवतः सुरक्षित और बेहतर है।

strip_tags() की तरह एचटीएमएल विशेष वर्ण को नहीं निकाला जाएगा '"&

जैसे, यदि आपका कोड है:

:

<img src="<?= strip_tags($myVar) ?>"> 

और

$myVar = '">something goes here<'; 

तो आप के साथ समाप्त

<img src="">something goes here<"> 

जो स्पष्ट रूप से एक एक्सएसएस छेद की जड़ है; एक वास्तविक शोषण पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।

0

मैं शुरू में फ्रैंक जवाब upvoted, लेकिन एक समस्या के बारे में सोचा: htmlentities() इस तरह कानूनी यूआरएल टूट जाएगा:

http://www.mywebsite.com/profile?id=jojo&w=60&h=60

शायद अलग करना कोण कोष्ठक + mysql_real_escape पर्याप्त होगा?

+0

एक छवि यूआरएल में एम्पर्सेंड नहीं होना चाहिए या इसमें ऐसा क्यों होना चाहिए? – aslum

+0

क्यों नहीं? एक स्क्रिप्ट छवियों का एक पूरी तरह से वैध स्रोत है। –

+2

htmlentities() उस यूआरएल पर ठीक काम करेगा। वास्तव में, आपके गुणों में एन्कोडिंग और & मानकों द्वारा आवश्यक है। '' मान्य एचटीएमएल है (और ब्राउजर यूआरएल को 'example.com/? A & b' के रूप में अपेक्षित करेगा)। दूसरी तरफ '' अमान्य है - लेकिन ब्राउज़र शायद वैसे भी डरावनी चीज करेंगे। मामले में, यदि आप अपनी पोस्ट में यूआरएल पर स्रोत देखते हैं, तो आप देखेंगे कि SO गुण में & का उपयोग करता है। –

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