表单php
表单的出现让用户和后台主机有了直接的交互,网站开始变的‘动态起来’,在HTML的各个标记符中,与PHP关系最为紧密的要属表单标记符了,常见的表单标记符有<form>、<input>、<button>、<select>、<option>、<textarea>等,其中<form>标记符是表单中最基础最重要的标记符了。全部提交给后台的数据必须包含在<form></form>之间。其用法以下:html
<form name="value" action="value" method="value"> </form>
其中 name 用来设置表单的命名,经过该命名,后台程序能够方便的访问表单数据。action属性用来设置表单处理程序的地址,通常为服务器端脚本文件(如PHP程序)或CGI程序的地址。method 属性用来定义数据从客户端浏览器传到服务器的传送方式,有两种:GET和POST。GET 传递方式是将表单数据添加到URL地址后面进行传递,不适合大数据的传递,由于有的浏览器会对信息的长度进行限制,太长的信息会被浏览器截断,从而致使信息的丢失。POST传递方式是将表单数据包含在表单主体中,一块儿传递给服务器,适合大量数据传输,并且不会在浏览器地址栏显示出表单数据,先对GET方来讲比较安全,在不指定method属性,浏览器会默认使用GET方式传输表单数据。java
get方法的实例:浏览器
<form action="<?=$_SERVER['PHP_SELF'] ?>" method="GET"> 用户名<input type="text" name="username"><br> 密码<input type="password" name="passwd"><br> <input type="submit" name="submit" value="提交"> </form> <?php if (isset($_GET['submit'])) { echo "<br>"; echo '用户名:'.$_GET['username']."<br>"; echo "密码:".$_GET['passwd'].'<br>'; } ?>
在没点击“”提交“”以前的页面安全
主要看网址;在点击提交以后服务器
网址改变了,并打印出了用户名和密码。xss
post方法的实例:函数
<form action="<?=$_SERVER['PHP_SELF'] ?>" method="POST"> 用户名<input type="text" name="username"><br> 密码<input type="password" name="passwd"><br> <input type="submit" name="submit" value="提交"> </form> <?php if (isset($_POST['submit'])) { echo "<br>"; echo '用户名:'.$_POST['username']."<br>"; echo "密码:".$_POST['passwd'].'<br>'; } ?>
当没有点击“提交”以前post
和get没有区别大数据
当点击“提交”以后
从上面的比较能够看出POST和GET的区别,两个在提交以后的网址上看出来POST要比GET方法安全些。
注意:
此处使用的action="<?=$_SERVER['PHP_SELF'] ?>"存在xss攻击,
当打开localhost/mytest/index.php时构造一个script函数就能够进行攻击
不如这个,当请求http://localhost/mytest/index.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo时
页面会出现这种状况:
查看源代码会发现
action的值变为咱们请求的地址了,这个是在写超全局变量时说过的,$_SERVER['PHP_SELF'] 这个函数会会原封不动的反映网址自己,因为html是一个标签类的语言,直接经过构造javascrip函数就能够进行xss攻击了。
解码以后的构造函数时:/"><script>alert('xss')</script><foo,
解决方法时1.用htmlentities($_SERVER[’PHP_SELF’])来替代简单的$_SERVER[’PHP_SELF’]
2.用$_SERVER[’REQUEST_URI’]来替代$_SERVER[’PHP_SELF’]
因此,form的action仍是不要留空的好。第二点,除了PHP_SELF以外,其余的$_SERVER变量也许也会有相似的漏洞,好比SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他们以前必定要先做htmlentities之类的