এক্সপ্রেস 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
আমার মতো নবাগতদের জন্য এখানে আরও বিশদটি কার্যকর হবে
অ্যাডাম ওয়েট

5
এক্সপ্রেস আপেক্ষিক পাথকে sendfileখারাপ হিসাবে বিবেচনা করে । rootডিরেক্টরি প্যারামিটারটি নির্দিষ্ট না করা অবধি,
জো

2
var পাথ = প্রয়োজন ('পথ');
ম্যাট হ্যারিসন

1
হ্যাঁ ফাইনাল কোড !!
সুপারউবারডুপার

2
প্যাকেজ আমদানির জন্য @ ম্যাটহারিসন ইএস 6 আপডেটের constচেয়ে বেশি পছন্দ করা হয়েছেvar
নিনো ফিলিউ 1'19

39

এই উত্তরটি অন্যান্য উত্তর / মন্তব্য থেকে তথ্য একত্রিত করে।

এটি নির্ভর করে আপনি প্রসেস ওয়ার্কিং ডিরেক্টরি (সিডাব্লুডি) বা ফাইল ডিরেক্টরি সম্পর্কিত কিছু যুক্ত করতে চান কিনা তা নির্ভর করে depends উভয়ই path.resolveফাংশনটি ব্যবহার করেন ( var path = require('path')ফাইলের শীর্ষে রাখুন।

  • সিডব্লিউডের সাথে সম্পর্কিত: path.resolve('../../some/path/to/file.txt');
  • ফাইল সম্পর্কিত: path.resolve(__dirname+'../../some/path/to/file.txt');

@ জো-এর মন্তব্য থেকে লিঙ্কটি পড়ে, মনে হচ্ছে আপনি যদি পাথের জন্য ব্যবহারকারীদের ইনপুট গ্রহণ করেন তবে (যেমন sendfile('../.ssh/id_rsa')হ্যাকারের প্রথম চেষ্টা হতে পারে) আপেক্ষিক পাথগুলি সুরক্ষা ঝুঁকিপূর্ণ ।


1
নবাগত হিসাবে আমি জানতে চাই যে এখানে হ্যাকারের দৃশ্যটি কীভাবে এসেছিল?
ভরথ মুপ্পা

2
যদি আপনি ঘটনাক্রমে ব্যবহারকারীকে যে ফাইলটি ডাউনলোড করতে চান তার পথে প্রবেশের অনুমতি দেয় তবে তারা আপনার সিস্টেমে যে কোনও ফাইল ডাউনলোড করতে পারে (আমি একটি এসএসএস প্রাইভেট কী এর উদাহরণ দিয়েছি - যা তাদের আপনার পিসি হওয়ার ভান করার ক্ষমতা দেয় ( ম্যান-ইন-দ্য মিডল ইত্যাদি))। .. সীমাবদ্ধতা থাকা এই সম্ভাবনাটিকে অস্বীকার করে কারণ কেবলমাত্র ওয়েবসাইট থেকে ফাইলগুলি অ্যাক্সেস করা যায়।
derekdreery

30

এক্সপ্রেস ডকুমেন্টেশন এটা অন্যভাবে করছেন প্রস্তাব দেওয়া, এবং আমার মতে এটি আরো ইন্দ্রিয় পরে বর্তমান সমাধান চেয়ে তোলে।

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

রুট বিকল্পটি ./আপনার প্রকল্পের মূল ডিরেক্টরি হিসাবে সেট করা আছে বলে মনে হচ্ছে । সুতরাং আপনি প্রকল্পের মূলের সাথে সম্পর্কিত আপনার ফাইলটি কোথায় তা আমি সম্পূর্ণরূপে বলতে পারি না, তবে যদি আপনার অস্থায়ী ফোল্ডারটি থাকে তবে আপনি ./tempযে ফাইলটি পাঠাচ্ছেন তার জন্য রুট হিসাবে সেট করতে পারেন ।


1
এটি সত্য, তবে এটি ওপি ব্যবহার করা পুরানো সেন্ডফিলের পরিবর্তে সেন্ডফিল (মূলধন এফ, এক্সপ্রেস ভি 4.8.0 দ্বারা সমর্থিত) ব্যবহার করে। শুধু বলছি ... =]
রেমিএনএল

আহ ... ভাল ক্যাচ আমি এই ছোট পার্থক্য লক্ষ্য করিনি। আমি আরও আশ্চর্য হয়েছি যে নির্বাচিত উত্তরটি এটি ব্যবহার করে না .sendfileকারণ এটি কার্যকরভাবে অন্য কোনও কিছুতে (পথ) নির্ভর করে) এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
tenor528

সহজ এবং কমনীয়। ধন্যবাদ! এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছিল!
ইমানুেলা কোল্টা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.