我只是意识到,在一些奇怪的情况下,我正在做我认为是自我提交的事情,而没有在 action 表单属性上引用 PHP_SELF。
我很困惑,我们可以使用
<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?>
或者
action=""
?
如果不是,我们应该在什么情况下考虑一种或另一种?
提前致谢, MEM
我只是意识到,在一些奇怪的情况下,我正在做我认为是自我提交的事情,而没有在 action 表单属性上引用 PHP_SELF。
我很困惑,我们可以使用
<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?>
或者
action=""
?
如果不是,我们应该在什么情况下考虑一种或另一种?
提前致谢, MEM
您可以使用(PHP_SELF 或空字符串)。但你为什么要为此使用 FILTER_SANITIZE_STRING 呢?在这种情况下,您最好使用htmlentities()而不是 filter_var,如果您的路径包含过滤字符(例如<
),表单将不会提交。
我更喜欢给一个字符串,<base href=>
在使用空值时会引起麻烦。例子:
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
</form>
如果我没记错的话,Safari 对后者有/有问题,因此我放弃了使用它。
请不要使用PHP_SELF,因为这也可以是/index.php/"><script>alert(1)</script>/
.
它通常用于 XSS 攻击。
请改用索引SCRIPT_NAME!SCRIPT_NAME 将始终指向实际的 PHP 文件,而不是用户输入。
问候
编辑:
两个人指出,SCRIPT_NAME 在使用 mod_rewrite 时不起作用。这是错误的,我认为这些人在投票否决答案之前应该阅读。
这是给您的测试场景***:
$ cat .htaccess
RewriteEngine On
RewriteRule testme/ /testmenot.php
$ cat testmenot.php
<? echo $_SERVER['SCRIPT_NAME']; ?>
$ GET hostname/testme/
/testmenot.php
$_SERVER['REQUEST_URI']
持有“/testme/”,我猜这些人会在 SCRIPT_NAME 中预料到。但这也不能在 PHP_SELF 中找到。
/我交叉手指
:E
<?php
session_start();
$msg = '';
if (isset($_POST['login']) && !empty($_POST['username'])
&& !empty($_POST['password'])) {
if ($_POST['username'] == 'abc' &&
$_POST['password'] == 'xyz') {
$_SESSION['valid'] = true;
$_SESSION['timeout'] = time();
$_SESSION['username'] = 'abc';
?>
<script type="text/javascript">
location.href="index.php"
</script>
<?php
}
else
{
$msg ='Invalid username or password';
}
}
?>
<form
action ="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
?>" method = "post">
<input type = "text" class = "form-control"
name = "username" placeholder = "username"
required autofocus ></br>
<input type = "password" class = "form-control"
name = "password" placeholder = "password" required>
<input class="button" type = "submit" name = "login" value="Log in"/>