PHP - 自我表单提交:$ _SERVER ['PHP_SELF']或action =“”?

时间:2010-09-01 16:51:09

标签: php self form-submit

我只是意识到,对于一些奇怪的情况,我正在做我认为是自我提交的内容,而没有在action表单属性上引用PHP_SELF。

我很困惑,我们可以使用

<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?>

action="" 

如果没有,我们应该在什么情况下考虑一个或另一个?

提前致谢, MEM

4 个答案:

答案 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"/>