2010-08-25 16 views
5

के साथ $ _POST [...] को बड़े पैमाने पर कैसे बदलें, मैं वर्तमान में एक ग़लत XSS हमले से ठीक हो रहा हूं, और महसूस किया कि मैंने कभी भी कई रूपों पर इनपुट को संचरित नहीं किया है मेरी साइट। मैंने अपनी सभी PHP फ़ाइलों में $_POST की खोज करने के लिए नोटपैड ++ की फ़ाइलों में खोजें सुविधा का उपयोग किया, और लगभग 5,000 परिणाम प्राप्त हुए। अब, मैं वास्तव में नहीं जाना चाहता हूं और उन परिणामों में से प्रत्येक को मैन्युअल रूप से strip_tags जोड़ना नहीं चाहता हूं, लेकिन एक प्रतिस्थापन-सभी चाल नहीं करेंगे ... और जब मैं नियमित अभिव्यक्तियों की बात करता हूं तो मैं कुल नोब हूं ।

क्या यह थोड़ा कम कठिन बनाने का कोई तरीका है?

उत्तर

2

आप एक फ़ाइल में इस डाल सकते हैं (उदाहरण के लिए safe.php)

foreach ($_POST as $key => $value) { 
    $_POST[$key] = is_array($key) ? $_POST[$key]: strip_tags($_POST[$key]); 
} 

फिर अपने php फ़ाइलें के हर प्रत्येक में require_once("safe.php"); डाल (या एक फ़ाइल पहले से ही शामिल अपने php फ़ाइल के सभी कि)
यह एक बदसूरत हैक .. लेकिन यह आपके समय को बचा सकता है।

+0

बहुत बढ़िया।यही वह है जिसकी तलाश में मैं हूं। –

+0

यह एक्सएसएस से रक्षा करने में विफल रहेगा जब फॉर्म फ़ील्ड हैं जैसे 'foo [bar] 'या' foo [] 'जो PHP स्वचालित रूप से सरणी में परिवर्तित हो जाते हैं। – Tgr

+0

@Tgr: हाँ, यह पूरी तरह विफल हो जाएगा जैसा कि आपने कहा था, लेकिन मुझे लगता है कि उसे – w00d

6

हम्म, मुझे लगता है कि array_walk_recursive चाल करना होगा:

function custom_strip(&$val, $index) { 
    $val = strip_tags($val); 
} 
array_walk_recursive($_POST, 'custom_strip'); 
0

बहुत ही सरल। अपने हर फ़ाइल के शीर्ष पर या जो हर बार बहुत शुरुआत में कहा जाता हो जाता है एक आम हेडर फाइल में इस रखो:

function mystriptag(&$item) 
{ 
    $item = strip_tags($item); 
} 

array_walk($_POST, mystriptag); 
+0

की आवश्यकता के हिसाब से अनुकूलित करने का विचार मिला है, यह एक्सएसएस से रक्षा करने में विफल रहेगा जब फॉर्म फ़ील्ड हैं जैसे 'foo [bar]' या 'foo []' जो PHP स्वचालित रूप से सरणी में परिवर्तित हो जाता है। – Tgr

18

बस array_map() का उपयोग करें।

$Clean = array_map('strip_tags', $_POST); 

या आप यह $_POST चर के लिए वापस जाना चाहते हैं:

$_POST = array_map('strip_tags', $_POST); 

यह शायद एक बेहतर विचार है, हालांकि एक अलग चर का उपयोग और आपकी फ़ाइलों में $Clean को $_POST के सभी घटना को बदलने के लिए।

0

आप कर सकते थे बस array_mapstrip_tags$_POST है, लेकिन यह इसे से डेटा प्राप्त करने के लिए एक कस्टम समारोह लिखने के लिए बहुत अच्छे है:

function post_data($name) { 
    global $post_cache; 
    if (in_array($name, $post_cache)) { 
     return $post_cache[$name]; 
    } 
    $val = $_POST[$name]; 
    if (is_string($val)) { 
     $val = strip_tags($val); 
    } else if (is_array($val)) { 
     $val = array_map('strip_tags', $val); 
    } 
    $post_cache[$name] = $val; 
    return $val; 
} 

यह आपके कोड अधिक पठनीय कर देगा (इस पर ध्यान देने दूसरों आम तौर पर मान लेंगे कि $_POST['foo'] फॉर्म फ़ील्ड foo में डेटा है, कुछ ऐसा नहीं जो आपने पहले ही प्रीप्रोसेस्ड किया है), आपको प्लगइन या लाइब्रेरीज़ के साथ समस्याएं नहीं मिलेंगी जो सीधे $ _POST तक पहुंचने का प्रयास करती हैं, $_POST प्रीप्रोकैसिंग पर अधिक तर्क जोड़ने में आसान बनाता है (magic quotes सक्षम हैं एक आम है) सभी जगहों को शिकार किए बिना आपके कोड में जहां आपने POST डेटा का उपयोग किया है, और आपको बड़े सिरदर्द से बचाता है जब आपको पता चलता है कि कुछ पोस्ट फ़ील्ड हैं जहां आपको HTML टैग की आवश्यकता है। आम तौर पर, किसी भी superglobals को सीधे बदलने के लिए यह वास्तव में एक बुरा विचार है।

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

<div class="user_photo"> 
    <img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" /> 
</div> 

का उपयोग तो $user_name एक XSS हमले वेक्टर है, और strip_tags बिल्कुल इसके खिलाफ मदद नहीं करता है, उदाहरण के लिए विभिन्न तरीकों की आवश्यकता होगी,; आपको htmlspecialchars की आवश्यकता होगी। यदि उपयोगकर्ता डेटा को यूआरएल के रूप में प्रयोग किया जाता है, तो आपको javascript: यूआरएल और अन्य के खिलाफ बचाव करने के लिए अभी तक एक और तरीका चाहिए।