使用NSURLSessionConfiguration可以设置使用代理服务器做请求:

NSString* proxyHost = @"1.2.3.4";
NSNumber* proxyPort = [NSNumber numberWithInt: 10888];

// Create an NSURLSessionConfiguration that uses the proxy
NSDictionary *proxyDict = @{
                            @"HTTPEnable"  : [NSNumber numberWithInt:1],
                            (NSString *)kCFStreamPropertyHTTPProxyHost  : proxyHost,
                            (NSString *)kCFStreamPropertyHTTPProxyPort  : proxyPort,
                            
                            @"HTTPSEnable" : [NSNumber numberWithInt:1],
                            (NSString *)kCFStreamPropertyHTTPSProxyHost : proxyHost,
                            (NSString *)kCFStreamPropertyHTTPSProxyPort : proxyPort,
                            };

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
configuration.connectionProxyDictionary = proxyDict;


其中,还可以设置HTTPAdditionalHeaders,解决请求头的问题:

NSString *userPasswordString = [NSString stringWithFormat:@"%@:%@", user, password];
NSData * userPasswordData = [userPasswordString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64EncodedCredential = [userPasswordData base64EncodedStringWithOptions:0];
NSString *authString = [NSString stringWithFormat:@"Basic %@", base64EncodedCredential];
NSString *userAgentString = @"AppName/com.example.app (iPhone 5s; iOS 7.0.2; Scale/2.0)";

configuration.HTTPAdditionalHeaders = @{@"Accept": @"application/json",
                                        @"Accept-Language": @"en",
                                        @"Authorization": authString,
                                        @"User-Agent": userAgentString};


Authorization是解决页面需要认证的情况,比如登录TP-link的路由器,提示你需要用户名和密码
而如果代理服务器需要验证,则可以加上一条类似的头信息,key值不一样
把Authorization 改为 Proxy-Authorization 即可

这个情况可以用curl了解到:

引用
curl -v baidu.com -x 1.2.3.4:10888 --proxy-user abc:xyz
* About to connect() to proxy 1.2.3.4 port 10888 (#0)
*   Trying 1.2.3.4... connected
* Connected to 1.2.3.4 (1.2.3.4) port 10888 (#0)
* Proxy auth using Basic with user 'abc'
> GET http://baidu.com HTTP/1.1
> Proxy-Authorization: Basic abc..xyz=
> User-Agent: curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: baidu.com
> Accept: */*
> Proxy-Connection: Keep-Alive
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK


参考页面:
http://www.objc.io/issues/...
http://stackoverflow.com/q...
discuz获取真实ip的方法是这个:
source/class/discuz/discuz_application.php

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'];
  } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
    foreach ($matches[0] AS $xip) {
      if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
        $ip = $xip;
        break;
      }
    }
  }
  return $ip;
}


也就是说默认用REMOTE_ADDR,如果有HTTP_CLIENT_IP或HTTP_X_FORWARDED_FOR,则用相应的指定的IP地址。
这个对于用ip来限制重试密码的方式来说,很危险,伪造一个CLIENT_IP或者X_FORWARDED_FOR就可以让discuz认为的独立的ip,从而脱离限制。
discuz也没有白名单机制去限制这两个参数的使用,所以是个很危险的漏洞。

防御方式:对使用CLIENT_IP或者X_FORWARDED_FOR限制

如果明确不使用代理方式部署服务器,那可以考虑禁用这两个参数。
如果用代理的方式部署,可以实施白名单机制。
PHP修改代码即可,判别REMOTE_ADDR白名单再启用这两个参数。

Nginx也可以有白名单的方式,编译需要添加参数:
--with-http_realip_module
使用说明:http://nginx.org/en/docs/h...

可以对比一下几个方式搭配:
1 不使用realip_module
2 使用realip_module

客户端模式:
A 伪造client-ip直接访问目标服务器
B 伪造client-ip访问代理服务器
C 代理服务器不在realip_module白名单
代理服务器设置
proxy_set_header        CLIENT-IP       $remote_addr;


为此,我们需要先修改PHP代码,以便获知PHP获得的参数:

private function _get_client_ip() {
  $ip = $_SERVER['REMOTE_ADDR'];
  if (isset($_GET['debug_ip'])) {
    exit('REMOTE_ADDR:'.$ip.' / CLIENT_IP:'.$_SERVER['HTTP_CLIENT_IP'].' / X_FORWARDED_FOR:'.$_SERVER['HTTP_X_FORWARDED_FOR']."\n");
  }
  $white_lists = array(
    '60.191.x.y',
    '123.157.x.y',
    '222.187.x.y',
    '121.40.x.y',
    );
  if (!in_array( $ip, $white_lists)) {
    return $ip;
  }
  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'];
  } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
    foreach ($matches[0] AS $xip) {
      if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
        $ip = $xip;
        break;
      }
    }
  }
  return $ip;
}


测试组合结果:
域名和ip因为隐私做了替换
引用
1A

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw3.aslibra.com/?debug_ip=1"
REMOTE_ADDR:114.243.204.152 / CLIENT_IP:2.3.4.5 / X_FORWARDED_FOR:

1B

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw4.aslibra.com/?debug_ip=1"
REMOTE_ADDR:222.187.x.y / CLIENT_IP:114.243.204.152 / X_FORWARDED_FOR:

2A

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw3.aslibra.com/?debug_ip=1"
REMOTE_ADDR:114.243.204.152 / CLIENT_IP:2.3.4.5 / X_FORWARDED_FOR:

2B

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw4.aslibra.com/?debug_ip=1"
REMOTE_ADDR:114.243.204.152 / CLIENT_IP:114.243.204.152 / X_FORWARDED_FOR:

2C 222.187.x.y 不在nginx的白名单的情况

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw4.aslibra.com/?debug_ip=1"
REMOTE_ADDR:222.187.x.y / CLIENT_IP:114.243.204.152 / X_FORWARDED_FOR:


测试结果说明什么问题?
1A 客户端ip 和设定的ip都收到
1B 代理ip和客户端ip
2A 客户端ip和设定的ip
2B 客户端ip和客户端ip
2C 代理ip和客户端ip

说明,realip_module传递给PHP后端REMOTE_ADDR就是合法的CLIENT_IP,而CLIENT_IP却没有清空
那问题来了,它没法解决discuz检查CLIENT_IP的漏洞,如果检查就没戏
所以,PHP加一份白名单很有必要哦!
引用
/usr/local/coreseek/bin/indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory


可以先找到文件在哪里

locate libmysqlclient.so.18
/alidata/server/mysql-5.6.21/lib/libmysqlclient.so.18
/alidata/server/mysql-5.6.21/lib/libmysqlclient.so.18.1.0


我们可以把路径加入ld.so.conf
vi /etc/ld.so.conf
加入一行
/alidata/server/mysql-5.6.21/lib

保存后执行 ldconfig -v 可以更新
然后执行命令就没问题了
《编写高质量IOS与OS X代码的52个有效方法》

看完这本书,感觉还是外国人写的书讲述问题的方式比较不错。
讲述问题很细致,例子选的精巧,有深度,抓住重点,非常好。

block的讲述非常好,让我搞明白了使用block的好处。
block让代码逻辑更清晰,实现一些复杂的依赖关系的任务。
NSCache的使用技巧也不错,平时没有了解到,提到就觉得很实用。
对内存管理方面很有总结,各样的内存泄漏方式都有描述,很翔实。

有兴趣的同学可以买了看,推荐。
注:碰到同样的问题,这样是解决了

在项目中用模拟器中进行音频录音方面的调试,碰到一个莫名的问题,就是在ios6的模拟器中运行没问题,但是在ios7的模拟下出以下错误提示:

xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误

看了半天,没发现程序代码有什么错误,但在在移除所有断点后,程序在ios7模拟器下运行正常了。原来是在调试时加了“All Exceptions” Breakpoint, 移除后一切正常,猜想是不是ios7模拟器下catch到了异常导致了程序的异常中断。

http://www.xuebuyuan.com/1741105.html
分页: 3/133 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐