Node.js REST API - URI 清理?
Node.js REST API - URI Sanitizing?
我想根据请求的 URI 在我的 Node.js 服务器中请求页面。
但是我担心这可能是一个严重的安全问题,因为用户可以将一些恶意字符注入 url,例如 ../../
并到达我的根服务器点并显示所有代码。
所以就像把一瓶水扔进大火一样,我已经取消了发送 .
到请求的选项。
这不是银弹,可能:)
也许有一些 standard/best practice/guide 或关于在 REST API 中基于 Node.js 清理 URI 的关键点?
编辑 - 这里的代码使用了 require
// app.js
app.use(require('./services/router')(app));
// router.js middleware
function router(app) {
return function(req, res, next) {
try {
// checking for . in the url
if (req.url.indexOf(".")!=-1) cast.badRequest();
// req.url.split('/')[2] should be customers, users or anything else
require('../../resources/' + req.url.split('/')[2] + '/' + req.url.split('/')[2] + '-router')(app);
next();
} catch(err) { cast.notFound(); }
}
}
module.exports = router;
// rides-router.js (this could be users-router.js or customers-router.js)
module.exports = function(app) {
// GET ride - select a ride
app.get("/v1/rides/:id", dep.verifyToken(), require('./api/v1-get-ride'));
// POST ride - insert a new ride
app.post("/v1/rides", dep.verifyToken(), require('./api/v1-set-ride'));
app.use((req, res, next) => {
cast.notFound();
});
}
你问的是如何做更安全。我的建议是将所有资源放在一个数组中,并使用一个循环 运行 所有 app.use()
语句,在服务器启动时从数组中提取资源名称。
我不喜欢在请求期间 运行 同步 require()
并且我不喜欢根据用户指定的字符加载代码。我的建议避免了两者。
// add routes for all resources
const resourceList = ['rides', 'products', ...];
for (let r of resourceList) {
app.use(`/${r}`, require(`./resources/${r}/${r}-router`));
}
这看起来代码更少,100% 安全,并且在请求期间没有 运行 同步 require()
。
优点:
- 完全列入白名单。
- 没有用户输入参与选择代码到 运行。
- 请求处理期间没有同步
require()
。
- 服务器初始化时安装的所有路由。
- 路由加载中的任何错误(如丢失的路由文件)都发生在服务器启动时,而不是在用户请求期间。
我想根据请求的 URI 在我的 Node.js 服务器中请求页面。
但是我担心这可能是一个严重的安全问题,因为用户可以将一些恶意字符注入 url,例如 ../../
并到达我的根服务器点并显示所有代码。
所以就像把一瓶水扔进大火一样,我已经取消了发送 .
到请求的选项。
这不是银弹,可能:)
也许有一些 standard/best practice/guide 或关于在 REST API 中基于 Node.js 清理 URI 的关键点?
编辑 - 这里的代码使用了 require
// app.js
app.use(require('./services/router')(app));
// router.js middleware
function router(app) {
return function(req, res, next) {
try {
// checking for . in the url
if (req.url.indexOf(".")!=-1) cast.badRequest();
// req.url.split('/')[2] should be customers, users or anything else
require('../../resources/' + req.url.split('/')[2] + '/' + req.url.split('/')[2] + '-router')(app);
next();
} catch(err) { cast.notFound(); }
}
}
module.exports = router;
// rides-router.js (this could be users-router.js or customers-router.js)
module.exports = function(app) {
// GET ride - select a ride
app.get("/v1/rides/:id", dep.verifyToken(), require('./api/v1-get-ride'));
// POST ride - insert a new ride
app.post("/v1/rides", dep.verifyToken(), require('./api/v1-set-ride'));
app.use((req, res, next) => {
cast.notFound();
});
}
你问的是如何做更安全。我的建议是将所有资源放在一个数组中,并使用一个循环 运行 所有 app.use()
语句,在服务器启动时从数组中提取资源名称。
我不喜欢在请求期间 运行 同步 require()
并且我不喜欢根据用户指定的字符加载代码。我的建议避免了两者。
// add routes for all resources
const resourceList = ['rides', 'products', ...];
for (let r of resourceList) {
app.use(`/${r}`, require(`./resources/${r}/${r}-router`));
}
这看起来代码更少,100% 安全,并且在请求期间没有 运行 同步 require()
。
优点:
- 完全列入白名单。
- 没有用户输入参与选择代码到 运行。
- 请求处理期间没有同步
require()
。 - 服务器初始化时安装的所有路由。
- 路由加载中的任何错误(如丢失的路由文件)都发生在服务器启动时,而不是在用户请求期间。