簡體   English   中英

PHP-自行提交表單:$ _SERVER ['PHP_SELF'] OR action =“”?

[英]PHP - Self form submission: $_SERVER['PHP_SELF'] OR action=“”?

我只是意識到,在某些奇怪的情況下,我正在做我認為是自我提交的事情,而沒有在action form屬性上引用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找到。

/ me交叉手指
:電子

     <?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"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM