![](/img/trans.png)
[英]Form submission with action=“<?=$_SERVER['PHP_SELF']?>” causing logout
[英]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.