前言
近来在复习PHP的知识,在php表单验证这块遇到了之前学习的htmlspecialchars() 函数,并且也再次理解了htmlspecialchars()函数的作用,及xss攻击形成的原因
$_SERVER[“PHP_SELF”] 变量
定义
- $_SERVER[“PHP_SELF”] 是一种超全局变量,它返回当前执行脚本的文件名
- $_SERVER[“PHP_SELF”] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息
利用
若页面使用了PHP_SELF,则用户可以通过输入下划线然后插入js代码执行跨站脚本(XSS)
以W3school中的例子为例:
若有一张名为 “test_form.php” 的页面中有如下表单:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
如果用户进入的是地址栏中正常的 URL:
http://www.example.com/test_form.php
则上面的代码会转换为:
<form method="post" action="test_form.php">
则一切正常
但如果用户在地址栏中键入了如下 URL:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacker')%3C/script%3E
在这种情况下,上面的代码会转换为:
<form method="post" action="test_form.php"/><script>alert('hacker')</script>
页面加载后,就会执行JS的弹窗代码
若该js代码不是普通的’hacker’弹窗代码,而是弹窗Cookie或其他隐私信息的代码,则有可能会出现信息泄露等安全问题
防御
使用htmlspecialchars() 函数将特殊字符转换为HTML实体,则此时js脚本将会进行实体编码,避免$_SERVER[“PHP_SELF”]被利用
例:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
编码后:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">