2010-03-09 8 views
7

PHP में, मुझे पता है कि parameterized queries का उपयोग एसक्यूएल इंजेक्शन को रोकने का सबसे अच्छा तरीका है।PHP: प्रदर्शित जानकारी के लिए सर्वोत्तम सुरक्षा प्रथाओं?

लेकिन क्या sanitizing उपयोगकर्ता इनपुट, जैसे कि अन्य प्रयोजनों के लिए उपयोग किया जाएगा के बारे में:

  • एक उपयोगकर्ता (संभावित क्रॉस-साइट स्क्रिप्टिंग वेक्टर)
  • वापस करने के लिए प्रदर्शित एक ई-मेल को संबोधित करते या में भरने संदेश निकाय

htmlentities() गैर-डेटाबेस उपयोग के लिए sanitize करने का सबसे अच्छा तरीका है? यहां सबसे अच्छा अभ्यास माना जाता है?

उत्तर

5

PHP में सबसे अच्छा XSS फिल्टर है:

htmlspecialchars($_POST['param'],ENT_QUOTES); 

कारण है कि आप भी उद्धरण सांकेतिक शब्दों में बदलना करने के लिए है क्योंकि आप> < की जरूरत नहीं है फायदा उठाने के लिए कुछ XSS है। उदाहरण के लिए इस XSS की चपेट में है:

$_REQUEST[xss]='" onMouseOver="alert(/xss/)"'; 

ENT_QUOTES: आप < की जरूरत नहीं है> इस मामले में जावास्क्रिप्ट निष्पादित करने के लिए है क्योंकि आप onmouseover उपयोग कर सकते हैं

print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>'); 

, यहां एक उदाहरण हमला है डबल कोट्स का ख्याल रखता है।

ई-मेल थोड़ा अलग है, जावास्क्रिप्ट मेल क्लाइंट द्वारा निष्पादित नहीं किया जाना चाहिए, और यदि ऐसा है तो आपकी साइट समान उत्पत्ति नीति के कारण प्रभावित नहीं होती है। लेकिन सुरक्षित पक्ष पर रहने के लिए मैं अभी भी htmlspecialchars($var,ENT_QUOTES); का उपयोग करूंगा। फिर भी, PHP का मेल() फ़ंक्शन एक अलग प्रकार की भेद्यता के लिए मर सकता है, जिसे सीआरएलएफ इंजेक्शन कहा जाता है। PHP-Nuke के खिलाफ एक उदाहरण भेद्यता यहां दी गई है। यदि आपके पास फ़ंक्शन कॉल है: mail($fmail, $subject, $message, $header); फिर आपको यह सुनिश्चित करना होगा कि कोई उपयोगकर्ता \r\n $ हेडर में इंजेक्ट नहीं कर सकता है।

कमजोर कोड:

$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP"; 

समझौता:

$_GET[name]=str_replace(array("\r","\n"),$_GET[name]); 
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP"; 
+0

इस तरह के "छेद" को खोजने के लिए किसी भी स्वचालित परीक्षण है? – Kirzilla

+0

आपका दिमाग, और आपके हाथ। लेकिन अगर आप Google के आस-पास कुछ हैं, तो http://www.acunetix.com/ से एक अच्छा है (लेकिन मेरा दिमाग बेहतर है) लेकिन यह मुफ़्त नहीं है। –

+0

Acunetix द्वारा मुफ्त xss स्कैनर का उपयोग करें: http://www.acunetix.com/cross-site-scripting/scanner.htm यह अजीब प्रकार के xss के लिए परीक्षण करेगा, जैसा कि मेरे उदाहरण में से एक है। – rook

1

वैसे आप पहले कुछ क्षेत्रों के लिए नियम बना सकते हैं, जैसे ईमेल केवल एक चीज यह होनी चाहिए अक्षर, संख्या, @ (कम है -सिंबोल? इसे वास्तव में क्या कहा जाता है), और एक अवधि, इसलिए आप उसमें से एक एक्सएसएस नहीं बना सकते हैं इसलिए htmlentities() या htmlspeicalchars() का उपयोग करके संसाधनों को बर्बाद करने की आवश्यकता नहीं है।

2

आप एचटीएमएल शोधक को भी देखना चाहते हैं जो किसी भी खतरनाक HTML को पट्टी कर देगा और सुरक्षित इनपुट पर छोड़ देगा। आप एचटीएमएल को अनुमति देने/अस्वीकार करने के लिए अपने नियम भी बना सकते हैं।

http://htmlpurifier.org/

+0

अरे, मैं इसे पोस्ट करने वाला था। –

0

नहीं है,

1) तैयार बयान एसक्यूएल इंजेक्शन के लिए एक समाधान नहीं हैं। ज्यादातर मामलों में तैयार बयानों में परिवर्तनीय बाध्यकारी और इसलिए पारदर्शी भागने का संकेत मिलता है जो एसक्यूएल इंजेक्शन को रोकने के लिए एक प्रभावी तरीका है।

2) आप इनपुट को संचरित नहीं करते हैं - आप आउटपुट को sanitize। हर तरह से इनपुट प्रमाणित करें (उदाहरण के लिए सुनिश्चित करें कि प्रारंभ तिथि समाप्ति तिथि से पहले आती है), लेकिन डेटा का पुनर्वितरण केवल उस बिंदु पर बदला जाना चाहिए जहां यह आपके PHP कोड को छोड़ देता है। एचटीएमएल में सीधे लिखे गए डेटा को स्वच्छ करने की विधि अलग है कि आप यूआरएल में लिखे गए डेटा को कैसे स्वच्छ कर सकते हैं, यह अलग है कि आप इसे जावास्क्रिप्ट स्ट्रिंग वेरिएबल में लिखने के लिए डेटा को कैसे स्वच्छ करते हैं, यह अलग है कि आप एसक्यूएल कथन में सम्मिलन के लिए डेटा को कैसे स्वच्छ करते हैं, मॉडेम को भेजने से पहले डेटा को सैनिटाइज करने से अलग ...

... आप क्या करने जा रहे हैं? डेटा के हर संभव प्रतिनिधित्व बनाएँ? डेटा का सार्वभौमिक पुनर्निर्माण बनाएँ?

http://xkcd.com/327/

सी

+1

कुछ बाल विभाजित करने का तरीका। यदि आप मॉडेम को भेजे जाने वाले डेटा को स्वच्छ करने के तरीकों का सुझाव देना चाहते हैं, तो यह वास्तव में इस चर्चा के लिए कुछ सार्थक योगदान देगा। –

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