← 返回目录

第 11 卷

第 11 / 12 卷日期:

SELECT * FROM user WHERE username='' OR '1'='1' AND password='任意值' 由于 '1'='1 恒成立,此SQL会查询出表中所有用户数据,攻击者无需正确密码即可登录。

  1. 用户名输入: '; DROP TABLE user; --,拼接后的SQL为:

SELECT * FROM user WHERE username=''; DROP TABLE user; --' AND password='任意值'

其中 ; 用于结束前一个SQL语句, DROP TABLE user; 删除user表, -- 注释掉后续内容,导致数据库表被恶意删除。

  1. SQL注入攻击的危害
  2. 获取敏感数据:如用户密码、手机号、银行卡号等核心信息;
  3. 篡改数据:修改用户余额、订单状态等业务数据;
  4. 破坏数据:删除表、清空数据,导致业务瘫痪;
  5. 获取数据库权限:进一步控制服务器,实施更严重的攻击(如植入木马)。
  6. 防止SQL注入的核心措施

防止SQL注入的核心原则是“不相信任何用户输入”,通过严格过滤、参数化查询等方式,避免用户输入直接拼接到SQL语句中。具体措施如下:

  1. 使用参数化查询(最有效,推荐):将用户输入作为参数传递给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

} });

  1. 严格过滤用户输入:对用户输入的特殊字符(如'、"、;、--、OR、AND)进行转义或过滤,尤其适

用于无法使用参数化查询的场景(需注意:过滤无法覆盖所有注入场景,仅作为辅助手段)。

示例(转义单引号):

const username = req.body.username.replace(/'/g, '\\''); // 将'转义为 \',避免闭合SQL字符串

  1. 限制数据库用户权限:遵循“最小权限原则”,为应用程序使用的数据库用户分配最小必要权限

(如仅授予SELECT、INSERT、UPDATE权限,禁止授予DROP、ALTER、CREATE等高危权限),即使发生注入攻击,攻击者也无法执行破坏操作。

  1. 避免暴露敏感信息:
  • 关闭数据库错误信息的详细输出(如MySQL的错误堆栈信息),避免攻击者通过错误信息推测数

据库结构;

  • 不向用户返回数据库相关的错误信息,统一返回通用错误提示(如“登录失败,请重试”)。
  1. 使用 PreparedStatement(预处理语句):数据库层面的预处理机制,将SQL语句模板和参数分

开传输,数据库先编译SQL模板,再代入参数执行,避免参数被解析为SQL代码。参数化查询本质就是基于PreparedStatement实现的。

  1. 定期更新数据库和框架版本:及时修复数据库和开发框架中的安全漏洞,减少注入攻击的可乘之

机。

十七、什么是服务端渲染(SSR)?它如何提高前端应用的首屏加载时间?

  1. 服务端渲染(SSR)的核心定义

服务端渲染(Server-Side Rendering,简称SSR)是一种前端应用的渲染方式,指页面的HTML结构在服务器端生成,服务器将完整的、包含数据的HTML页面发送给浏览器,浏览器直接解析HTML即可

  1. SSR的核心工作流程
  2. 用户发送HTTP请求到服务器(如访问https://www.example.com);
  3. 服务器接收请求后,执行后端代码(Node.js等),获取页面所需的数据(如从数据库查询用户信

息、商品数据);

  1. 服务器将获取的数据注入到HTML模板中,生成完整的、包含数据的HTML页面(HTML中已包含页

面的所有内容,无需浏览器再请求数据生成);

  1. 服务器将完整的HTML页面发送给浏览器;
  2. 浏览器接收HTML后,直接解析HTML、CSS,快速展示页面(此时页面已可交互或部分可交互);
  3. 浏览器异步加载页面所需的JavaScript文件,执行JS代码(如绑定事件、初始化交互功能),完成

页面的“ hydration(水合)”过程,最终形成完全可交互的页面。

  1. SSR如何提高前端应用的首屏加载时间?

首屏加载时间是指用户输入URL后,直到首屏内容完全展示的时间。SSR通过优化“首屏内容生成和传输”的流程,大幅缩短首屏加载时间,核心原因如下:

  1. 减少浏览器的请求次数和等待时间:
  • 客户端渲染(CSR)需要3次核心请求:①获取空白HTML → ②获取JS/CSS资源 → ③请求数据

(通过JS),只有完成这3次请求才能生成并渲染页面,等待时间长;

  • SSR只需1次核心请求:获取完整的HTML页面(已包含数据和CSS),浏览器无需再请求数据,

减少了请求次数和网络等待时间,首屏内容可快速展示。

  1. HTML内容直达,无需浏览器等待JS执行:
  • CSR中,空白HTML本身无内容,必须等待JS加载完成并执行、请求到数据后,才能生成DOM并

渲染页面;若JS文件较大(如React、Vue框架代码),加载和执行时间会很长,首屏会出现“白屏”;

  • SSR中,服务器直接发送包含完整内容的HTML,浏览器接收后可立即解析HTML和CSS,展示首

屏内容,无需等待JS加载和执行(JS加载和水合过程可在首屏展示后异步进行),彻底解决首屏白屏问题。

  1. 利用服务器的网络优势,减少数据请求延迟:
  • CSR中,数据请求由浏览器发起,浏览器与数据库之间可能存在跨域、网络链路长等问题,数据

请求延迟高;

  • SSR中,数据请求由服务器发起,服务器通常与数据库部署在同一机房(或内网),网络链路

短,数据获取速度远快于浏览器,能快速生成包含数据的HTML,提升首屏加载效率。

全站分卷索引 · 12 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷