$服务器[";PHP\u SELF";]以明文形式发送用户凭据

$服务器[";PHP\u SELF";]以明文形式发送用户凭据,php,forms,security,Php,Forms,Security,我有一张表格 <form name="form1" method="post" action="<?php echo $_SERVER["PHP_SELF"];?>"> <p><label>User Name : </label> <input id="username" type="text" name="username" /></p> <p><label>

我有一张表格

<form name="form1" method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
    <p><label>User Name : </label>
    <input id="username" type="text" name="username" /></p>

     <p><label>Password&nbsp;&nbsp; : </label>
     <input id="password" type="password" name="password"/></p>

    <a class="btn" href="register.php">Signup</a>
    <input class="btn register" type="submit" name="submit" value="Login" />
</form>

显示您收到的漏洞警报是因为当客户端发送用户凭据时,web服务器正在使用
HTTP
而不是
HTTPS

这与您的PHP表单没有任何关系,无论您如何实现它,信息仍然以明文形式发送。例如:

POST /userinfo.php HTTP/1.1
Host: testphp.vulnweb.com

uname=test&pass=test
您可以看到以纯文本形式发送的
uname
pass
参数,任何人都可以拦截和读取这些参数

关于更多的信息,我鼓励你阅读下面的答案


当我们在这里的时候,您可能还想退房,并且您想让自己更加安全;-)

您误解了问题,并且误解了
$\u SERVER['PHP\u SELF']

首先,您的实际问题与
$\u服务器['PHP\u SELF']
无关,也与您的表单或PHP无关。问题是因为您的站点没有使用HTTPS进行保护。如果您使用的是HTTP,那么浏览器发送或接收的所有内容都以纯文本形式发送,并且可能被拦截。如果你希望你的流量是安全的,那么你需要使用HTTPS代替。这是您在服务器中配置的内容,完全独立于PHP代码中的任何内容


其次,您声明“我需要使用
$\u服务器['PHP\u SELF']
…”。事实并非如此:在此上下文中不需要使用
$\u服务器['PHP\u SELF']
$\u SERVER['PHP\u SELF']
是PHP程序中包含当前页面地址的全局变量。因此,如果您访问站点中的
userinfo.php
,那么
$\u服务器['php\u SELF']
将包含
/userinfo.php
。这是您在表单的
action
属性中输入的值。这很好,但请理解,在这种情况下,您实际上并不需要它,因为
action
的默认值是将表单提交回当前页面。换句话说,如果您完全省略
$\u SERVER['PHP\u SELF']
,那么表单的工作方式将完全相同。这与您的安全警告没有任何关系,但我觉得澄清这里发生的事情很重要,可以帮助您理解
$\u SERVER['PHP\u SELF']
并不是让表单工作的神奇东西;它只是一个带有页面名的字符串变量。

那么
$\u SERVER['PHP\u SELF']
的值是多少?扫描仪警告可能意味着您应该使用HTTPS而不是HTTP。@vitozev,value?PHP_SELF,返回当前执行脚本的文件名。我也使用了HTTPS。。。同样的问题。@votozev,我也试着用上面的表格来处理这个问题。if((空($_-SERVER['HTTPS'])|$_-SERVER['HTTPS']!='on')){header('Location:HTTPS://'。$_-SERVER['HTTP_-HOST']。$_-SERVER['REQUEST_-URI']);exit();}如果必须使用php_-self,请在使用它之前先转义。很明显,您的浏览器可以看到它发送的内容。您应该可以看到TCP/IP级别上使用Wireshark之类的工具进行的通信。