2

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

我很困惑,我们可以使用

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

或者

action="" 

?

如果不是,我们应该在什么情况下考虑一种或另一种?

提前致谢, MEM

4

4 回答 4

3

您可以使用(PHP_SELF 或空字符串)。但你为什么要为此使用 FILTER_SANITIZE_STRING 呢?在这种情况下,您最好使用htmlentities()而不是 filter_var,如果您的路径包含过滤字符(例如<),表单将不会提交。

我更喜欢给一个字符串,<base href=>在使用空值时会引起麻烦。例子:

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
</form>
于 2010-09-01T16:55:19.967 回答
0

如果我没记错的话,Safari 对后者有/有问题,因此我放弃了使用它。

于 2010-09-01T16:54:58.360 回答
-1

请不要使用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

于 2010-09-01T16:56:12.273 回答
-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"/>
于 2017-09-04T04:47:23.327 回答