PHP基础之POST与GET
post 与 get区别
*.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。
*.Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节.
*.Post顾名思义,就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据。而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据。Post的信息作为http请求的内容,而Get是在Http头部传输的。
详细说明:
3、 Get 方式传输的数据量非常小,一般限制在 2 KB 左右,执行效率却比 Post 方法好;
建议:除非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法
6、Get是Form的默认方法。
GET用来获取资源
POST用来新建资源(也可以用于更新资源)
PUT用来更新资源
DELETE用来删除资源。
get和post的传值大小问题
get 是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。很多文章都说GET方式提交的数据最多只能是1024字节,而 实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制 是2083字节(2K+35字节)。对于其他浏览器,如FireFox,Netscape等,则没有长度限制,这个时候其限制取决于服务器的操作系统。即 如果url太长,服务器可能会因为安全方面的设置从而拒绝请求或者发生不完整的数据请求。
post 理论上讲是没有大小限制的,HTTP协议规范也没有进行大小限制,但实际上post所能传递的数据量大小取决于服务器的设置和内存大小。因为我们一般 post的数据量很少超过MB的,所以我们很少能感觉的到post的数据量限制,但实际中如果你上传文件的过程中可能会发现这样一个问题,即上传个头比较 大的文件到服务器时候,可能上传不上去,以php语言来说,查原因的时候你也许会看到有说PHP上传文件涉及到的参数PHP默认的上传有限定,一般这个值 是2MB,更改这个值需要更改php.conf的post_max_size这个值。PHP通过post/get获得数据会自动转义
根据服务器的不同配置,在通过post、get获得数据时可能出现一些类似于 ',"等特殊符合会被转义。这个问题主要由PHP魔术引号引起。PHP魔术引号包括 magic_quotes_gpc,magic_quotes_runtime,magic_quotes_sybase。
magic_quotes_gpc 总结如下:
我们可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
大家都知道php配置文件php.in ,如果里面的magic_quotes_gpc 配置被打开 那就是magic_quotes_gpc = on 懂点php的人都知道。
那我们就要对数值型的字段注入。
1 <?
2 if ( isset($_POST["f_login"] ) ){
3 //连接数据库
4 $t_strUid = $_POST["f_uid"];
5 $t_strPwd = $_POST["f_pwd"];
6 $t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1";
7 if ( $t_hRes = mysql_query($t_strSQL) ){
8 // 成功查询
9 }
10 }
11 ?>
1 <html>
2 <head>
3 <title>sample test</title>
4 </head>
5 <body>
6 <form method=post action="">
7 User ID: <input type="text" name="username" size=30><br>
8 Password: <input type=text name="userpwd" size=30><br>
9 <input type="submit" name="user_login" value="登录">
10 </form>
11 </body>
如果正确输入:
SELECT * FROM tbltable_users WHERE userid=admin AND password = 'admin' LIMIT 0,1
如果攻击者在username处,输入:admin OR 1 =1 #,则注入的sql语句如下:
SELECT * FROM table_users WHERE userid=admin OR 1 =1 # AND password = 'admin' LIMIT 0,1
下面就可以进行注入了.
在php.ini 中把display_errors 选项设为display_errors = off 这样就可以防止.
magic_quotes_runtime
如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off。
magic_quotes_sybase
如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ”。而双引号、反斜线 和 NULL 字符将不会进行转义。
由于不同服务器的配置不同,需要在代码中用get_magic_quotes_gpc() 检测服务器配置。
1 if(isset($_POST['c'])){
2 $s = $_POST['c'];
3 if(get_magic_quotes_gpc())
4 $s = stripslashes($s);//stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
5 //do something
6 }