2010-09-01 61 views
2

我剛剛意識到,對於一些奇怪的情況,我正在做我認爲是自我提交的內容,而沒有在動作表單屬性上引用PHP_SELF。

我很納悶,我們或者可以使用

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

或者

action="" 

如果不是,我們應該在什麼情況下考慮這個或另一個?

由於提前, MEM

回答

3

您可以使用(PHP_SELF或空字符串)。但爲什麼你會爲此使用FILTER_SANITIZE_STRING?在這種情況下,如果您的路徑包含過濾後的字符(例如<),則最好使用htmlentities()而不是filter_var,表單將不會提交。

我更喜歡給一個字符串,<base href=>使用空值時可能會造成麻煩。 例子:

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post"> 
</form> 
+0

爲什麼一個而不是另一個,你能詳細說明一下嗎?非常感謝。 – MEM 2010-09-01 16:56:07

+0

路徑名中的字符'<'將被過濾,資源將無法訪問。 – Lekensteyn 2010-09-01 17:00:47

+0

這個答案至少缺少'ENT_QUOTES'。我真的不明白這一點 - 爲什麼不使用空字符串?逃避所有可能的輸入往往不是微不足道的,但使用空字符串是。 – eis 2015-02-15 08:51:48

0

如果我沒有記錯的Safari瀏覽器有/有與後者的問題,所以我用它丟棄。

+0

@nikic - 非常感謝。 @All - 任何人都可以確認上述情況是否仍然適用?或者如果這是一種常見的情況......我需要更多的證據來決定是否使用它。 :D – MEM 2010-09-01 16:57:55

+0

欲瞭解更多關於此的討論,請參閱[本](http://stackoverflow.com/questions/415234/forms-with-action)和[this](https://bugs.webkit。組織/ show_bug.cgi?ID = 19884)。總之,這個錯誤在2009年得到了解決。 – eis 2015-02-15 13:34:04

-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中找到而不是

/我穿越手指
:電子

+0

-1,SCRIPT_NAME不適用於重寫的URL。如果您檢查得很好,可以使用PHP_SELF。 – Lekensteyn 2010-09-01 16:59:11

+0

@Jan:filter_var或htmlentities沒有處理? – MEM 2010-09-01 16:59:19

+0

'$ _SERVER ['SCRIPT_NAME']'不適用於重寫的URL:s。如果在解析請求後接收頁面重定向,則XSS不是問題。 – chelmertz 2010-09-01 17:00:06

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