面试题答案
一键面试优化路径操作提高可维护性和性能
- 使用
path
模块:- 在Node.js中,
path
模块是处理路径的核心。在项目中统一使用path.join()
方法来拼接路径,而不是手动使用字符串拼接。例如,如果有一个目录src
下的utils
文件夹中的file.js
文件,传统字符串拼接可能是'src' + '/' + 'utils' + '/' + 'file.js'
,而使用path.join()
则是path.join('src', 'utils', 'file.js')
。这样可以避免因不同操作系统路径分隔符不同(Windows使用\
,Unix使用/
)导致的问题。 - 使用
path.resolve()
方法将相对路径转为绝对路径,特别是在引用模块或文件时。例如,path.resolve(__dirname, '..', 'config', 'settings.json')
,__dirname
表示当前文件所在目录,通过path.resolve()
可以清晰地定位到所需文件,提高代码的可维护性。
- 在Node.js中,
- 路径别名:
- 对于多层嵌套目录,可以使用路径别名。在项目构建工具(如Webpack,对于Node.js项目可使用
@babel/plugin - transform - import - meta - url
等类似插件)中配置路径别名。例如,在Webpack的webpack.config.js
中:
const path = require('path'); module.exports = { //... resolve: { alias: { '@src': path.resolve(__dirname,'src'), '@utils': path.resolve(__dirname,'src/utils') } } };
- 这样在代码中引用文件时,就可以使用别名,如
import { someFunction } from '@utils/functions.js';
,使路径引用更简洁、易读,且当目录结构调整时,只需修改别名配置,无需在大量代码中修改路径。
- 对于多层嵌套目录,可以使用路径别名。在项目构建工具(如Webpack,对于Node.js项目可使用
- 集中管理路径:
- 创建一个专门的文件(如
pathConstants.js
)来管理项目中的常用路径。例如:
const path = require('path'); const ROOT_DIR = path.resolve(__dirname); const SRC_DIR = path.join(ROOT_DIR,'src'); const CONFIG_DIR = path.join(SRC_DIR, 'config'); module.exports = { ROOT_DIR, SRC_DIR, CONFIG_DIR };
- 在其他模块中导入这些路径常量,如:
const { CONFIG_DIR } = require('./pathConstants.js'); const configFilePath = path.join(CONFIG_DIR, 'config.json');
- 这样可以方便路径的修改和维护,同时增强了代码的可读性。
- 创建一个专门的文件(如
防范路径遍历攻击及处理用户上传文件保存路径的安全措施
- 规范化路径:
- 使用
path.normalize()
方法对用户输入的路径或生成的路径进行规范化。例如,对于用户输入的路径../../etc/passwd
,path.normalize('../../etc/passwd')
会将其转换为一个标准路径形式。在Node.js中,规范化路径后会移除.
和..
等特殊路径元素,防止路径遍历。 - 在处理用户上传文件保存路径时,假设用户输入一个保存路径
uploads/../malicious
,使用path.normalize()
可以将其转换为一个相对合理的路径,并且可以通过进一步判断是否符合预期路径规则来拒绝恶意路径。
- 使用
- 路径白名单:
- 定义一个白名单,只允许特定的路径作为用户上传文件的保存目录。例如,只允许保存在
uploads
目录下。在保存文件前,检查生成的保存路径是否在白名单内。
const ALLOWED_UPLOAD_DIR = path.resolve(__dirname, 'uploads'); function isValidUploadPath(pathToCheck) { const normalizedPath = path.normalize(pathToCheck); return normalizedPath.startsWith(ALLOWED_UPLOAD_DIR); }
- 定义一个白名单,只允许特定的路径作为用户上传文件的保存目录。例如,只允许保存在
- 绝对路径检查:
- 始终使用绝对路径来保存用户上传的文件,并且确保生成的绝对路径是在允许的范围内。例如,在保存文件时,通过
path.resolve()
获取绝对路径,然后与允许的根目录路径(如uploads
目录的绝对路径)进行比较,确保路径没有超出允许范围。
- 始终使用绝对路径来保存用户上传的文件,并且确保生成的绝对路径是在允许的范围内。例如,在保存文件时,通过
- 文件名过滤:
- 对用户上传文件的文件名进行严格过滤,只允许符合特定命名规则的文件名。例如,只允许字母、数字、下划线和短横线组成的文件名,可以使用正则表达式进行匹配:
const validFileNameRegex = /^[a - zA - Z0 - 9_-]+$/; function isValidFileName(fileName) { return validFileNameRegex.test(fileName); }
- 这样可以防止用户上传恶意文件名,如
../../../etc/passwd
,即使路径处理正确,恶意文件名也可能导致安全问题。