使用Node.js中的eval使用提交按钮和输入文本向服务器发送请求

时间:2014-07-02 19:38:58

标签: javascript html node.js

所以这就是我想要实现的目标!

我想创建一个非常简单的Node应用程序,我可以通过创建输入文本框和提交按钮来使用eval函数。我希望能够在文本框中编写内容,并在点击提交时使用eval函数将此参数发送到服务器。

因此,如果我在文本框中写while(true),由于eval漏洞,这会导致对服务器的DoS攻击。

到目前为止,这是我的代码(修复无法正常工作)

var http = require("http");
var server = http.createServer(function(request, res) {
  res.writeHead(200, {"Content-Type": "text/html"}); 
  res.write("<html>");
  res.write("<head>");
  res.write("<title>Hello World Page</title>");
  res.write("</head>");
  res.write("<body>");
  res.write("Enter Some text");

  res.write('<input type="text" name="fname">');

  res.write('<input type="submit" value="Submit")');

  var parameter = eval(req.body.fname); 
  res.send(parameter);
  res.write("</body>"); 
  res.write("</html>");
  res.end();
});

server.listen(1337);
console.log("Server is listening");

关于如何使这项工作的任何想法?

1 个答案:

答案 0 :(得分:0)

首先 - 这是关于该主题的好帖子:Accessing the HTTP message body (e.g. POST data) in node.js

对您的HTML进行了一些小改动:

  • 我添加了一个表单元素,其操作和方法设置为POST。你也可以使用GET来避免下面的一些req.on(...)逻辑。
  • 为提交按钮添加了关闭括号 - 您输入了一个错误

在阅读发布的表单数据时,您需要读取所有数据,直到完成为止。 req参数是一个事件发射器,因此您可以使用:

req.on('data', function(chunk) {...}
req.on('end', function() {...}

要缓冲传入的数据,请在到达请求结束时对其进行操作。

表单数据已编码,因此您需要使用查询字符串模块对其进行解析。

我还添加了足够的错误检查(并修复了一些命名错误),以使代码在基本级别上运行。

代码:

var http = require("http");
var querystring = require('querystring');
var util = require('util');

var server = http.createServer(function(req, res) {
  var body = "";
  req.on('data', function (chunk) {
    body += chunk;
  });
  req.on('end', function () {
    console.log('POSTed: ' + body);

    body = querystring.parse(body);
    console.log('decoded: ' + util.inspect(body));

    res.writeHead(200, {"Content-Type": "text/html"});
    res.write("<html>");
    res.write("<head>");
    res.write("<title>Hello World Page</title>");
    res.write("</head>");
    res.write("<body>");
    res.write("Enter Some text");

    res.write('<form action="/" method="post">');
    res.write('<input type="text" name="fname">');

    res.write('<input type="submit" value="Submit">');
    res.write('</form>');

    if(body.fname) {
      var parameter = eval(body.fname);

      console.log(util.inspect(parameter));
      if(parameter) {
        res.write(parameter);
      }
    }
    res.write("</body>");
    res.write("</html>");
    res.end();
  });
});

server.listen(1337);
console.log("Server is listening");