निषिद्ध त्रुटि फेंक Res.sendfile व्यक्त करें


160

मेरे पास यह कोड है:

res.sendfile( '../../temp/index.html' )

हालाँकि, यह इस त्रुटि को फेंकता है:

Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)

क्या कोई मुझे बता सकता है कि ऐसा क्यों हो सकता है?


3
मेरा मानना ​​है कि यह सापेक्ष पथ के कारण है; "../" को दुर्भावनापूर्ण माना जाता है। पहले स्थानीय पथ को हल करें, फिर कॉल करेंres.sendfile
जो

आप स्थानीय रास्ता कैसे तय करते हैं?

4
path.resolveआपको जो चाहिए वो करना चाहिए।
जो

1
यही किया। एक उत्तर के रूप में अतीत करना चाहते हैं?

जवाबों:


286

मेरा मानना ​​है कि यह सापेक्ष पथ के कारण है; "../" को दुर्भावनापूर्ण माना जाता है। पहले स्थानीय पथ को हल करें, फिर कॉल करें res.sendfile। आप path.resolveपहले से ही रास्ता तय कर सकते हैं ।

var path = require('path');
res.sendFile(path.resolve('temp/index.html'));

31
अधिक जानकारी यहाँ मेरे लिए newbies के लिए उपयोगी होगी
एडम वाइट

5
एक्सप्रेस सापेक्ष रास्तों sendfileको बुरा मानता है । जब तक आप rootनिर्देशिका पैरामीटर निर्दिष्ट नहीं करते , जैसा कि यहां देखा गया है: github.com/visionmedia/express/issues/1465
जो '

2
var path = आवश्यकता ('path');
मैट हैरिसन

1
हाँ अंतिम कोडे !!
सुपरब्यूडरड्यूपर

2
@MattHarrison ES6 अद्यतन, संकुल आयात के लिए, constअधिक पसंद किया जाता हैvar
Nino Filiu

39

यह उत्तर अन्य उत्तरों / टिप्पणियों से जानकारी एकत्र करता है।

यह निर्भर करता है कि आप प्रक्रिया कार्य निर्देशिका (cwd) या फ़ाइल निर्देशिका के सापेक्ष कुछ शामिल करना चाहते हैं या नहीं। दोनों path.resolveफ़ंक्शन का उपयोग करते हैं ( var path = require('path')फ़ाइल के शीर्ष पर रखा जाता है।

  • cwd के सापेक्ष: path.resolve('../../some/path/to/file.txt');
  • फ़ाइल के सापेक्ष: path.resolve(__dirname+'../../some/path/to/file.txt');

@ जो की टिप्पणी से लिंक को पढ़ने से, ऐसा लगता है कि यदि आप पथ के लिए उपयोगकर्ता इनपुट को स्वीकार करते हैं तो रिश्तेदार पथ एक सुरक्षा जोखिम हैं (उदाहरण के लिए sendfile('../.ssh/id_rsa')हैकर की पहली कोशिश हो सकती है)।


1
एक नौसिखिया के रूप में मैं जानना चाहता हूं कि हैकर परिदृश्य यहां कैसे आया?
भरथ मप्पा

2
यदि आप गलती से उपयोगकर्ता को उस फ़ाइल का पथ इनपुट करने की अनुमति देते हैं जिसे वे डाउनलोड करना चाहते हैं, तो वे आपके सिस्टम पर कोई भी फ़ाइल डाउनलोड कर सकते हैं (मैंने एक ssh निजी कुंजी का उदाहरण दिया - जो उन्हें आपके पीसी होने का ढोंग करने की क्षमता देगा ( आदमी-में-बीच आदि))। होने के बाद .. प्रतिबंध इस संभावना को अस्वीकार कर देता है क्योंकि वेबसाइट से केवल फ़ाइलों तक ही पहुँचा जा सकता है।
derekdreery 14

30

एक्सप्रेस प्रलेखन यह एक अलग तरह से कर रही है पता चलता है, और मेरी राय में इसे और अधिक समझ में बाद में वर्तमान समाधान की तुलना में आसान बनाता है।

res.sendFile('index.html', {root: './temp'});

रूट विकल्प ./को आपकी परियोजना की मूल निर्देशिका के रूप में सेट किया गया लगता है । इसलिए मैं पूरी तरह से नहीं बता सकता कि आप फ़ाइल कहाँ प्रोजेक्ट रूट के संबंध में है, लेकिन अगर आपका अस्थायी फ़ोल्डर है, तो आप ./tempजिस फ़ाइल को भेज रहे हैं, उसके लिए रूट के रूप में सेट कर सकते हैं।


1
यह सच है, लेकिन यह ओपी का उपयोग कर रहे पुराने सेंडफाइल के बजाय सेंडफाइल (पूंजी एफ, एक्सप्रेस v4.8.0 द्वारा आगे) का उपयोग करता है। बस कह रहा है ... =]
रेमीएनएल

आह… अच्छी पकड़ है। मैंने इस छोटे अंतर पर ध्यान नहीं दिया। मुझे यह भी आश्चर्य है कि यदि चयनित उत्तर काम नहीं करता है क्योंकि यह उपयोग करता है .sendfileलेकिन क्योंकि यह पूरी तरह से (पथ) पर निर्भर करता है। इस पर ध्यान दिलाने के लिए धन्यवाद।
तेन 528 15

सिंपल एंड एफिशिएंट। धन्यवाद! यह मेरे लिए पूरी तरह से काम करता है!
इमानुला कोल्टा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.