Hızlı res. Gönderme dosyası yasak hatası atma


160

Bu kod var:

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

Ancak, bu hatayı atar:

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)

Biri bana bunun neden olabileceğini söyleyebilir mi?


3
Göreli yoldan dolayı olduğuna inanıyorum; "../" kötü amaçlı olarak değerlendirilir. Önce yerel yolu çözün, sonra arayınres.sendfile
— Joe

Yerel yolu nasıl çözersiniz?

4
path.resolveİhtiyacınız olanı yapmalısınız.
— Joe

1
Bunu yaptı. Bunu cevap olarak geçmek ister misiniz?

Yanıtlar:


286

Göreli yoldan dolayı olduğuna inanıyorum; "../" kötü amaçlı olarak değerlendirilir. Önce yerel yolu çözün, sonra arayın res.sendfile. Yolu path.resolveönceden çözebilirsiniz .

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

31
burada benim gibi yeni başlayanlar için daha fazla ayrıntı kullanışlı olurdu
— Adam Waite

5
Express, göreli yolları sendfilekötü olarak kabul eder . rootBurada gösterildiği gibi dizin parametresini belirtmedikçe : github.com/visionmedia/express/issues/1465
— Joe

2
var yol = zorunlu ('yol');
— Matt Harrison

1
evet son kod!
— SuperUberDuper

2
@MattHarrison ES6 güncellemesi, paket ithalatı constiçin tercih edildivar
— Nino Filiu

39

Bu cevap diğer cevaplardan / yorumlardan gelen bilgileri bir araya getirir.

İşlem çalışma dizinine (cwd) veya dosya dizinine göre bir şey eklemek isteyip istemediğinize bağlıdır. Her ikisi de path.resolveişlevi kullanır ( var path = require('path')dosyanın üstüne konur .

  • cwd'ye göre: path.resolve('../../some/path/to/file.txt');
  • dosyaya göre: path.resolve(__dirname+'../../some/path/to/file.txt');

@ Joe'nun yorumundaki bağlantıyı okurken, yol için kullanıcı girişini kabul ederseniz göreceli yollar bir güvenlik riski gibi görünüyor (örn sendfile('../.ssh/id_rsa'). Bir bilgisayar korsanının ilk denemesi olabilir).


1
Bir acemi olarak hacker senaryosunun buraya nasıl geldiğini bilmek istiyorum?
— bharath muppa

2
Kullanıcının indirmek istediği dosyanın yolunu yanlışlıkla girmesine izin verirseniz, sisteminizdeki herhangi bir dosyayı indirebilirler (ssh özel anahtarı örneğini verdim - bu da onlara PC'nizmiş gibi davranma olanağı verir ( ortadaki adam vb.)). Yalnızca web sitesindeki dosyalara erişilebildiğinden .. kısıtlamasına sahip olmak bu olasılığı devre dışı bırakır.
— derekdreery

30

Ekspres dokümantasyon bunu farklı bir şekilde yapıyor önerir ve bence daha sonra şimdiki çözümü daha mantıklı.

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

Kök seçeneği ./, projenizin kök dizini olarak ayarlanmış gibi görünüyor . Dolayısıyla, dosyanızın proje köküyle ilişkili olarak nerede olduğunu tam olarak söyleyemem, ancak geçici klasörünüz varsa, ./tempgönderdiğiniz dosyanın kökünü ayarlayabilirsiniz .


1
Bu doğrudur, ancak OP'nin kullandığı eski sendfile yerine sendFile (büyük harf, Express v4.8.0 tarafından desteklenen) kullanır. Just
— say

Ahh ... iyi yakaladın. Bu küçük farkı fark etmedim. Ayrıca, seçilen cevabın kullandığı için .sendfiledeğil, başka bir şeye tamamen bağlı olduğu için (yol) işe yarayıp yaramadığını merak ediyorum . Bunu işaret ettiğiniz için teşekkürler.
— tenor528

Basit ve etkili. Teşekkür ederim! Bu benim için mükemmel çalıştı!
— Emanuela Colta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.