【问题标题】:isn't res in scope? (node.js)不在范围内吗? (node.js)
【发布时间】:2012-09-10 16:45:24
【问题描述】:
var http = require('http');
var url=   require('url');
var util=  require('util');
var fs =   require('fs');

var body_404="<html><body><center>404 error</center></body></html>";

http.createServer(function (req,res) {
 var what = url.parse("http://127.0.0.1:1235"+req.url);
 var pathname = what.pathname;

 switch(pathname) { 
  case "/":
   pathname="/www/index.html";
  default:
   res.writeHead(200, {'Content-type' : 'text/html'});
   ret = res; 
   fs.stat("."+pathname, function (err, stat) {
    if(err)
     res.write(body_404);
    else
     res.write(fs.readFileSync("."+pathname));
   });
   res.end();
   break;
 }
}).listen(1235, '127.0.0.1');

我想知道为什么 fs.stat 回调中的 write 方法实际上并没有向客户端写入任何内容。我相信 res 在范围内。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    您在调用res.write 之前调用了res.end。因此,没有任何东西被写出来。将对res.end 的调用移动到统计处理程序中:

    var http = require('http');
    var url=   require('url');
    var util=  require('util');
    var fs =   require('fs');
    var path = require('path');
    
    var body_404="<html><body><center>404 error</center></body></html>";
    var rootPath = path.abspath(".");
    
    http.createServer(function (req,res) {
     var what = url.parse("http://127.0.0.1:1235"+req.url);
     var pathname = what.pathname;
     var buffer;
    
     switch(pathname) { 
      case "/":
       pathname="/www/index.html";
      default:
       var filename = path.join(rootPath, pathname);
       if (filename.indexOf(rootPath) !== 0) {
         res.writeHead(400, {'Content-type': 'text/plain'});
         res.write('Directory traversal attack averted.');
         res.end();
         return;
       }
       fs.readFile(function (err, content) {
        if(err) {
          res.writeHead(404, {'Content-type' : 'text/html'});
          res.write(body_404);
        } else {
          res.writeHead(200, {'Content-type' : 'text/html'});
          res.write(content);
        }
        res.end();
       });
       break;
     }
    }).listen(1235, '127.0.0.1');
    

    另请注意,您的原始代码容易受到directory traversal attacks的影响,并且在os.statos.readFileSync 之间存在race condition

    【讨论】:

    • 我用更多注释更新了答案 - 您当前的代码包含安全漏洞
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2015-02-26
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多