我见过多次使用$_SERVER['PHP_SELF'];在表格的动作中。
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
问题是您也可以使用action="signup",这会将表单发送到同一页面而没有任何问题(如果我们在example.com/signup)。
<form method="post" action="signup.php" >
我的问题是为什么它几乎总是以第一种方式完成,应该使用哪种方式。
你可以使用任何一种,但你应该知道,如果你在
$_SERVER['PHP_SELF']
没有任何预防措施的情况下使用它,你很容易受到 XSS 攻击。事实上,你不应该使用任何变量
$_SERVER
、任何超全局变量来在屏幕上显示它而不正确地转义它。让我们看一个简单的 XSS 攻击示例,如果您
$_SERVER['PHP_SELF']
无辜地使用。假设这种形式:
普通用户会使用它,例如在浏览器中输入:
没有问题。但并非一切都是美好的,有些人被称为黑客并且不满足于单击链接以查看漂亮的表格。他们将操纵 URL,例如:
当黑客在 URL 中键入时,服务器上将生成以下代码:
嗯……没那么严重,他们只是给你注入了一个简单的警告,它会显示
xss
在一个看起来更漂亮的对话框中……问题是黑客稍后会给你注入更严重的东西。当门打开时,任何东西都可以进入,这就是问题所在。那么
PHP_SELF
邪恶呢?不,邪恶是不负责任地使用它的人。所有要在屏幕上显示的超全局变量都必须转义。
这种用法是安全的:
当 pepito 黑客尝试他的骗局时,会发生这种情况:
结论
PHP_SELF
用得好是安全的。但我想知道它是否值得使用,这和输入文件名有什么区别?使用PHP_SELF
似乎是为了方便,编写通用代码。也许在具有数千或数百万表单的应用程序中有意义?我会说即使在那种情况下也不会,因为有成千上万种处理action
表单的策略,即使它们有数千种。此外,考虑到像 Ajax 这样的工具,我们可以说,在一个自尊的应用程序中,那些重新加载以将数据发送到服务器的页面已经是史前的一部分,必须消失。现在,您可以在没有或的情况下以安全的方式对所有表单进行编程
action
,并使用 Ajax 将数据发送到服务器。在这种情况下,提交表单时将执行的文件将是其他文件,而不是包含表单的实际文件。不仅降低了风险,而且它是一个超级实用、优雅的代码,可以节省大量资源。如果您别无选择,只能继续编写史前代码,更好的选择是使用
$_SERVER['SCRIPT_NAME']
.链接