2010-01-07 18 views
13

क्या उपयोगकर्ता के लिए PHP में $_SERVER['REMOTE_ADDR'] से वापस आने वाले परिणाम को फोर्ज करना संभव है ताकि वे सिद्धांत में डेटाबेस पर SQL इंजेक्शन का उपयोग कर सकें?आईपी पता एसक्यूएल इंजेक्शन

यह थोड़ा गूंगा है, लेकिन मैं अभी भी PHP के लिए पर्याप्त नया हूं कि मैं यह जानना चाहता हूं कि यह किया जा सकता है या नहीं, मुझे SELECT स्टेटमेंट $_SERVER['REMOTE_ADDR'] से लौटाए गए आईपी पते से चुनने के लिए डेटाबेस इनपुट को संतोषित करने की आवश्यकता है या नहीं। । इसलिए, अगर मैं $query = "SELECT * FROM users WHERE IP='" . $_SERVER['REMOTE_ADDR'] . "'"; जैसे कुछ उपयोग करना चाहता था, तो क्या ऐसा करने के लिए मुझे कोई खतरा होगा?

फिर

, शायद एक "nooby" सवाल, लेकिन मैं इसे पूछा जाना चाहिए लग रहा है।

धन्यवाद

उत्तर

16

का उपयोग यह एक खिंचाव, और संभावना नहीं है, लेकिन मैं जहाँ तक यह नामुमकिन है कहने के लिए नहीं जाना होगा। तो ....

किसी भी तरह पैरामीटरयुक्त प्रश्नों का उपयोग करें।

भले ही आप कभी भी आईपी एड्रेस फ़ील्ड के माध्यम से हमला नहीं करते हैं, फिर भी आपको कैशिंग के माध्यम से तेज़ प्रश्नों का अतिरिक्त लाभ मिलेगा।

+0

पैरामीटरयुक्त प्रश्न क्या हैं? क्या आप एक उदाहरण दे सकते हैं? – Cyclone

+3

मैंने उन्हें देखा। धन्यवाद! – Cyclone

+2

आप "अब तक नहीं कहेंगे" = आपको जवाब नहीं पता है। एंड्रयू मैकग्रेगर (नीचे) को पता है कि वह किस बारे में बात कर रहा है। –

5

हमेशा सभी बाहरी आदानों स्वच्छ - mysql_real_escape_string, या बेहतर अभी भी, prepared statements

2

आप PHP के डाटा छनन कार्य इस्तेमाल कर सकते हैं।

filter_var() FILTER_VALIDATE_IP के साथ दूरदराज के आईपी को मान्य होगा। यदि रिमोट आईपी मान्य है, तो इसे एसक्यूएल में इस्तेमाल करें।

संपादित करें: filter_input() INPUT_SERVER साथ एक और विकल्प है,)

http://www.php.net/manual/en/book.filter.php

http://www.php.net/manual/en/filter.filters.validate.php

http://www.php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/function.filter-input.php

आशा इस मदद करता है,

शिमोन

+0

हम किस तरह के प्रदर्शन हिट के बारे में बात कर रहे हैं? क्या यह फ़िल्टर आईपी की जांच के लिए सचमुच इंटरनेट पर जाता है? –

1

मैं हमेशा इस कोड को अपनी सभी परियोजनाओं (कुछ प्रारंभिक इनपुट स्वच्छता) में डालता हूं, ताकि फिक्र आईपी के साथ कुछ बुरा हो सके। मुझे यकीन नहीं है कि वे किसी भी तरह से REMOTE_ADDR नकली कर सकते हैं या नहीं।

function validate_ip($ip) { 
    // Try IPv4 First, as its the most used method right now 
    if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { 
     // Oops... try v6 
     if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { 
      return false; // Sorry... 
     } 
     else { 
      return true; 
     } 
    } 
    else { 
     return true; 
    } 
} 
if(!isset($_SERVER['REMOTE_ADDR'])) # wtf? 
    die("Could not find your IP Address..."); 
else { 
    if(validate_ip($_SERVER["REMOTE_ADDR"])) 
     die("Could not validate your IP Address..."); 
} 
+3

वह '# wtf? 'मुझे हंसते हुए – Cyclone

+0

हाहा सही, मैं उस टिप्पणी के बारे में भूल गया जो मैंने जोड़ा। देर रात 'कोडिंग' (अच्छी तरह से, जागने के लिए कोड के छोटे और सरल टुकड़े लिखना) मुझे भयानक टिप्पणियां लिखने के लिए मजबूर करता है। –

6

मैं किसी $_SERVER['REMOTE_ADDR'] बनाने के लिए एक नकली आईपी पते के साथ एक IP पैकेट के निर्माण के लिए किया जाएगा, जिसमें मामले की प्रतिक्रियाएं कराई होगा (क्योंकि यह सर्वर, ग्राहक नहीं द्वारा निर्धारित है) के लिए एक ही रास्ता लगता है वापस फ्लेक्स पते पर। यदि आप इंजेक्शन हमलों के बारे में चिंतित हैं, तो मुझे लगता है कि आप ठीक हैं क्योंकि आईपी पैकेट में पता फ़ील्ड में केवल पते के लिए जगह है।

+0

मैं सहमत हूं (असल में मैं लिख रहा था जैसा कि आपने पोस्ट किया था)। हालांकि, यह सैद्धांतिक रूप से इंजेक्शन हमलों का प्रयास करने के लिए ठीक रहेगा जो कुछ अन्य प्रवेश मार्ग को सक्षम करेगा (अंधेरे जैसा आपने कहा था), लेकिन यह बहुत ही असंभव है। – Eduardo

1

REMOTE_ADDR ग्राहक द्वारा नहीं भेजी जाती है, यह सर्वर द्वारा निर्धारित है। हालांकि नेटवर्क स्तर पर आईपी पते को खराब करने के लिए तकनीकी रूप से संभव है, हमलावर को अंधा काम करना है। सबसे कठिन हिस्सा sequence number अनुमान लगा रहा है। (कोल्डफ्यूजन के तहत, वैसे, यह another story है।)

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

+1

दिलचस्प, मुझे नहीं लगता था कि यह सभी – Cyclone

+0

पर भी वास्तव में संभव था नोट करें कि आईपी एड्रेस स्पूफिंग एसक्यूएल इंजेक्शन के लिए वेक्टर के रूप में काम नहीं करता है, इसका मतलब है कि आप कुछ REMOTE_ADDR के लिए नहीं जानते हैं कंप्यूटर का पता है अनुरोध भेजा इसके अलावा, अनुमान अनुक्रम संख्या आसान नहीं है। ओपनबीएसडी पर, जो एक यादृच्छिक संख्या से शुरू होता है, यह मूल रूप से असंभव है। – outis

1

दक्षता और सुरक्षा के लिए आप अपने डेटाबेस में आईटी के साथ स्टोर और काम करना चाह सकते हैं।

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

PHP कार्यों को बदलने के लिए ip2long और long2ip देखें, और inet_aton और inet_ntoa इसे MySQL में करने के लिए देखें।

तो, प्रक्रिया की तरह

$user_ip=ip2long($_SERVER['REMOTE_ADDR']); 
if(!$user_ip){ //returned false due to odd input 
    echo 'wtf, yo'; 
    } 
else{ 
    //do your query 
    } 

जा सकता आप कोई IP स्वच्छ सकता है और यह मूल बिंदीदार ट्रैक्टर रूप में दो

$user_ip=long2ip(ip2long($_SERVER['REMOTE_ADDR'])); 
+0

आप अपनी कोडिंग शैली को बेहतर बनाना चाहते हैं। $ _SERVER [REMOTE_ADDR] भयानक है। –

+0

धन्यवाद, किसी कारण से मैंने सोचा कि वे निर्विवाद स्थिरांक या कुछ थे। हां, मुझे उद्धरण शामिल करना चाहिए, इसलिए मैंने अपना जवाब अपडेट कर लिया है। मुझे सच में नहीं लगता कि यह कोडिंग शैली का मामला है। – JAL

9

आप पर भरोसा नहीं कर सकते संयोजन से रखना REMOTE_ADDR सत्य है ... यह अज्ञात प्रॉक्सी या कुछ ऐसी चाल के कारण गलत पता हो सकता है। आप पर भरोसा कर सकते हैं हमेशा यह एक आईपी पता है, इसलिए इस पथ से एसक्यूएल इंजेक्शन असंभव है।

ढेर के नीचे नीचे रास्ता, जिसे आपके सर्वर पर टीसीपी कनेक्शन बनाने वाले पैकेट पर स्रोत पते से परिवर्तित किया गया है। इसका मतलब है ए) इसे एक आईपी पता होना चाहिए और बी) इसे कनेक्शन के लिए ग्राहक को वापस रूट करना होगा।

+1

आईएमओ यह असली जवाब है। अगर मेरे पास हर parametrized प्रश्न उपदेश, एलओएल के लिए एक पैसा था। –

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