2010-02-22 7 views
12

मैं हैकर्स के समूह के साथ परेशानी में हूं। वे मेरे ग्राहक की साइट कई बार काट दिया, और मेरे मुवक्किल :(अधिक गुस्सा मेरे मुवक्किल अपने डेटाबेस (जो सैकड़ों रिकॉर्ड है) खो दिया है, और अब मैं कुछ और परिचय अनुसरण कर रहा हूँ सब :(SQL इंजेक्शन को रोकने के लिए mysql_real_escape_string का उपयोग कहां करें?

में प्रवेश करने के लिए किया था हो जाता है;

  • तय फाइल अनुमति
  • बदली हुई एफ़टीपी और मेजबान लॉगिन जानकारी
  • को मंजूरी दे दी सभी दूरस्थ mysql तक पहुँचता

अब SQL इंजेक्शन मुद्दे पर काम कर रहे। मैं mysql_real_escape_ जोड़ा व्यवस्थापक पैनल लॉगिन paramaters के लिए स्ट्रिंग। तो मुझे यह mysql_real_escape_string कहां उपयोग करना चाहिए? मेरे पास साइट पर कुछ ईमेल फॉर्म हैं, मुझे नहीं लगता कि मुझे वहां जोड़ने की जरूरत है ...

मेरे पास एक मुख्य पृष्ठ के रूप में index.php है। क्या मुझे index.php?somesql= जैसे यूआरएल के माध्यम से किसी भी एसक्यूएल इंजेक्शन हमले को रोकने के लिए इस पृष्ठ के लिए कुछ भी करना चाहिए?

कृपया मुझे सलाह दें! मैं बहुत सराहना करता हूं !!! :(


उदाहरण के लिए

:।

मैं ऐसे कोड है:

public function showDetails($id) { 

    // SQL Jobs Details 
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id); 
    $this->rst_job = mysql_query($this->sql_job);   
    $this->row_all = mysql_fetch_assoc($this->rst_job);  

    // SQL State 
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']]; 
    $this->rst_state = mysql_query($this->sql_state); 
    $this->row_state = mysql_fetch_assoc($this->rst_state); 
........ 

यह काफी $ आईडी के लिए mysql_real_escape_string उपयोग करने के लिए है के लिए $ इस- नहीं> row_all [$ this-> tbl_jobs ['f4']]

+2

मैं एक एमएसएसएलएल लड़का हूं इसलिए उम्मीद है कि यह लागू होता है - क्यों एक वेब साइट लॉगिन को कुछ हटाने की अनुमति भी होती है? डेटाबेस खोने के लिए, बैकअप कहां हैं ?? –

+1

"चुनें * नौकरियों से जहां id ="। Mysql_real_escape_string ($ id) एसक्यूएल इंजेक्शन के लिए कमजोर है। $ id = "1 या नींद (50)" – rook

+0

रुकने के लिए +1। mysql_real_escape_string एक जादू बुलेट नहीं है, यह केवल एक स्ट्रिंग एस्केपिंग फ़ंक्शन है और केवल उद्धरण के अंदर उपयोग होने पर ही काम करता है। – Cheekysoft

उत्तर

13

असल में, प्रत्येक बार जब आप कुछ असुरक्षित डेटा (उपयोगकर्ता इनपुट, डेटाबेस से मूल्य, फ़ाइल या बाहरी वेबसाइट, यानी कोई डेटा जो आप नहीं हैं 100% सुनिश्चित करें कि यह सुरक्षित है) SQL क्वेरी में, आपको इसे mysql_real_escape_string का उपयोग करके बचाना चाहिए। ध्यान दें कि according to OWASP, यह फ़ंक्शन गतिशील तालिका नामों से बचने के लिए सुरक्षित नहीं है (लेकिन यह "मूल" उपयोगकर्ता इनपुट प्रविष्टि से बहुत कम आम है)।

मेरा सुझाव है कि आप पूरे OWASP article on SQL injection पर एक नज़र डालें और बाकी वेबसाइट ब्राउज़ करें। यह वेब अनुप्रयोगों में सुरक्षा के बारे में जानकारी का एक बड़ा स्रोत है।

आईएमओ, एसक्यूएल इंजेक्शन को रोकने का पसंदीदा तरीका prepared statements का उपयोग करना है।

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

+0

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

+0

आप सही हैं, मैं अपने उत्तरों को अपने परिशुद्धता के साथ अपडेट कर दूंगा। धन्यवाद! – Wookai

3

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

इसके अलावा, भविष्य में गुस्सा ग्राहकों को रोकने के लिए, आपको नियमित रूप से अपने डेटाबेस का बैकअप लेना चाहिए। अगर मैं आपका ग्राहक था, तो मैं अभी क्रोधित होगा।

आपकी साइट को सुरक्षित रखने में शुभकामनाएँ।

+0

उत्तर के लिए धन्यवाद। डीबी से डेटा कॉल करने के बारे में क्या? क्या हम उस मामले में mysql_real_escape_string() का भी उपयोग करेंगे? या एसक्यूएल में चर के लिए jsut डेटाबेस पर जाना है? –

3

एसक्यूएल इंजेक्शन को रोकने का सबसे अच्छा तरीका तैयार कथन और बाध्य चर के उपयोग के साथ है।आप MySQL का किस संस्करण का उपयोग कर रहे हैं? तैयार बयान 4.1 और उच्चतम में उपलब्ध हैं।

3

दो सबसे बड़ी उपयोगकर्ता इनपुट के साथ क्या करना बातें हैं

  1. इनपुट फ़िल्टर करना
  2. आउटपुट पलायन

इनपुट छनन बदलने डेटा/[पहले]/में संग्रहीत है की प्रक्रिया है डेटाबेस। mysql_real_escape_string() निष्पादित करना इस चरण के अंतर्गत आता है (हालांकि डीबी सम्मिलन के लिए उपयोगकर्ता डेटा को स्वच्छ करने के बेहतर तरीके हैं), लेकिन इस चरण में श्वेत-स्थान, असभ्य फ़िल्टरिंग, मार्कअप रूपांतरण आदि शामिल हो सकते हैं।

आउटपुट एस्केपिंग उस उपभोक्ता को उपयोगकर्ता-सामग्री भेजते समय देखभाल कर रही है जिसे आप दुर्भावनापूर्ण व्यवहार की अनुमति नहीं देते हैं। इसका मतलब है htmlentities() या कुछ अन्य चुनिंदा स्क्रीनिंग प्रक्रिया निष्पादित करना।

संसाधनों की थ्रॉटलिंग (डॉस रोकथाम), फॉर्म टोकन (सीएसआरएफ सुरक्षा) आदि जैसे अन्य चीजें आप कर सकते हैं। OWASP पर जाएं और पढ़ना शुरू करें।

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