URL中XSS攻击致HTML body追加字符串的防护方案咨询
XSS攻击防护问题及解决方案
问题描述
存在XSS攻击的URL:
www.example.com/login.php/'%22--%3E%3CsVg/onLOad=document['body']['append'](%603cACF1BD%60['repeat'](2))%3E
解码后内容:
www.example.com/login.php/'"--><sVg/onLOad=document['body']['append'](`3cACF1BD`['repeat'](2))>
该攻击会向HTML body中追加指定字符串。我尝试用strip_tags()函数清理URL,代码如下:
$url = strip_tags($site_url.$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']); <meta property="og:url" content="<?php echo $url; ?>" />
但strip_tags()无法阻止字符串追加到body中,请问该如何防护?
解决方案
核心问题
strip_tags()仅能移除HTML/PHP标签,但本次攻击是通过URL编码注入了可执行的JS事件(onLoad),strip_tags()既不会处理属性中的恶意代码,也不会对HTML属性值做转义,导致恶意代码仍能在content属性中触发执行。
正确防护方式
当内容输出到HTML属性(比如meta的content)时,必须使用HTML属性转义函数,PHP中优先使用htmlspecialchars(),并指定完整参数:
$url = htmlspecialchars($site_url . $_SERVER['PHP_SELF'] . "?" . $_SERVER['QUERY_STRING'], ENT_QUOTES, 'UTF-8'); ?> <meta property="og:url" content="<?php echo $url; ?>" />
ENT_QUOTES:同时转义单引号和双引号,适配不同的属性引号包裹场景- 指定
UTF-8编码:避免转义后出现乱码,保证特殊字符转义准确
额外防护建议
- 替换
$_SERVER['PHP_SELF']:该变量可能被用户篡改,建议用$_SERVER['SCRIPT_NAME']替代,它仅包含当前脚本的路径,不会携带注入的恶意内容 - 校验URL格式:对拼接后的URL做格式验证,过滤非法字符,确保符合合法URL规则
- 配置CSP(内容安全策略):在HTTP响应头中设置CSP规则,限制脚本的执行来源,即使出现注入也无法执行恶意JS
内容的提问来源于stack exchange,提问作者aniket patwa
相关产品推荐
相关产品推荐

