XSS防护核心是按上下文做输出编码:HTML文本用实体转义,属性值需引号包裹并转义对应引号,JS字符串用JSON.stringify(),URL参数用encodeURIComponent();禁用innerHTML直接插入,富文本必用DOMPurify净化,CSP为兜底策略。

HTML中如何防止XSS攻击
XSS(跨站脚本)本质是未过滤的用户输入被浏览器当作代码执行。防御核心就一条:**所有动态插入到HTML中的内容,必须做上下文敏感的转义或隔离**。
常见错误现象:innerHTML = userInput、document.write(userInput)、用eval()解析用户JSON、把URL参数直接拼进href或src属性。
- 服务端渲染时,对输出到HTML body、属性、JS字符串、CSS值等不同上下文,使用对应转义函数(如PHP的
htmlspecialchars()带ENT_QUOTES,Node.js的he.escape()) - 前端渲染时,避免直接操作
innerHTML;优先用textContent,或用框架(React/Vue)默认的自动转义机制(但注意dangerouslySetInnerHTML或v-html仍需人工校验) - 富文本场景必须放行HTML?用
DOMPurify.sanitize()而非正则清洗,且禁用<script>、onerror、javascript:等危险模式 - 设置
Content-Security-Policy响应头(如default-src 'self'),作为最后一道防线——它不能替代输入过滤,但能阻断多数内联脚本和外域资源加载
CSRF攻击为什么HTML表单特别危险
浏览器会自动携带Cookie发送请求,而传统HTML <form> 提交无法拦截或添加自定义头,导致攻击者只需诱导用户点击一个恶意链接或隐藏表单,就能以用户身份发请求。
关键点:CSRF不是XSS,不依赖执行JS,纯HTML+HTTP即可触发。
立即学习“前端免费学习笔记(深入)”;
- 所有状态变更接口(POST/PUT/DELETE)必须校验
CSRF token:服务端生成随机token,存在session里,同时嵌入表单<input type="hidden" name="csrf_token" value="...">或放在meta标签中供JS读取 - 避免仅依赖Referer或Origin头做校验——它们可被绕过(如从https跳转到http时Origin可能丢失)
- 敏感操作(如转账、密码修改)强制二次验证(短信/邮箱确认),不单靠CSRF token
- 使用
SameSite=Strict或SameSite=LaxCookie属性(现代浏览器支持),能大幅降低第三方站点发起的Cookie携带型CSRF
fetch和XMLHttpRequest能绕过CSRF防护吗
不能。只要请求携带了认证凭证(如Cookie、Authorization头),且目标接口没做CSRF校验,fetch一样会被利用——区别只在于攻击者更难用纯HTML触发fetch,需要诱导用户访问含恶意JS的页面。
所以重点不在请求方式,而在服务端是否校验token或SameSite策略是否生效。
- 前端用
fetch(url, { credentials: 'include' })时,依然会自动带上Cookie,和表单提交行为一致 - 若接口只接受
Content-Type: application/json,攻击者用<form enctype="text/plain">可伪造部分JSON结构,但无法构造任意JSON字段(比如键名含引号或嵌套对象时会失败)——这属于“防御深度”,不能当主要手段 - 真正安全的做法是:服务端对所有非GET/HEAD请求,强制校验
X-CSRF-Token请求头或csrf_tokenbody参数,并与session中存储的比对
为什么在HTML中写<script src="xxx"></script>不算XSS
因为这是合法的资源加载行为,浏览器不会将远程JS文件内容视为“用户可控输入”来执行上下文判断——它本来就是设计来执行的。风险点在于:你引入的脚本本身是否可信。
真正的漏洞发生在你把用户输入拼进了这个src值里,比如:<script src="/api/getjs?callback=" + userInput></script>,这时userInput若为aaa";alert(1)//,就可能破坏语法并注入代码。
- 永远不要把用户输入拼进
<script src="...">、<img src="...">、<a href="...">等属性值中 - 如果必须动态加载脚本,用
document.createElement('script')+src赋值,且对src做白名单校验(如只允许来自https://cdn.example.com/的路径) - 启用Subresource Integrity(SRI):加
integrity属性,让浏览器校验脚本哈希,防CDN被劫持篡改
innerHTML或document.write,就等于给XSS开了后门。



















