PHP

2009-02-13 8 views
8

का उपयोग कर MySQL इंजेक्शन सुरक्षा और भेद्यता संकेत MySQL इंजेक्शन से बचाने के सर्वोत्तम तरीके क्या हैं? मुझे कमजोरियों के बारे में क्या देखना चाहिए?PHP

मुझे पता है कि यह क्या है, लेकिन मुझे वास्तव में पता नहीं है कि मैं कितना कमजोर हो सकता हूं। हालांकि मैंने खुद को और मेरे डेटाबेस की सुरक्षा के लिए कदम उठाए हैं (जो मुझे लगता है)।

क्या किसी को रोकने का कोई निश्चित तरीका है?

BTW ... मैं PHP में लिखने :)

उत्तर

15

कथन और वास्तविक पेलोड डेटा को मिश्रित करने के बजाय तैयार बयान का उपयोग करें।

आप एक रूपरेखा है कि आप उपकरण पीएचपी sanitizing के साथ प्रदान करता है का उपयोग नहीं कर रहे हैं

तुम भी http://shiflett.org/articles/sql-injection और http://shiflett.org/blog/2007/sep/the-unexpected-sql-injection

1

आप सभी इनपुट को साफ़ करने में है। आप यह कैसे कर सकते हैं प्रोग्रामिंग languaguage और/या ढांचे पर निर्भर करता है जिसके साथ आप काम कर रहे हैं।

संपादित करें:

आप php समारोह आप के लिए ($ स्ट्रिंग) mysql_real_escape_string है देख रहे हैं प्रयोग कर रहे हैं। आपको क्लाइंट से प्राप्त होने वाली हर चीज़ पर इसका उपयोग करना चाहिए जो डेटाबेस में जाना चाहिए।

+0

अस्पष्ट होने के लिए खेद है ... मैं PHP – johnnietheblack

+2

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

+1

यह कहकर, अगर आपको भागने का उपयोग करना चाहिए (जिसका अर्थ है mysqli_ * किसी भी कारण से प्रश्न से बाहर है), mysql_real_escape_string वास्तव में जाने का तरीका है। –

1

में रुचि हो सकती स्ट्रिंग एस्केपर में बनाया गया है, आपको वहां से शुरू करना चाहिए। आप उस within the PHP docs for mysql real escape string पर प्रलेखन पा सकते हैं। यदि आप उदाहरण तीन को देखते हैं तो आपको मूलभूत बातें का अच्छा विचार मिल जाएगा।

एक अन्य विधि जिसका मैं पालन करता हूं यह सुनिश्चित करने के लिए है कि मैं चर जहां चर लगाता हूं। उदाहरण के लिए अगर मैं एक उपयोगकर्ता से इनपुट की उम्मीद कर रहा हूँ एक पूर्णांक मैं करूँगा होने के लिए निम्नलिखित:

$age = (int)$age; 

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

0

एक संकेत है कि आपको कोई समस्या हो सकती है, तो उपयोगकर्ता इनपुट सीधे ले जायेगा और इसे आपके SQL कमांड में डाल देगा।

उदाहरण के लिए आप उनके उपयोगकर्ता नाम के लिए पूछते हैं। यदि आप इसे लेते हैं और फिर बस

"उपयोगकर्ताओं से चुनें * उपयोगकर्ता नाम = '$ USERNAME';"

उपयोगकर्ता तब "जॉय", ड्रॉप टेबल ... "और इसी तरह जोड़ सकता है।

पर्ल में आप कह सकते हैं कुछ

my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);"); 
$sth2->execute($Hostname,$myDate,$Status); 

तरह अमल विधि फिर ऊपर इस तरह के एक के रूप में कारनामों के लिए देखने के लिए और इसे ठीक से बच जाएगा।

0

मैं किसी भी कोड (MySQL क्वेरी, डेटा डिस्प्ले इत्यादि) में इसका उपयोग करने से पहले सभी इनपुट पर इस PHP फ़ंक्शन का उपयोग करता हूं। यह शायद पूरा नहीं हुआ है, लेकिन इसे सिस्टम को हैकिंग पर सभी बुनियादी प्रयासों को रोकना चाहिए:

//$linkID is the link ID of the connection to the MySQL database 
function clean_input($input) 
{ 
    GLOBAL $linkID; 
    if(get_magic_quotes_gpc()) 
    { 
     //Remove slashes that were used to escape characters in post. 
     $input = stripslashes($input); 
    } 
    //Remove ALL HTML tags to prevent XSS and abuse of the system. 
    $input = strip_tags($input); 
    //Escape the string for insertion into a MySQL query, and return it. 
    return mysql_real_escape_string($input,$linkID); 
} 
8

कोई भी ट्रस्ट नहीं!

मान्य इनपुट के सभी इनपुट - filter_var() या regexes या in_array() मान्य मानों या डेटाटाइप के आधार पर एक मिश्रित रणनीति को स्वच्छ करें।

"इनपुट" का मतलब इनपुट का कोई भी स्रोत है जिसका आप सीधे नियंत्रण नहीं करते हैं - न केवल फॉर्म! कुछ भी है कि दागी जा रही की किसी भी संभावना हो सकती है -

कुछ भी आप $_GET, $_POST, $_SESSION, $_COOKIE से वापस पाने साफ करता।

और

उपयोग तैयार बयान

+0

$ _SESSION? क्या वह डेटा सर्वर पर संग्रहीत, लिखा और पढ़ा नहीं गया है? –

+2

यूप। और कई साइट होस्ट किए गए साझा सर्वर पर हैं ... किसी पर विश्वास नहीं करें। – PartialOrder

1

यह commonsense की तरह लग सकता है, लेकिन मैं थोड़ी देर के लिए उस पर ऊपर फिसल गया था।

वहाँ एक अंतर है एन्कोडिंग और के बीचhtmlentities()mysql_real_escape_string() बचने। मैं उनके बारे में काफी अदला-बदली सोच रहा था। हालांकि वहां नहीं ... क्योंकि कॉमन्सेंस आपको बताएगा। :) आमतौर पर उन्हें पहले एन्कोड जैसे लागू करने के लिए सबसे अच्छा है, फिर से बचें।

फिर डेटा को खींचते समय प्रक्रिया को उलट दें, अनदेखा (यदि आवश्यक हो) तो अनएकोड करें। ध्यान दिए जाने के तरीके में विशिष्ट होने के नाते नोट (और उलट) बहुत सारे सिरदर्द और डबल-एस्केपिंग दुःखों को बचाएगा।