获取网页参数
百度大家应该都用过,我们可以在百度查找一些想要了解的信息。但是我们需要告诉它,我们想要查找什么内容,这就需要我们告诉服务器我们需要查找与什么相关的内容,所以我们需要在搜索框输入我们想要查找的信息的关键字,这里输入的关键字就是给百度的服务器传入参数(以后简称传参),百度的服务器在接收了这个参数后,进行了一些处理,然后返回相关数据,比如我们输入“网安实验室”,百度就会给我们返回与“网安实验室”相关度较高的网页

可以看到,输入的关键字到了URL里面,像这种给服务器传参的方法,就是HTTP协议中的GET方法,在GET方法中,查询字符串(名称/值)是在URL中发送的。其格式如下:
/demo.php?name1=value1&name2=value2
一般来说,只用来向服务器获取信息,不向服务器传敏感数据。
要证明这是GET方法也很简单,可以在网页的任何位置鼠标右击,然后选择查看元素。
然后点击网络。

再点击重新载入,浏览器会重新加载该页面。

此时会看到很多请求,每个请求都显示了状态码(即状态一栏)、请求方法、请求文件、请求域名、请求原因、请求类型等。
在这些请求中,找到请求原因是document,请求类型是html的一行,这行就是搜索所发起的请求,后面的一些请求都是在请求完成后发起的,因为第一次请求完以后,有些如图片浏览器需要重新拉取。

在方法这一栏,可以看到都是GET,而且没有POST方法,所以我们可以推断我们给服务器传参是通过GET的方式传过去的。
在状态这一栏,有的可以看到状态有的是200,有的是304,这是HTTP协议中的状态码。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
在上图中还可以看到304,304表示自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
如果网页自请求者上次请求后再也没有更改过应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉浏览器自从上次访问后网页没有变更,进而节省带宽和开销,同时提高用户访问速度,因为对于浏览器来说,它需要把所有的资源下载到本地渲染后展示出来。
点击上面说到的那个请求,一般会显示在第一行,如果你做了其他操作导致有很多请求,可以先点击左上角的垃圾桶的图标,清空所有请求,再点击一次重新载入。然后在右边会显示
请求的详细内容,点击参数

在实验环境中,已经配置了sqli.com域名,现在通过代码来看下如何获取用户传过来的参数。在实验环境中打开火狐浏览器,访问sqli.com/get.php?id=12&name=admin。以后涉及到需要访问sqli.com的步骤,都在试验机中完成。
这里的?表示从?后面开始是传参数,当我们需要同时向服务器传多个参数的时候,需要使用&来连接多个参数。这里代表往服务器传了id、name这2个参数,值分别是12、admin。看代码更能直观地理解含义。

它的作用仅仅只是输出用户通过get方法传过来的id和name这2个参数的值。

var_dump用来打印变量的相关信息,包括表达式的类型与值。
然后访问sqli.com/get.php?id=12&name=admin&user=test&home=dd,访问后输出

可以看到,该变量的类型是array,也就是数组。在“=>”左边的是这个数组的键,右边的是值。
需要注意的是,我们传过去的参数,服务器会原封不动地接受参数

除了上面讲到的用GET方法给服务器传参,还有一种常用的传参方法,那就是POST。如果通过POST方法传参,那么参数是在http请求的请求体中,并且是经过URL encode编码的。
在登录的地方一般都是用POST方法,前面已经说过,如果包含敏感信息,就应该用POST方法。
还是打开百度,点击右上角的登录,弹出登录窗口:
在输入框中随便输入一些内容,如果需要验证码,需要输入正确的验证码。

提示输入的账号或密码有误,但是url并没有改变,也就是说并没有通过GET方法给服务器传参数,那么服务器是如何知道我们输入的账号和密码的呢?
这里虽然没有通过get方法传参,但是它通过post方法给服务器传参了。按F12或者鼠标右击页面选择查看元素进入开发人员工具,进入网络面板。再次输入账号密码以及验证码,在点击登录之前点击左上方的垃圾桶图标清空内容

查看c:\wamp\www\sqli目录下的post.php的源码

浏览器打开访问http://sqli.com/post.php.

为了更方便地了解post传参的位置,我们使用抓包工具来抓包,抓包工具通过修改浏览器代理的方法,来拦截浏览器发送的数据包,拦截数据包以后,可以进行修改数据包,丢弃数据包等操作。
机器已经安装好fiddler,点击桌面fiddler图标打开fiddler。
然后进入浏览器设置。
进入浏览器代理设置页面。

选择使用系统代理设置,点击确认。
重新访问http://sqli.com/post.php,此时可以在fiddler看到我们刚才的请求,由于我们没有设置拦截请求,所以默认直接允许请求了。

如果你是重新输入的url访问,或者之前没有点击提交,那么你可以看到这个请求是get请求而不是post,其中红框标记中的内容为http请求头。

其中第一行的GET说明这次请求是GET请求,后面的url表示本次请求的路径,最后面的HTTP/1.1说明HTTP 1.1版本。
由于我们没有在页面的输入框中填内容,所以该请求是GET请求,如果在输入框中填了内容,那么请求方式就会变成POST。

内容随便,填好以后先不点提交,在fiddler中,发现有多余的请求

先把这些请求清空掉。点击上方的X,然后选择remove_all。

可以看到,页面输入了我们输入的内容,同时fiddler中,也显示了我们本次请求,点击这个请求,查看该请求详情,同样来到raw的界面查看原始的http请求。

同样的,POST请求的数据,也需要经过url编码,可以在页面输入中文测试



浙公网安备 33010602011771号