我剛剛意識到,對於一些奇怪的情況,我正在做我認爲是自我提交的內容,而沒有在動作表單屬性上引用PHP_SELF。
我很納悶,我們或者可以使用
<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?>
或者
action=""
?
如果不是,我們應該在什麼情況下考慮這個或另一個?
由於提前, MEM
我剛剛意識到,對於一些奇怪的情況,我正在做我認爲是自我提交的內容,而沒有在動作表單屬性上引用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文件,而不是用戶輸入。
問候
編輯:
兩個人指出,在使用時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中找到而不是。
/我穿越手指
:電子
-1,SCRIPT_NAME不適用於重寫的URL。如果您檢查得很好,可以使用PHP_SELF。 – Lekensteyn 2010-09-01 16:59:11
@Jan:filter_var或htmlentities沒有處理? – MEM 2010-09-01 16:59:19
'$ _SERVER ['SCRIPT_NAME']'不適用於重寫的URL:s。如果在解析請求後接收頁面重定向,則XSS不是問題。 – chelmertz 2010-09-01 17:00:06
<?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"/>
爲什麼一個而不是另一個,你能詳細說明一下嗎?非常感謝。 – MEM 2010-09-01 16:56:07
路徑名中的字符'<'將被過濾,資源將無法訪問。 – Lekensteyn 2010-09-01 17:00:47
這個答案至少缺少'ENT_QUOTES'。我真的不明白這一點 - 爲什麼不使用空字符串?逃避所有可能的輸入往往不是微不足道的,但使用空字符串是。 – eis 2015-02-15 08:51:48