1) 【一句话结论】Web应用常见安全漏洞如SQL注入、XSS、CSRF,需从“输入验证-输出编码-请求校验”三原则防范,核心是阻断攻击者通过恶意输入篡改系统行为。
2) 【原理/概念讲解】
- SQL注入:攻击者通过恶意输入绕过应用对用户输入的验证,将非法SQL片段注入到数据库查询中,导致数据库执行非预期的操作(如查询所有数据、删除表)。例如,用户输入“' or 1=1 -- ”,原本查询“select * from users where username='admin'”变成“select * from users where username='admin' or 1=1 -- ”,返回所有用户。触发场景是应用直接拼接SQL语句或未过滤特殊字符(如单引号、分号)。
- XSS(跨站脚本):将恶意脚本注入到网页中,当用户访问该页面时,脚本在用户浏览器中执行(如窃取Cookie、重定向到钓鱼网站)。例如,用户输入“<script>alert('XSS')</script>”,页面渲染时执行alert。触发场景是应用对用户输入未做输出编码,直接输出到页面(如用户名、评论内容)。
- CSRF(跨站请求伪造):攻击者诱导已登录用户在当前会话中执行非授权操作,因为请求包含用户的会话令牌(如Cookie),服务器无法区分请求是否来自用户本人。例如,攻击者发送伪造的POST请求到“/logout”,包含用户Cookie,服务器执行注销。触发场景是表单提交时未校验请求来源或会话状态(如Referer伪造、Cookie未设置SameSite)。
3) 【对比与适用场景】
| 漏洞类型 | 定义 | 原理 | 常见触发场景 | 防御方法 |
|---|
| SQL注入 | 攻击者通过恶意输入注入SQL语句,篡改数据库操作 | 绕过输入验证,拼接非法SQL | 直接拼接SQL、未过滤特殊字符 | 参数化查询、ORM、输入验证 |
| XSS | 注入恶意脚本到网页,在用户浏览器执行 | 输入未编码直接输出 | 未对用户输入编码、模板引擎不安全 | 输出编码、安全模板引擎、CSP |
| CSRF | 诱导已登录用户执行非授权操作 | 请求包含会话令牌,服务器无法区分 | 表单提交未校验来源、Referer伪造 | CSRF token、Referer检查、SameSite Cookie |
4) 【示例】
- SQL注入:用户输入“' or '1'='1”,查询“select * from users where username='admin' and password='123'”变成“select * from users where username='admin' and password='123' or '1'='1'”,返回所有用户。
- XSS:用户输入“<script>alert('XSS')</script>”,页面渲染时执行alert。
- CSRF:攻击者发送POST请求到“/logout”,包含用户Cookie(如JSESSIONID=abc123),服务器执行注销操作。
5) 【面试口播版答案】
面试官您好,我列举三种常见Web安全漏洞:SQL注入、XSS、CSRF。首先SQL注入,原理是攻击者通过恶意输入绕过应用对用户输入的验证,将非法SQL片段注入到数据库查询中,导致数据库执行非预期操作。比如用户输入“' or 1=1 -- ”,原本查询“select * from users where username='admin'”变成“select * from users where username='admin' or 1=1 -- ”,返回所有用户。触发场景是应用直接拼接SQL语句或未过滤特殊字符。避免方法是使用参数化查询(预编译语句)或ORM框架,避免手动拼接SQL。然后XSS,原理是将恶意脚本注入到网页中,当用户访问时在浏览器执行,可窃取Cookie或重定向。比如用户输入“<script>alert('XSS')</script>”,页面渲染时执行alert。触发场景是应用对用户输入未做输出编码,直接输出到页面。避免方法是对用户输入进行HTML实体编码,使用安全的模板引擎(如Thymeleaf)。最后CSRF,原理是攻击者诱导已登录用户在当前会话中执行非授权操作,因为请求包含用户的会话令牌,服务器无法区分请求是否来自用户本人。比如攻击者发送伪造的POST请求到“/logout”,包含用户Cookie,服务器执行注销。触发场景是表单提交时未校验请求来源或会话状态。避免方法是用CSRF token(在表单中添加隐藏字段)、验证Referer头、使用SameSite属性(如Strict)。
6) 【追问清单】
- 问题1:SQL注入的防御是否只靠参数化?
回答要点:不是,还需输入验证(如白名单过滤)和输出编码(如数据库查询结果输出)。
- 问题2:XSS的存储型、反射型和DOM型有什么区别?
回答要点:存储型是恶意脚本存储在数据库中,反射型是脚本随响应返回,DOM型是脚本通过DOM操作注入。
- 问题3:CSRF的防御方法中,SameSite属性的作用是什么?
回答要点:SameSite=Strict时,Cookie仅在原站请求中发送,防止CSRF;SameSite=Lax时,允许GET请求发送Cookie。
- 问题4:如何区分SQL注入和命令注入?
回答要点:SQL注入针对数据库,命令注入针对操作系统(如Windows的cmd.exe)。
- 问题5:XSS的防范中,内容安全策略(CSP)的作用是什么?
回答要点:CSP限制页面加载的资源,防止加载恶意脚本。
7) 【常见坑/雷区】
- 坑1:认为SQL注入只发生在数据库操作,忽略其他组件(如文件系统、命令执行)。
- 雷区2:混淆XSS和CSRF,认为两者都是注入漏洞。
- 坑3:忽略CSRF的前端防护,只讲后端token。
- 雷区4:认为参数化查询能完全解决SQL注入,忽略输入验证。
- 坑5:对XSS的防范只讲输出编码,忽略输入验证和模板引擎安全。