PHP

2011-05-31 5 views
15

का उपयोग कर फ़ाइल करने के लिए JSON डेटा को सुरक्षित रूप से कैसे लिखें, मुझे छवियों को संपादित करने के लिए HTML फॉर्म मिला है। सभी डेटा JSON में संग्रहीत है। जब मैं वर्तमान छवि बदलता हूं, तो मैं एक पाठ फ़ाइल में PHP स्क्रिप्ट के माध्यम से परिवर्तनों को सहेजना चाहता हूं। अगर मैं पिछली छवि पर वापस आ जाता हूं, तो यह कॉन्फ़िगरेशन फिर से इस फ़ाइल से फ़ॉर्म में भेज दिया जाएगा।PHP

मेरा प्रश्न है:

कैसे लिखने के लिए/इस प्रकार का डेटा सुरक्षित रूप से पढ़ें। कुछ जेएस/पीएचपी कोड इंजेक्शन को रोकने के लिए डेटा कहां और कैसे प्रभावी ढंग से जांचते हैं?

मैंने नीचे कुछ अवधारणा कोड संलग्न किया है:

जावास्क्रिप्ट (का उपयोग कर jQuery):

// Writing 
$.ajax({ 
    global: false, 
    type: "POST", 
    cache: false, 
    dataType: "json", 
    data: ({ 
     action: 'write', 
     config: JavaScriptJSON_Obj 
    }), 
    url: 'read-write.php' 
}); 

// Reading 
$.ajax({ 
    global: false, 
    type: "POST", 
    cache: false, 
    dataType: "json", 
    data: ({ 
     action: 'read' 
    }), 
    url: 'read-write.php', 
    success: function(data){ 
     JavaScriptJSON_Obj = data; 
    } 
}); 

पीएचपी उदाहरण (पठन-write.php):

switch ($_REQUEST['action']) { 
    case 'write': 
     file_put_contents('config.txt', $_REQUEST['config']); 
     break; 
    case 'read': 
     $s = file_get_contents('config.txt'); 
     echo json_encode($s); 
     break; 
} 
+0

** जावास्क्रिप्ट जेएसओएन_ओबीजे ** के साथ क्या किया जा रहा है, इस पर निर्भर करता है। यह संभावित रिमोट फ़ाइल के लिए दरवाजा खोल सकता है। – inquam

+1

बस इसे टेक्स्टुअल डेटा के रूप में सहेजें और फिर इसे टेक्स्टुअल डेटा के रूप में लोड करें। असुरक्षित कुछ भी नहीं है। केवल एक चीज जिस पर आपको विचार करना चाहिए - पहुंच अधिकार। आपको इस जानकारी को उस निर्देशिका में संग्रहीत करना चाहिए जो ब्राउज़र के माध्यम से सीधे पहुंच योग्य नहीं है (यही कारण है कि आपके पास * पढ़ने * 'config.txt' के लिए 'read-write.php' है)। आप डीबी में इस डेटा को संग्रहीत करने पर भी विचार कर सकते हैं। – binaryLV

उत्तर

5

सबसे पहले : जेएसओएन जावास्क्रिप्ट नहीं है और इसके विपरीत। और JSON जावास्क्रिप्ट का उचित सबसेट भी नहीं है।

इसके अलावा, चूंकि आप कुछ उपयोगकर्ता इनपुट को PHP के रूप में नहीं समझते हैं और न ही जावास्क्रिप्ट के रूप में कुछ आउटपुट, चिंता करने की कोई आवश्यकता नहीं है। लेकिन अपने आउटपुट को सही तरीके से निर्दिष्ट करना न भूलें:

header('Content-Type: application/json;charset=utf-8'); 
$s = file_get_contents('config.txt'); 
echo json_encode($s); 
+2

मैंने कभी नहीं कहा है कि JSON जावास्क्रिप्ट है। मुझे अंतर पता है। यह लगभग यह कहने की तरह है कि PHP एक सरणी है :) –

+1

ठीक है, कुछ मामलों में यह संभावित रूप से असुरक्षित हो सकता है। उदा।, डेटा को '$ _SERVER ['DOCUMENT_ROOT'] नाम की फ़ाइल में संग्रहीत किया जा सकता है। '/ data.php'', जिसे 'http: // example.com/data.php' तक पहुंचकर निष्पादित किया जा सकता है।हालांकि, उपयोगकर्ता को फ़ाइल का नाम जानना होगा और फ़ाइल * सर्वर * द्वारा निष्पादन योग्य होनी चाहिए। (.txt फ़ाइलें आमतौर पर * निष्पादन योग्य नहीं हैं *)। – binaryLV

0

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

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

+0

जहां तक ​​मुझे पता है, एमआईएम की जांच करना असुरक्षित है क्योंकि इसे बिल्कुल जांच नहीं रहा है। यदि आप यह सुनिश्चित करना चाहते हैं कि "छवि" वास्तव में एक छवि है, तो आपको डेटा की संरचना की जांच करनी चाहिए, न कि कुछ टेक्स्ट जानकारी जो फ़ाइल नाम के विस्तार का प्रतिनिधित्व करती है। – binaryLV

+0

नहीं, ज़ाहिर है ... एमआईएमई सिर्फ एक पहला कदम है। यदि वह बंद है तो यह पूरी तरह से एक छवि नहीं है। लेकिन फिर आप यह सुनिश्चित करने के लिए छवि को वास्तव में लोड करने का प्रयास कर सकते हैं कि यह एक वैध छवि है। – inquam

+0

ओपी जेएसओएन डेटा स्टोर करने की कोशिश कर रहा है, छवियों या पूर्णांक नहीं। –

6

आपके कोड के साथ समस्या यह है कि यह काम नहीं करेगा, सुरक्षा मुद्दों को एक तरफ। आपको डेटा को क्रमबद्ध करना होगा, या इसे फ़ाइल में संग्रहीत करने से पहले इसे जेसन में एन्कोड करना होगा, यानी। इस तरह:

switch ($_REQUEST['action']) { 
    case 'write': 
     file_put_contents('config.txt', json_encode($_REQUEST['config'])); 
     break; 
    case 'read': 
     readfile('config.txt'); 
     break; 
} 

इस तरह serialising काम करता है:

switch ($_REQUEST['action']) { 
    case 'write': 
     file_put_contents('config.txt', serialize($_REQUEST['config'])); 
     break; 
    case 'read': 
     $data = unserialize(file_get_contents('config.txt')); 
     echo json_encode($data); 
     break; 
} 

जब तक आप यह सुनिश्चित करें कि पथ आप पढ़ने/लिखने के लिए सही है, इस कोड के साथ कोई कोड इंजेक्शन समस्याओं कर रहे हैं। एकमात्र संभावित समस्या यह है कि यदि आप चुन सकते हैं कि कौन सी फ़ाइल का उपयोग करना है (कोड में हार्डकोड "config.txt" के बजाय)। फिर आपको यह सुनिश्चित करने के लिए मान्य करना होगा कि फ़ाइल किसी दिए गए निर्देशिका आदि में है।

+0

@ जैकोब, इसे इंगित करने के लिए धन्यवाद। Serialization, मेरे मामले में, जरूरत नहीं है। मैं केवल पाठ और संख्या जैसे साधारण डेटा स्टोर करूंगा। –

+0

ओह, तो मैंने गलत समझा। मैंने सोचा था कि 'जावास्क्रिप्ट जेएसओएन_ओबीजे' एक मनमाना जावास्क्रिप्ट ऑब्जेक्ट या सरणी के लिए प्लेसहोल्डर था। –

+0

वास्तव में, मेरी जेएस लिपि के तहत, 'जावास्क्रिप्ट जेएसओएन_ओबीजे' एक वस्तु है, लेकिन केवल सुविधा के लिए। –