Node.js HTTP 服务器:防火墙、路由、POST/GET、防SQL注入
以下是一份示例代码,实现了基本的 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 服务器的开发。
原文地址: https://www.cveoy.top/t/topic/mk1a 著作权归作者所有。请勿转载和采集!