滚动新闻 →
加拿大正当程序法律如何发展 深圳APEC峰会前禁止鸣笛 司机们“嗷嗷”大叫 C罗告别葡萄牙国家队 23年辉煌生涯画上句点 北京未批准进口60万枚英伟达芯片 滞留香港待运 短剧顶流刘念遭经纪公司指控私吞商单款项 玩权钱色26年!马兴瑞被起诉 黄之锋再判十年 五月花号如何改变美国历史 习近平反腐行动直指军队高层 欧洲多国航班接连遭遇炸弹威胁紧急迫降 地基裂缝哪些情况需要专业检查 陕西商南县重大刑案嫌疑人逃入山林 警方展开大规模搜捕 AI 训练为什么需要 Checkpoint,GPU 集群发生故障后如何减少重复计算 美国第一夫人主持俄乌官员会谈 推动停火进程 新竹县工厂火灾续:1名失联者遗体被寻获,另1人仍在搜救中 浙江湖州商铺门被封堵引发纠纷 费女士维权遭阻挠 Google Cloud 数据迁移怎么规划,本地服务器搬到云端需要经历哪些步骤 浙江女子误用筋膜枪减肥意外发现卵巢癌 台中警方因男子车内呼救展开围捕 台股单月重挫逾8000点 证交所呼吁理性投资 国有保险公司或成中国股市下跌新推手 短视频平台助力失散20年双胞胎姐妹重逢 河北村官持刀伤人潜逃15年 期间领取140万空饷并晋升 柏林饭店发现德国巴伐利亚副邦长遗体 死因成谜 SaaS 数据库分表之前,开发人员应该先解决哪些实际问题 孙俪携儿女助阵邓超音乐会 高个帅儿引爆全场 中国男子全款购7斤黄金 金价暴跌致亏损超百万 新增内存后电脑无法开机,兼容性和插槽问题应该怎样检查 黄之锋再获10年监禁 外界谴责中共司法手段 韩国金融业遭遇资安危机 37家机构47万笔数据外泄 Windows 11 Wi-Fi 信号差怎么办?从路由器到电脑设置逐步排查 MySQL 查询速度突然变慢怎么办?建立一套系统化排查方法 古代文学为什么总是在写人生无常 双重轰炸袭击基辅能源设施 伤亡惨重视频曝光 巴黎家长轮班守校门反对学生封校抗议 林青霞72岁生日晒照 热心推广‘脑智同护’服务 中医里的经络究竟是什么概念 马兴瑞涉受贿案告破 涉及政商腐败网络 加拿大参议院二读通过反跨国镇压法案 德州检察长强生曾为‘七龙珠Z’美国版创作配乐 全球旅游支出创新高 战乱与通胀未阻游客热情

PHP 网站如何防范 XSS?从输出过滤理解跨站脚本攻击

发布时间: 2026-10-15 19:00:02    最后更新: 2026-11-04 16:46:02    阅读:73  约17 分钟阅读     

PHP 网站如何防范 XSS?从输出过滤理解跨站脚本攻击
图片说明:示意图   图片来源:Public Domain(公有领域)
XSS,也就是跨站脚本攻击,表面上看是网页里出现了一段不应该出现的JavaScript,实际问题却发生在浏览器对输出内容的解析过程中。攻击者提交的数据本身未必具有攻击性,真正危险的是网站把这些数据放进HTML、HTML属性、JavaScript、URL等特定上下文之后,浏览器把原本应该当成普通数据的内容解释成了代码。 因此,PHP网站防范XSS时最重要的概念并不是“把用户输入过滤干净”,而是“在输出到特定上下文时进行正确编码”。这是很多老式PHP教程最容易讲错的地方。HTML文本、HTML属性、JavaScript字符串、CSS和URL并不是同一种语法环境,针对其中一种环境有效的编码方法,并不能自动适用于另外一种环境。 例如用户提交下面这样的评论: 如果PHP直接输出: echo $comment; 浏览器会把其中的 那么仅仅使用htmlspecialchars()并不能建立一个可靠的JavaScript上下文安全边界。更合适的方式是让PHP把数据序列化为JavaScript值: 这里的json_encode()承担的是数据序列化,而不是HTML过滤。它能够把字符串、数字、数组等PHP数据转换为合法的JSON/JavaScript表示形式。需要根据实际嵌入位置选择合适的安全策略,尤其不要把未经处理的用户输入直接拼接进JavaScript源码。 原文提出“脚本标签内使用htmlspecialchars_decode()”则是完全相反的方向。htmlspecialchars_decode()的作用是把HTML实体解码回特殊字符,它不是XSS防御函数。攻击者提交的数据如果已经被编码成安全文本,开发者再调用htmlspecialchars_decode(),反而可能把原本已经失去HTML语义的字符重新恢复成危险字符。因此,不能把这个函数作为JavaScript上下文的安全处理方式。 如果数据只是为了传递给前端JavaScript,更推荐通过JSON数据结构或者data-*属性传递,而不是把用户输入拼接成一段JavaScript源码。例如: 前端再读取这个JSON数据。这样可以把“数据”和“代码”分开,减少字符串拼接带来的上下文混乱。 CSS上下文同样需要单独处理。不能认为只要调用一次htmlspecialchars(),任何位置都安全。例如把用户输入直接拼进style属性或者

捐助(Paypal): https://www.paypal.me/observeccp
订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP