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.