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></script>、onerror、javascript:等危险模式 - 设置
Content-Security-Policy响应头(如default-src 'self'),作为最后一道防线——它不能替代输入过滤,但能阻断多数内联脚本和外域资源加载
CSRF攻击为什么HTML表单特别危险
浏览器会自动携带Cookie发送请求,而传统HTML <form></form> 提交无法拦截或添加自定义头,导致攻击者只需诱导用户点击一个恶意链接或隐藏表单,就能以用户身份发请求。
关键点:CSRF不是XSS,不依赖执行JS,纯HTML+HTTP即可触发。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 所有状态变更接口(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"></form>可伪造部分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="..."></script>、<img src="...">、<a href="..."></a>等属性值中 - 如果必须动态加载脚本,用
document.createElement('script')+src赋值,且对src做白名单校验(如只允许来自https://cdn.example.com/的路径) - 启用Subresource Integrity(SRI):加
integrity属性,让浏览器校验脚本哈希,防CDN被劫持篡改
innerHTML或document.write,就等于给XSS开了后门。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










