求教如何用HTTP方式静态测试方式一个IP地址是否畅通

博客分类:
构造 HTTP请求
实现“伪造来源
在阅读本文前,大家要有一个概念,在实现正常的 双方通信情况下,是无法伪造来源
的,也就是说,在
协议中,可以伪造数据包来源
,但这会让发送出去的数据包有去无回,无法实现正常的通信。这就像我们给对方写信时,如果写出错误的发信人地址,而收信人按信封上的发信人地址回信时,原发信人是无法收到回信的。
一些 攻击,如
就是利用了
的此缺陷而实现攻击的。《计算机网络》教材一书上,对这种行为定义为“发射出去就不管”。
因此,本文标题中的伪造来源 是带引号的。并非是所有
应用程序中存在此漏洞。
那么在 中,
又是如何造成的?如何防御之?
在理解这个原理之前,读者有必要对 协议有所了解。
是一个应用层协议,基于请求
响应模型。客户端(往往是浏览器)请求与服务器端响应一一对应。
请求信息由请求头和请求正文构成(在 请求时,可视请求正文为空)。请求头类似我们写信时信封上的基本信息,对于描述本次请求的一些双方约定。而请求正文就类似于信件的正文。服务器的响应格式,也是类似的,由响应头信息和响应正文构成。
为了解这个原理,可使用 或
浏览器插件
响应数据。
本文中,以 为例说明之。安装
浏览器后,
的工具栏上出现其图标,点击并运行
就会在浏览器下方显示出
的主界面。
点击左下角红色的“ ”按钮,并在地址栏输入
等页面打开后,选中一个请求,并在下方的
按钮中选择“
”,如图:
左边即是请求数据,右边即是服务器响应数据。左边的请求头均以回车换行结束,即“ ”
最后是一个空行(内容为
结束。而请求
中除第一行外,其它行均由
值组成,如
名称与值之间有冒号相隔,之间的空格是可有可无的。
那么,在 应用程序中,如何取得指定的请求
信息呢?这里使用
语言为例说明。对所有客户端请求
程序中取得其值的方式如下:
$_SERVER['HTTP_ HEADER_NAME ']
HEADER_NAME应该以换成对应的
名称,此项的规律是:全大写,连接线变成下划线。比如要取得客户端的
请求头,则使用
掌握这个规律,即可达到举一反三的效果。如要取得
信息,则使用
即可。也就是说,
数组中,以
开头的项均属于客户端发出的信息。
回归到 应用程序层,来源
的重要性不言而语,例如表单提交限制,频率等等均需要客户端
信息。使用流行的
中的代码片断:
private function _get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
如以下的JSP代码片段:public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
以上代码片段即是获取客户端 ,这段程序会尝试检查
根据之前的原理说明,以
均属于客户端发送的内容。那么,如果客户端伪造
,不就可以欺骗此程序,达到“伪造
”之目的?
那么如何伪造这项值?如果你会写程序,并了解 协议,直接伪造请求
即可。或者使用
插件即可。
按图示顺序号输入或点击相应按钮。 按钮这里变为红色
,说明设置成功。
这时,如果我们使用 访问其它网站,网站服务器就针接收到我们伪造的
严格意义上讲,这并不是程序中的漏洞。 为了保持较好的环境兼容性
包含有反向代理的
服务器环境,如
的前端代理
,如此处理是可以理解的。那么如何处理,才能杜绝这个问题呢?
服务器重新配置 为正确的值。
如对典型的 环境(
是否位于同一机器,并不妨碍此问题的产生)
进程直接通信:
切记, 是由
的参数,就代表了与当前
直接通信的客户端的
(是不能伪造的)。
再比如,存在中间层代理服务器的环境:
这种情况下,后端的 文件服务器上获取取的
永远是前端的
服务器的通信
服务器集群之间的通信,是可以信任的。我们要做的就是在离用户最近的前端代理上,强制设定 的值,后端所有机器不作任何设置,直接信任并使用前端机器传递过来的
即在最前端的 上设置:
^/static {
proxy_pass
proxy_set_header X-Forward-For $remote_
如果最前端(与用户直接通信)代理服务器是与 直接通信,则需要在其上设定:
location ~ "\.+\.php$" {
fastcgi_pass localhost:9000;
fastcgi_param
HTTP_X_FORWARD_FOR
的内置变量,代表了客户端真实(网络传输层)
。通过此项措施,强行将
设置为客户端
使客户端无法通过本文所述方式“伪造
LVS转发环境下,是否存在此问题?
LVS工作在网络层,不改变来源及目标
,更不可能更改应用层信息,故不存在此问题。如果有任何疑惑或需要帮助,请联系笔者信箱 。
存在此问题的程序
所有版本的 。以及其它可能未知的程序。
例如使用 进行
伪装之后再登录
,我们查看自己的个人资料中的“上次访问
”就发现就是我们伪装的数据。
可以说,互联网上存在此漏洞的网站实在是太多了。试试便知。那么对于存在此漏洞,并且使用 作限制的网站,一定要小心。
浏览 192416
浏览: 754452 次
来自: 北京
除了 libmysql 和 mysqlnd, 在 linux
很不错的!力荐!
楼主,你好,我配置了一个负载均衡集群两台服务器,都可以启动ke ...
完全不经过脑子考虑
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'显示查询自己的IP地址
121.235.40.101 China / Nanjing
如果没有全局代理或者VPN,左侧显示的IP就是您本机的IP。如果有,则显示的就是全局代理或者VPN的IP地址。
左侧IP就是您用来访问国外普通网站(没有被封的网站)的IP地址。
您无法访问谷歌网站
左侧如果没有显示一个IP地址,则说明您现在还不能科学上网,不能访问谷歌,Facebook,Twitter等国外网站。显示IP则表示可以科学上网,这个IP地址就是您用来科学上网的IP地址,通常是您的SS服务器的IP地址,或者VPN服务器,代理服务器的IP地址。Error_404_资源不存在
404. 抱歉! 您访问的资源不存在!
请确认您输入的网址是否正确,如果问题持续存在,请发邮件至contact@cnblogs.com与我们联系。怎么通过前端代码判断一个页面地址是否可以访问? - ITeye问答
如题
或者一个ip地址等等
需求是先判断是否可以访问,不能访问则自动跳转到另一个网站页面地址,就这样。
通过js或者juquery有什么好的处理方法没?多谢.
问题补充:&script src="jquery-1.7.1.min.js"&&/script&
&script type="text/javascript"&
var accUrl = 'http://192.168.7.237:886/v.html';
type: "get",
url: accUrl,
timeout: "10000",
cache: false,
success: function(data, textStatus) {
alert("s"+textStatus);
error: function(XMLHttpRequest, textStatus) {
alert("e"+XMLHttpRequest.status);
complete: function(XMLHttpRequest, textStatus) {
alert("c"+XMLHttpRequest.status);
&/script&
这样写总报0错误,未初始化是什么原因?
问题补充:ajax这样写不支持跨域,会弹出安全提示
用getjson 支持跨域,但是有不能捕获错误信息。
问题补充:小哀好困 写道这简单啊,先发一个ajax请求,看是success还是fail不就ok了
不支持跨域
这简单啊,先发一个ajax请求,看是success还是fail不就ok了
已解决问题
未解决问题主题:为没开发完成的接口做 mock,url 只能通过 localhost 连接到却不能用本地 ip 访问
目的:为一个不具有响应能力的接口,mock一个响应,伪造测试接口的响应。
现在需要对Aip:8088/services(运行mock程序在机器A)发起请求,我需要在这个响应信息里面写入信息。
现在的问题是:
我想让别人远程调用, Aip
只能用localhost ,修改为我本地ip:192.168.46.12地址之后接口响应链接超时。
&!--mock自定义测试模块--&
&!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/mockwebserver --&
&dependency&
&groupId&com.squareup.okhttp3&/groupId&
&artifactId&mockwebserver&/artifactId&
&version&3.6.0&/version&
&scope&test&/scope&
&/dependency&
testng测试方法
public void testName() throws Exception {
https://github.com/square/okhttp/tree/master/mockwebserver
https://www.jianshu.com/p/7dc3d12ac67f
MockResponse mockResponse = new MockResponse();
mockResponse.setHeader("Content-Type", "application/json");
mockResponse.setHeader("Connection", "keep-alive");
mockResponse.setHeader("User-Agent", "Mozilla/5.0 (M Intel Mac OS X 10.9; rv:48.0) Gecko/ Firefox/48.0");
mockResponse.setHeader("Host", "192.168.46.12");
mockResponse.setBody("{\"flag\":\"success\",\"message\":\"\"}");
mockResponse.setBodyDelay(5, TimeUnit.SECONDS);
server.enqueue(mockResponse);
server.setDispatcher(new QueueDispatcherImpl());
server.setDispatcher(new QueueDispatcher() {
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
switch (request.getMethod().toLowerCase()) {
case "post":
return new MockResponse().addHeader("aa", "1S").setBody("{\"flag\":\"success\",\"message\":\"\"}").setResponseCode(200);
case "get":
return new MockResponse().addHeader("aa", "2S").setBody("{\"flag\":\"faillure\",\"message\":\"\"}").setResponseCode(200);
return new MockResponse().setResponseCode(400);
server.start(8088);
server.url("/services");
TimerOparation.sleep(3000);
现在的解决思路:改一个start函数的写法
server.start(InetAddress.getByName("192.168.46.12"),8088);//localhost 不可访问,ip可访问
server.start(InetAddress.getByName("host"),8088);//localhost 可访问,ip不可访问
「原创声明:保留所有权利,禁止转载」
解决思路:
现在的解决思路:改一个start函数的写法
server.start(InetAddress.getByName("192.168.46.12"),8088);//localhost 不可访问,ip可访问
server.start(InetAddress.getByName("host"),8088);//localhost 可访问,ip不可访问
这是可以通过的,有么有更好的方式?
绑定 0.0.0.0 这个地址就好。
绑定 0.0.0.0,服务器创建tcp 监听套接字绑定INADDR_ANY,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到。
3、4楼正解!
绑定0.0.0.0,不管你电脑几个网卡,都能解析到
多谢各位大侠:
server.start(InetAddress.getByName("0.0.0.0"), 8088); //localhost 可访问,ip可访问
设置0.0.0.0是对的,看看对应的监听端口有没有启动。另外看看网络防火墙有没有阻止。
后方可回复, 如果你还没有账号请点击这里 。
第 23639 位会员 /
共收到 8 条回复

我要回帖

更多关于 软件测试方式 的文章

 

随机推荐