2010-04-12 16 views
6

के लिए भागने के लिए जरूरी है, तो मुझे कैसे पता चलेगा कि मैं CodeIgniter के साथ एक साइट बनाने की प्रक्रिया में हूं। यह पहली साइट है जिसे मैंने स्वयं बनाया है जो डेटाबेस के साथ इंटरैक्ट करता है। मैं इस परियोजना के लिए MySQL का उपयोग कर रहा हूँ। मैं डेटाबेस को सहेजने से पहले डेटा को कैसे बचाना चाहता हूं, यह कैसे बता सकता हूं?माईएसQL

उत्तर

3

आप query bindings साथ database class का उपयोग कर रहे हैं, तो आप किसी भी मैनुअल एस्केपिंग करने के लिए की जरूरत नहीं है:

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

PHP में

:

+0

डाउनवॉटर को कृपया विस्तृत करने की परवाह करें;) हेक, यह है कोडइग्निटर के लिए प्रासंगिक एकमात्र उत्तर। –

+0

मैं मूर्खतापूर्ण दूसरे भाग की वजह से डाउनवॉटेड हूं। यह सवाल और भयानक विचार के लिए अप्रासंगिक है। यदि आपको व्यवसाय तर्क की वजह से डेटा फ़िल्टर करने की आवश्यकता है - ऐसा करें, लेकिन सुरक्षित कुछ करने की कोशिश करने के लिए ऐसा न करें। – zerkms

+0

+1 सही और संदर्भ प्रदान करता है। यह इस तथ्य का भी उपयोग करता है कि प्रश्न पूछने वाला कोडिनिटर –

1

संदेह में, इसे सब से बचें। बहुत सुरक्षित नहीं हो सकता है।

ठीक है, ठीक है। मैं इसे

हमेशा बच

+0

उपयोगकर्ता पर भरोसा न करें। – Josiah

+2

गलत जवाब है। आपका, @ जोशिया भी। उपयोगकर्ता या संदेह प्रासंगिक कुछ भी नहीं है। बिल्कुल कुछ भी प्रासंगिक नहीं है। भागना बिना शर्त प्रक्रिया है। कर्नल श्रापनेल को –

+0

+1। भागने वास्तव में एक सुरक्षा मुद्दा नहीं है, बचाना क्वेरी वैध बनाने का तरीका है। – zerkms

4

खुद के बचने (आप इसे पेंच जाएगा) के बारे में चिंता मत करो मिलता है। एक डीबी परत का उपयोग करें जहां आप पहले कथन तैयार करते हैं, और उसके बाद डेटा जोड़ें।

PHP में आपको PDO का उपयोग करना चाहिए। आप

SELECT * FROM table WHERE key = :key AND value = :value 

और फिर फ़ंक्शन कॉल करके डेटा जोड़ें।

-2

बचने के लिए कब? जैसे ही आपकी साइट सार्वजनिक हो जाती है।

+2

भयानक गलत गलती। सही उत्तर - जैसे ही आप डेटाबेस –

+0

@Col के साथ काम करना शुरू करते हैं, कृपया अपना उत्तर लिखें ताकि हम इसे बेहतर तरीके से +1 कर सकें ;-) (विडंबना नहीं) – zerkms

2

यदि डेटा एक स्ट्रिंग है, तो इसे हमेशा से बच जाना चाहिए।

हालांकि, इसके बजाय पैरामीटर का उपयोग करना बेहतर है।

-1

आप एक MySQL क्वेरी स्ट्रिंग जब स्ट्रिंग के किसी भी उदाहरण के लिए उपयोगकर्ता इनपुट से बना है, से बचने के $ उपयोगकर्ता नाम =; // उपयोगकर्ता इनपुट से

तो मान आपकी क्वेरी स्ट्रिंग है: "(।। $ उपयोगकर्ता नाम") "

आप इस mySQL क्वेरी से बचने के लिए इस तथ्य की वजह $ उपयोगकर्ता नाम चर होता potentionally दूषित कोड हो सकता था जांच table ('उपयोगकर्ता नाम') मान प्रविष्ट करें" ग्राहक द्वारा डाला गया अपने डेटाबेस में इंजेक्शन के लिए।

+0

एक क्वेरी स्ट्रिंग नहीं बल्कि डेटा स्ट्रिंग। नहीं जब कोई भी स्ट्रिंग उपयोगकर्ता इनपुट से बना है, लेकिन सिर्फ ** कोई स्ट्रिंग **। आंकड़े –

8

मैं सलाह देता हूं कि आप तैयार बयानों का उपयोग करने के लिए खुद को आदी करें। खासकर जब से आप डेटाबेस के साथ काम करने के लिए नए हैं। जितनी जल्दी आप इनका उपयोग करना शुरू करते हैं, उतना आसान यह दूसरी प्रकृति बन जाता है।

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

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

यहाँ एक (सरल) PDO उदाहरण है:

$db = new PDO(/* some database parameters */); 
$statement = $db->prepare('INSERT INTO table VALUES(:username, :password)'); 
$statement->bindValue(':username', $dirtyUsername); 
$statement->bindValue(':password', $dirtyPassword); 
$result = $statement->execute(); 
// result checking ommited for brevity 

वहाँ बहुत कुछ के पीडीओ और तैयार बयान के साथ अधिक संभावनाएं है। उदाहरण के लिए आप आसानी से तैयार बयान एक पाश में, इस तरह के रूप पुन: उपयोग कर सकते हैं:

$statement = $db->prepare('INSERT INTO table VALUES(:username, :password)'); 
foreach($users as $dirtyUser) 
{ 
    $statement->bindValue(':username', $dirtyUser->username); 
    $statement->bindValue(':password', $dirtyUser->password); 
    $result = $statement->execute(); 
    // result checking ommited for brevity 
} 

या तो की तरह, निष्पादित विधि के लिए प्लेसहोल्डर बाइंडिंग पारित:

$statement = $db->prepare('INSERT INTO table VALUES(:username, :password)'); 
$result = $statement->execute(array( 
            ':username' => $dirtyUsername, 
            ':password' => $dirtyPassword 
          )); 
// result checking ommited for brevity 

... आदि, आदि

+0

बाध्यकारी की प्रक्रिया से बचने से कोई फर्क नहीं पड़ता है। बाकी ठीक है –

+0

पीडीओ का उपयोग करने के मामले में यह वास्तव में हो सकता है (ठीक है, bindParam() को बिल्कुल कॉल नहीं)। जब ATTR \ _EMULATE \ _PREPARES ध्वज सेट किया जाता है (या मजबूर होता है क्योंकि ड्राइवर सर्वर-पक्ष तैयार कथन का समर्थन नहीं करता है) पीडीओ एक क्वेरी स्ट्रिंग बनाता है जिसमें (बच निकला) पैरामीटर होता है। – VolkerK

1

यदि आप पीडीओ जैसे कुछ का उपयोग करने के बजाय स्वयं को एसक्यूएल उत्पन्न कर रहे हैं, तो आपको हमेशा भागने के तारों को अवश्य करना होगा।

स्ट्रिंग से बचने से SQL भाषा की मूल आवश्यकता होती है। यह आपको सबकुछ खराब होने के बिना स्ट्रिंग में एस्ट्रोफ़ेस या बैकस्लाश जैसे वर्णों का उपयोग करने की अनुमति देता है। ऐसी कोई परिस्थिति नहीं है जिसमें तारों से बचने की आवश्यकता नहीं है।

यहां तक ​​कि गैर-तारों को भी यह सुनिश्चित करने के लिए फ़िल्टर किया जाना चाहिए कि वे वास्तव में गैर-तार हैं।

यदि आप सीख रहे हैं, तो कृपया अपने स्वयं के तारों से बचने के बजाय पीडीओ जैसे कुछ सीखने पर गंभीरता से विचार करें।

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