2012-01-06 15 views
5

में कोड को सुरक्षित रूप से कैसे सम्मिलित करें मैं एक वेबसाइट बना रहा हूं जहां उपयोगकर्ता PHP स्निपेट्स को PHP और एक MySQL डेटाबेस का उपयोग कर स्टोर कर सकते हैं। लेकिन मैं यह नहीं समझ सकता कि मेरे डेटाबेस में उपयोगकर्ता इनपुट कोड को सुरक्षित रूप से कैसे सम्मिलित किया जाए। मैं सामान्य रूप से उपयोग किए जाने वाले 'सुरक्षा' कार्यों के साथ इनपुट को बदल नहीं सकता (trim, stripslashes, आदि) क्योंकि पूरा बिंदु यह है कि आप कोड को डेटाबेस में इनपुट के रूप में देख सकते हैं। मैंने my_real_escape_string() पर देखा है लेकिन मैंने देखा है कि यह % और _ से बच नहीं है, जिसका उपयोग MySQL वाइल्डकार्ड के रूप में किया जा सकता है। क्या यह खतरा पैदा करता है, या क्या मैं सिर्फ my_real_escape_string का उपयोग कर सकता हूं? अग्रिम में Thanx।mySQL डेटाबेस

+0

['addcslashes'] (http://php.net/addcslashes) सामान्य रूप से 'बचने' अभिव्यक्तियों के लिए मुखौटा प्लेसहोल्डर्स को सामान्य बचने या पैरामीटर बाध्यकारी के अतिरिक्त उपयोग किया जाता है। – mario

+0

ट्रिम/स्ट्रिप्सलाश सुरक्षा कार्य नहीं हैं। अतिरिक्त स्थान एसक्यूएल में कभी भी चिंता नहीं करता है, जब तक कि आप निश्चित-लंबाई वाले टेक्स्ट/स्ट्रिंग फ़ील्ड में डेटा खोने के बारे में चिंतित न हों। स्ट्रिप्सलाशस PHP के शुरुआती दिनों से कचरे का एक मूर्ख ब्राइंडेड टुकड़ा है जब जादू_क्वाट भूमि का राजा था। –

+0

पिछले स्टैक ओवरफ्लो प्रश्न जो आपके प्रश्न का उत्तर दे सकते हैं: http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php http://stackoverflow.com/questions/4461759/parameterized -queries –

उत्तर

6

वाइल्डकार्ड केवल SELECT प्रश्नों में उपयोग किए जाने पर प्रभावी होते हैं और फिर केवल कुछ फ़ंक्शंस का उपयोग करते समय। तो कोड डालने के लिए mysql_real_escape_string() का उपयोग करना ठीक होगा क्योंकि उनके पास कोई प्रभाव नहीं पड़ेगा।

इसे बेहतर बनाने के लिए मैं आपको सलाह दूंगा कि आप PHPs PDO का उपयोग करें ताकि आप पैरामीटर बाइंडिंग का उपयोग कर सकें। निम्न उदाहरण the PHP manual से है:

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
1

पैरामीटरयुक्त डालने का कथन का उपयोग करें। असल में, अपने चयन और अपडेट के लिए भी पैरामीटर का उपयोग करें।

यह स्वचालित रूप से आपके लिए इन चीजों को संभालेगा।

+1

नीचे वोट क्यों? –

+2

मेरा डाउनवोट नहीं है, लेकिन यह तर्कसंगत रूप से ओपी के प्रश्न का उत्तर नहीं है। इसके अलावा आप यह नहीं समझ रहे हैं कि कौन सी लाइब्रेरी का उपयोग करना है –

0

का उपयोग पीडीओ:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('INSERT INTO fruit(name, colour, calories) VALUES(?, ?);'); 
$sth->execute(Array($calories, $colour)); 
4

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

पूर्णांक मान के लिए, आप या तो मान्य है कि क्या वे वास्तव में नंबर दिए गए हैं, या उन्हें उद्धरण में रैप करने के लिए की जरूरत है:

$intValue = mysql_real_escape_string($_POST["intValue"]); 
$query = mysql_query("INSERT INTO table SET intValue ='$intValue'"); 
                 // note the quotes 

उद्धरण के बिना, mysql_real_escape_string() संख्यात्मक मान पर बेकार है!

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

0

यह मेरे लिए काम करता है, [adscript] एक कोड स्निपेट है।

<textarea rows="6" cols="80"><input name="adscript" type="text/javascript" class="text-input textarea" id="adscript" value="<?php echo htmlentities($row['adscript']);?>" size="80" height="40" maxlength="1000"></textarea> 
संबंधित मुद्दे