我只是意识到,对于一些奇怪的情况,我正在做我认为是自我提交的内容,而没有在action表单属性上引用PHP_SELF。
我很困惑,我们可以使用
<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?>
或
action=""
如果没有,我们应该在什么情况下考虑一个或另一个?
提前致谢, MEM
答案 0 :(得分:3)
您可以使用(PHP_SELF或空字符串)。但为什么你会使用FILTER_SANITIZE_STRING呢?在这种情况下,您最好使用htmlentities()而不是filter_var,如果您的路径包含已过滤的字符(例如<
),则表单将不会提交。
我更喜欢提供字符串,<base href=>
在使用空值时会造成麻烦。
例如:
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
</form>
答案 1 :(得分:0)
如果我没弄错,Safari对后者有问题,因此我放弃使用它。
答案 2 :(得分:-1)
请不使用PHP_SELF,因为它也可以是/index.php/"><script>alert(1)</script>/
。
它经常用于XSS攻击。
使用索引 SCRIPT_NAME 代替! SCRIPT_NAME将始终指向实际的PHP文件,而不是用户输入。
此致
修改强>
有两个人指出,使用mod_rewrite时SCRIPT_NAME无效。这是假的,我认为这些人应该在他们投票答案之前阅读。
这是你的测试场景***:
$ 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中也可以找到 。
/ me穿过手指
:电子
答案 3 :(得分:-1)
<?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"/>