第 11 卷
SELECT * FROM user WHERE username='' OR '1'='1' AND password='任意值' 由于 '1'='1 恒成立,此SQL会查询出表中所有用户数据,攻击者无需正确密码即可登录。
- 用户名输入: '; DROP TABLE user; --,拼接后的SQL为:
SELECT * FROM user WHERE username=''; DROP TABLE user; --' AND password='任意值'
其中 ; 用于结束前一个SQL语句, DROP TABLE user; 删除user表, -- 注释掉后续内容,导致数据库表被恶意删除。
- SQL注入攻击的危害
- 获取敏感数据:如用户密码、手机号、银行卡号等核心信息;
- 篡改数据:修改用户余额、订单状态等业务数据;
- 破坏数据:删除表、清空数据,导致业务瘫痪;
- 获取数据库权限:进一步控制服务器,实施更严重的攻击(如植入木马)。
- 防止SQL注入的核心措施
防止SQL注入的核心原则是“不相信任何用户输入”,通过严格过滤、参数化查询等方式,避免用户输入直接拼接到SQL语句中。具体措施如下:
- 使用参数化查询(最有效,推荐):将用户输入作为参数传递给SQL语句,而非直接拼接,数据库
会自动过滤恶意输入,避免SQL注入。不同开发语言/框架的实现方式不同,Node.js中常用的 mysql模块支持 ? 占位符实现参数化查询。
示例(Node.js mysql模块参数化查询):
const username = req.body.username;
const password = req.body.password;
// 用?作为占位符,参数放在数组中传递 const sql = 'SELECT * FROM user WHERE username=? AND password=?';
connection.query(sql, [username, password], (err, result) => { // 处理查询结果
}); 说明:此时用户输入的恶意字符(如'、;、--)会被当作普通字符串处理,不会被解析为SQL 语句的一部分。
// 定义User模型 const User = sequelize.define('user', {
username: DataTypes.STRING, password: DataTypes.STRING
});
// 查询用户(ORM自动处理参数,无注入风险)
const user = await User.findOne({ where: { username: req.body.username, password: req.body.password
} });
- 严格过滤用户输入:对用户输入的特殊字符(如'、"、;、--、OR、AND)进行转义或过滤,尤其适
用于无法使用参数化查询的场景(需注意:过滤无法覆盖所有注入场景,仅作为辅助手段)。
示例(转义单引号):
const username = req.body.username.replace(/'/g, '\\''); // 将'转义为 \',避免闭合SQL字符串
- 限制数据库用户权限:遵循“最小权限原则”,为应用程序使用的数据库用户分配最小必要权限
(如仅授予SELECT、INSERT、UPDATE权限,禁止授予DROP、ALTER、CREATE等高危权限),即使发生注入攻击,攻击者也无法执行破坏操作。
- 避免暴露敏感信息:
- 关闭数据库错误信息的详细输出(如MySQL的错误堆栈信息),避免攻击者通过错误信息推测数
据库结构;
- 不向用户返回数据库相关的错误信息,统一返回通用错误提示(如“登录失败,请重试”)。
- 使用 PreparedStatement(预处理语句):数据库层面的预处理机制,将SQL语句模板和参数分
开传输,数据库先编译SQL模板,再代入参数执行,避免参数被解析为SQL代码。参数化查询本质就是基于PreparedStatement实现的。
- 定期更新数据库和框架版本:及时修复数据库和开发框架中的安全漏洞,减少注入攻击的可乘之
机。
十七、什么是服务端渲染(SSR)?它如何提高前端应用的首屏加载时间?
- 服务端渲染(SSR)的核心定义
服务端渲染(Server-Side Rendering,简称SSR)是一种前端应用的渲染方式,指页面的HTML结构在服务器端生成,服务器将完整的、包含数据的HTML页面发送给浏览器,浏览器直接解析HTML即可
- SSR的核心工作流程
- 用户发送HTTP请求到服务器(如访问https://www.example.com);
- 服务器接收请求后,执行后端代码(Node.js等),获取页面所需的数据(如从数据库查询用户信
息、商品数据);
- 服务器将获取的数据注入到HTML模板中,生成完整的、包含数据的HTML页面(HTML中已包含页
面的所有内容,无需浏览器再请求数据生成);
- 服务器将完整的HTML页面发送给浏览器;
- 浏览器接收HTML后,直接解析HTML、CSS,快速展示页面(此时页面已可交互或部分可交互);
- 浏览器异步加载页面所需的JavaScript文件,执行JS代码(如绑定事件、初始化交互功能),完成
页面的“ hydration(水合)”过程,最终形成完全可交互的页面。
- SSR如何提高前端应用的首屏加载时间?
首屏加载时间是指用户输入URL后,直到首屏内容完全展示的时间。SSR通过优化“首屏内容生成和传输”的流程,大幅缩短首屏加载时间,核心原因如下:
- 减少浏览器的请求次数和等待时间:
- 客户端渲染(CSR)需要3次核心请求:①获取空白HTML → ②获取JS/CSS资源 → ③请求数据
(通过JS),只有完成这3次请求才能生成并渲染页面,等待时间长;
- SSR只需1次核心请求:获取完整的HTML页面(已包含数据和CSS),浏览器无需再请求数据,
减少了请求次数和网络等待时间,首屏内容可快速展示。
- HTML内容直达,无需浏览器等待JS执行:
- CSR中,空白HTML本身无内容,必须等待JS加载完成并执行、请求到数据后,才能生成DOM并
渲染页面;若JS文件较大(如React、Vue框架代码),加载和执行时间会很长,首屏会出现“白屏”;
- SSR中,服务器直接发送包含完整内容的HTML,浏览器接收后可立即解析HTML和CSS,展示首
屏内容,无需等待JS加载和执行(JS加载和水合过程可在首屏展示后异步进行),彻底解决首屏白屏问题。
- 利用服务器的网络优势,减少数据请求延迟:
- CSR中,数据请求由浏览器发起,浏览器与数据库之间可能存在跨域、网络链路长等问题,数据
请求延迟高;
- SSR中,数据请求由服务器发起,服务器通常与数据库部署在同一机房(或内网),网络链路
短,数据获取速度远快于浏览器,能快速生成包含数据的HTML,提升首屏加载效率。
全站分卷索引 · 12 卷
- 1第 1 卷
- 2第 2 卷
- 四、Node.js中的非阻塞I/O(Non-blocking I/O)模型
- • 阻塞I/O:主线程发起I/O操作后,暂停执行所有代码,直到I/O操作完成(如传统的PHP文件读
- • 非阻塞I/O:主线程发起I/O操作后,立即返回一个状态(未完成),并继续执行后续代码;I/O操作
- • exports:是 module.exports 的一个引用(快捷方式),默认是一个空对象 {},只能通
- • module.exports:是模块的真正导出对象,Node.js最终导出的是 module.exports 的
- ◦ 若为相对路径( ./、 ../)或绝对路径,直接按路径查找对应
- ◦ 若为第三方模块(如 express),会在当前目录的 node_modules 文件夹中查找,若找不
- 3第 3 卷
- 4第 4 卷
- 5第 5 卷
- 6第 6 卷
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- 11第 11 卷
- 12第 12 卷