PHP 安全科普 · 防御向
PHP 中的 XSS:是什么,怎么防
跨站脚本至今仍是最常见的 Web 漏洞之一。在 PHP 里,问题通常出在把数据输出到 HTML 时没有按所在位置转义。
最近更新
这是什么
反射型 XSS 直接回显当前请求里的值;存储型 XSS 把它保存下来(比如评论),再展示给所有人;DOM 型 XSS 发生在前端 JavaScript 里。无论哪种,浏览器都会以你网站的权限运行脚本,可能窃取会话或冒充用户操作。MITRE 把它归为 CWE-79。
怎么发现
- 在模板和 PHP 文件里搜索输出变量却没用
htmlspecialchars()或模板转义过滤器的echo、print和<?=。 - 特别注意放进 HTML 属性、内联 JavaScript、URL 和 CSS 的值,这些地方只做 HTML 转义不够。
- 使用框架自带的安全检查,以及 OWASP ZAP 等扫描器测试你自己的预发布环境。
怎么修
- 输出时转义:HTML 正文和带引号的属性用
htmlspecialchars($v, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8')。 - 使用开启自动转义的模板引擎(Twig、Blade、Latte),不要对不可信数据用原样输出过滤器。
- 把数据放进 script 块时用带
JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT的json_encode(),用在 href 之前先校验 URL。 - 加上 Content-Security-Policy,并把会话 Cookie 设为 HttpOnly、Secure 和 SameSite,作为纵深防御。
只读检查与安全写法
# Find raw echo of request data (read-only, rough first pass)
grep -rnE "echo\s+\$_(GET|POST|REQUEST|COOKIE)" --include=*.php . | grep -v /vendor/
// Escape on output, for the HTML context
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8');
# Defense in depth: a Content-Security-Policy header (example)
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'在输入时去掉标签不就行了?
过滤输入有帮助,但真正可靠防住 XSS 的是输出时按上下文转义。OWASP 建议优先做输出编码。
strip_tags() 能防 XSS 吗?
不可靠。它处理不了属性和 JavaScript 上下文,也容易用错,请用按上下文的转义。
其他常见 PHP 漏洞类型
- PHP 对象注入:是什么,怎么修当用户可控的输入进入 unserialize() 时就会发生 PHP 对象注入,它可以实例化对象,并通过魔术方法执行攻击者选定的逻辑。
- PHP 文件包含(LFI/RFI):是什么,怎么修当用户输入控制了 include 或 require 的路径时就会发生文件包含,攻击者可以读取本地文件(LFI),在开启 allow_url_include 时还能运行远程代码(RFI)。
- PHP 中的 SSRF:是什么,怎么修当 PHP 应用请求一个由用户控制的 URL 时就会发生服务端请求伪造(SSRF),攻击者可以借你的服务器访问内网服务或云元数据接口。
- phpinfo() 暴露:为什么重要,怎么修公开的 phpinfo() 页面会泄露精确的 PHP 版本、已加载模块、文件路径,常常还有环境变量或密钥,帮攻击者瞄准 PHP2Shell 这类漏洞。
来源
出站链接将离开本站。本站不托管利用代码。
- CWE-79: Cross-site Scripting — MITRE CWE
- Cross Site Scripting Prevention Cheat Sheet — OWASP Cheat Sheet Series
- htmlspecialchars() — PHP Manual