2010-08-18 13 views
7

मैंसहायता()

छोड़कर

get_magic_quotes_gpc() 
फ़ाइलों

<form method="post" enctype="multipart/form-data"> 
    <input name="userfile" type="file" id="userfile"> 
</form> 

<?php 
    if (isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) { 
    $fileName = $_FILES['userfile']['name']; 
    $tmpName = $_FILES['userfile']['tmp_name']; 
    $fileSize = $_FILES['userfile']['size']; 
    $fileType = $_FILES['userfile']['type']; 

    $fp  = fopen($tmpName, 'r'); 
    $content = fread($fp, filesize($tmpName)); 
    $content = addslashes($content); 
    fclose($fp); 

    if (!get_magic_quotes_gpc()) { 
    $fileName = addslashes($fileName); 
    } 

    include 'library/config.php'; 
    include 'library/opendb.php'; 

    $query = "INSERT INTO upload (name, size, type, content) ". 
    "VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; 

    mysql_query($query) or die('Error, query failed'); 
    include 'library/closedb.php'; 

अब मैं हर कार्य और php प्रलेखन का उपयोग करके सब कुछ समझ अपलोड करने के लिए एक ट्यूटोरियल से इस PHP कोड तैयार कर रही थी

  • यह क्या है? यह क्या करता है?
  • क्या यह आवश्यक है? यदि हां, तो इसके लिए कोई प्रतिस्थापन है?
  • PHP मैनुअल ने कहा "यह सुविधा PHP 5.3.0 के रूप में अस्वीकृत कर दी गई है। इस सुविधा पर निर्भरता अत्यधिक निराश है।" कृपया विस्तृत करें?
  • (वेब) सर्वर hardisk पर फाइल अपलोड करें और उन्हें करने के लिए लिंक प्रदान करने के लिए एक तरह से वहाँ नहीं है ..
+1

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

+0

अच्छी तरह से अगर मेरे इनपुट (टेक्स्टबॉक्स) में '(उद्धरण) चरित्र के इनपुट को रोकें तो मैं एसक्यूएल इंजेक्शन सुरक्षित करूंगा ... – Moon

उत्तर

15

get_magic_quotes_gpc() एक समारोह है कि विन्यास (php.ini) की जाँच करता है और 0 लौटाता है यदि है magic_quotes_gpc बंद है (अन्यथा यह 1 लौटाता है)।

जब मैजिक_कोट्स पर, सभी '(एकल उद्धरण), "(दोहरे उद्धरण), \ (बैकस्लैश) कर रहे हैं और NULs एक बैकस्लैश स्वचालित रूप से के साथ भाग रहे हैं। यह इंजेक्शन सुरक्षा के मुद्दों के सभी प्रकार को रोकने के लिए है।

आपके मामले में कोड जांचता है कि सेटिंग बंद है और SQL इंजेक्शन को रोकने के लिए सामग्री से ठीक से बचने के लिए स्लेश जोड़ता है।

जैसा कि आपने कहा - यह सुविधा बहिष्कृत है और निश्चित रूप से भविष्य में हटा दी जाएगी (वास्तव में उन्होंने हटा दिया यह PHP6 में)

विकल्प रनटाइम पर डेटा से बचने के लिए आवश्यक है

+0

भयानक .... बेहतर स्पष्टीकरण नहीं दे सका ... आदमी आप – Moon

+1

को समझने के लिए दुनिया के लिए PHP मैनुअल को फिर से लिखना एकमात्र जोड़ है जो यह कहना है कि यह इंजेक्शन सुरक्षा समस्याओं को रोकने की कोशिश करता है। यह बहुत अच्छा काम नहीं करता है (और इसलिए 'mysql_real_escape_string' जैसे कार्यों का कारण)। और दूसरी बात, इसका कभी भी उपयोग न करें ('magic_quotes_gpc')। यदि फ़ंक्शन सत्य लौटाता है (यह सक्षम है), सभी इनपुट पर 'स्ट्रिप्सलाश' चलाएं। फिर या तो अपने पैरा को एक तैयार क्वेरी के माध्यम से बाध्य करें, या 'mysql_real_escape_string/mysqli :: real_escape_string' का उपयोग करें। ** 'magic_quotes_gpc' ** पर भरोसा न करें ... एक कारण है कि इसे बहिष्कृत किया गया है ... (और प्रश्न में पोस्ट किया गया आपका कोड उस के कारण कमजोर है) ... – ircmaxell

+0

आपका मतलब है कि यह सिर्फ एक स्लैश \ ऐसी किसी भी एचटीएमएल इकाई/चरित्र के लिए? –

0

अपनी पोस्ट और सभी उत्तर और टिप्पणियों मुझे लगता है कि इस समारोह में मदद मिल सकती,

function mysql_prep($value) { 
    $magic_quotes_active = get_magic_quotes_gpc(); 
    $new_enough_php = function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0 
    if($new_enough_php) { // PHP v4.3.0 or higher 
     // undo any magic quote effects so mysql_real_escape_string can do the work 
     if($magic_quotes_active) { $value = stripslashes($value); } 
     $value = mysql_real_escape_string($value); 
    } else { // before PHP v4.3.0 
     // if magic quotes aren't already on then add slashes manually 
     if(!$magic_quotes_active) { $value = addslashes($value); } 
     // if magic quotes are active, then the slashes already exist 
    } 
    return $value; 
}