以下是一份示例代码,实现了基本的 HTTP 服务器功能、防火墙、路由、POST 和 GET 请求、防 SQL 注入,以及分别处理 login 和 home 页面的请求。

const http = require('http');
const url = require('url');
const fs = require('fs');
const querystring = require('querystring');

// 防火墙,只允许特定 IP 访问
const allowedIPs = ['127.0.0.1', '::1'];

const server = http.createServer((req, res) => {
  const remoteIP = req.connection.remoteAddress;
  if (!allowedIPs.includes(remoteIP)) {
    res.statusCode = 403;
    res.end('Forbidden');
    return;
  }

  const reqUrl = url.parse(req.url);
  const reqPath = reqUrl.pathname;
  const reqMethod = req.method.toUpperCase();

  if (reqPath === '/login') {
    if (reqMethod === 'GET') {
      // 处理 GET 请求,返回登录页面
      fs.readFile('login.html', (err, data) => {
        if (err) {
          res.statusCode = 500;
          res.end('Internal Server Error');
          return;
        }
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/html');
        res.end(data);
      });
    } else if (reqMethod === 'POST') {
      // 处理 POST 请求,验证用户名和密码
      let requestBody = '';
      req.on('data', chunk => {
        requestBody += chunk.toString();
      });
      req.on('end', () => {
        const formData = querystring.parse(requestBody);
        const username = formData.username;
        const password = formData.password;
        if (username === 'admin' && password === 'admin') {
          res.statusCode = 302;
          res.setHeader('Location', '/home');
          res.end();
        } else {
          res.statusCode = 401;
          res.setHeader('Content-Type', 'text/html');
          res.end('Invalid username or password');
        }
      });
    }
  } else if (reqPath === '/home') {
    if (reqMethod === 'GET') {
      // 处理 GET 请求,返回主页
      fs.readFile('home.html', (err, data) => {
        if (err) {
          res.statusCode = 500;
          res.end('Internal Server Error');
          return;
        }
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/html');
        res.end(data);
      });
    }
  } else {
    res.statusCode = 404;
    res.end('Not Found');
  }
});

// 防 SQL 注入,替换特殊字符
function sanitizeInput(input) {
  return input.replace(/'/g, "''");
}

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

在上面的示例代码中,我们首先定义了一个允许访问的 IP 地址列表 allowedIPs,只有列表中的 IP 地址才能访问服务器。然后,在 createServer 方法中,我们根据请求的路径和请求方法来处理不同的请求。对于 /login 路径,当请求方法为 GET 时,返回登录页面;当请求方法为 POST 时,验证用户名和密码是否正确,如果正确则跳转到 /home 路径,否则返回 401 错误。对于 /home 路径,当请求方法为 GET 时,返回主页。最后,我们还定义了一个 sanitizeInput 函数,用于替换输入中的特殊字符,防止 SQL 注入攻击。

请注意,这只是一份基本的示例代码,实际应用中可能需要更复杂的功能和更完善的安全措施。例如,可以使用中间件来实现更高级的路由、身份验证和授权功能,使用 SSL 证书来加密通信,使用 HTTP 头部来防止跨站点脚本攻击等等。

示例代码说明:

  • 防火墙: allowedIPs 数组控制了允许访问服务器的 IP 地址。
  • 路由: 代码根据请求的 URL 路径 (reqPath) 分别处理了 /login/home 页面。
  • POST/GET 请求: req.method 用于判断请求类型,代码分别处理了 GET 和 POST 请求。
  • 防 SQL 注入: sanitizeInput 函数用于替换输入中的特殊字符,防止 SQL 注入攻击。

希望这个示例代码能帮助你更好地理解 Node.js HTTP 服务器的开发。

Node.js HTTP 服务器:防火墙、路由、POST/GET、防SQL注入

原文地址: https://www.cveoy.top/t/topic/mk1a 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录