欢迎光临!欢迎分享转载本站文章,尊重原创,转载请注明出处!

【赞助】免费wifi 随时上网

2017年9月5日 没有评论

 

===>>【点此下载wifi管家】<<===

 

 

 

===>>【点此下载wifi管家】<<===

 

分类: 工具 标签:

分享一段解析HTTP请求消息头的C++代码

2017年10月16日 没有评论

Http请求消息说白了就是\r\n和:分割的一串字符,解析消息头部考察的是基本的字符串操作。当然实际应用中可以使用boost::splitl来辅助处理。

请求消息如下:

GET /suggest?word=http://t.&callback=suggest360&encodein=utf-8&encodeout=utf-8&_h=18.js&outfmt=json HTTP/1.1
Host: sug.so.360.cn:8188
Cache-Control: no-cache
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 QIHU 360SE
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Accept: */*
Cookie: vjuids=a8f919aab.156c5a83b9b.0.3db0cfd7; shenhui12=w:1; gn12=w:1; sci12=w:1; UM_distinctid=15c7168d4207f-083dc20ce-4349052c-100200-15c7168d42346; sohutag=8HsmeSc5NSwmcyc5NSwmYjc5MSwmYSc5NywmZjc5NCwmZyc5NCwmbjc5NjwmaSc5NSwmdyc5NCwmaCc5NCwmYyc5NCwmZSc5NCwmbSc5NCwmdCc5NH0; _muid_=1501816572977065; _ga=GA1.2.1163329499.1503043055; beans_mz_userid=62mbb0GPSAy5; debug_test=sohu_third_cookie; lastpopup=2017-8-19; vjlast=1472194952.1505800087.21; IPLOC=CN1100; SUV=1608221725397504
Range: bytes=17276560-19912545
Referer: http://offp.download.icartoons.cn:8188/client_package/v_4125/7825

解析代码如下:

string cmdLine=””;  //存储请求行
map<string, string> kvs;  //存储消息头各字段和值

size_t pos=0, posk=0, posv=0;
string k=””, v=””;
char c;
while(pos != http.size())  //http保存了上述GET请求
{
c=http.at(pos);
if(c == ‘:’)
{
if(!cmdLine.empty() && k.empty())  //非请求行,且消息头名称未解析
{
k = http.substr(posk, pos-posk);  //存储消息头名称
posv = pos+2;  //调过冒号和空格
}
}
else if(c == ‘\r’ || c==’\n’)  //行尾
{
if(k.empty() && cmdLine.empty())  //尚未解析到消息头字段名称,且请求行也未解析过
{
cmdLine = http.substr(posk, pos-posk);  //本行应是请求行,保存之
}
else
{
if(!k.empty() && v.empty())  //已解析了消息头字段名称,尚未解析字段值
{
v = http.substr(posv, pos-posv);  //存储字段值
}
}
posk=pos+1;
}

if(!k.empty() && !v.empty() && !cmdLine.empty())
{
kvs.insert(make_pair(k,v));  //保存消息头字段名称和值
k=””;
v=””;
}
++pos;
}

需要注意的是:消息头各字段的值中也有可能出现冒号。

分类: C/C++, 开发 标签: ,

pyquery:Python版的jQuery,HTML页面解析好工具

2017年9月20日 没有评论

# coding=utf-8

import requests
from pyquery import PyQuery as pq

head_req = {
‘User-Agent':’Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30′,
‘Referer':’http://www.baidu.com/’
}

url = ‘http://zhixing.bjtu.edu.cn/portal.php’
r = requests.get(url, headers=head_req)

page = pq(r.content)
title = page.find(‘title’)
print title.html()

kw = page.find(‘meta[name=”keywords”]’)
print kw.attr(‘content’)

分类: Python, 开发 标签: ,

阿里云OSS python sdk使用简介

2017年9月20日 没有评论

阿里云OSS可以方便的存储各类数据,配合CDN的使用,能够极大提高数据的访问效率。向OSS存放数据时一般要登陆阿里云,再进入OSS管理控制台,选择bucket上传文件。手动操作步骤还是有点繁琐的。好在阿里为我们提供了api和sdk,能够实现自动化操作。

这里简单介绍一下阿里云OSS-Python-SDK的使用方法。

  1. 安装:pip install oss2
  2. 检查:在Python命令行中输入import oss2;oss2.__version__。安装成功则会显示版本号
  3. 在OSS管理控制台中创建AccessKey
    1. 进入OSS控制管理台首页,点右上侧的AccessKey按钮,打开AccessKey管理控制台
    2. 点击提示框中的“开始使用子用户AccessKey”–>设置用户名–>设置权限,仅选择AliyunOSSFullAccess即可–>开始创建用户–>验证手机号后就创建成功了
    3. 在“访问控制台RAM”页面的“用户管理”中可看到刚才创建的用户,点击用户名
    4. 在“用户详情”页的下边能看到“用户AccessKey”,默认已生成了一个AccessKey
    5. 我们可以随时点右侧的“创建AccessKey”来生成新的AccessKey,创建成功会显示AccessKeyID和AccessKeySecret。这两个参数是通过SDK访问OSS必需的。
  4. SDK的使用,可参考官方手册快速入门,也可以通过官方提供的示例进行测试。下边的代码演示了如何上传一个文档对象到OSS。

    # -*- coding: utf-8 -*-
    import os
    import shutil

    import oss2

    # 首先初始化AccessKeyId、AccessKeySecret、Endpoint等信息。
    # 把诸如“<你的AccessKeyId>”替换成真实的AccessKeyId等。
    #
    # 以上海区域为例,Endpoint可以是:
    # http://oss-cn-shanghai.aliyuncs.com
    # https://oss-cn-shanghai.aliyuncs.com
    # 分别以HTTP、HTTPS协议访问。
    access_key_id = os.getenv(‘OSS_TEST_ACCESS_KEY_ID‘, ‘LTdsa52Gjv0Nt6′)
    access_key_secret = os.getenv(‘OSS_TEST_ACCESS_KEY_SECRET‘, ‘dijw14JxbYeeKdaght3DG4w0k96KQBHu’)
    bucket_name = os.getenv(‘OSS_TEST_BUCKET‘, ‘my-bucket’)
    endpoint = os.getenv(‘OSS_TEST_ENDPOINT‘, ‘oss-cn-shanghai.aliyuncs.com’)

    # 确认上面的参数都填写正确了
    for param in (access_key_id, access_key_secret, bucket_name, endpoint):
    assert ‘<‘ not in param, ‘请设置参数:’ + param

    # 创建Bucket对象,所有Object相关的接口都可以通过Bucket对象来进行
    bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)

    # 上传文件 “本地座右铭.txt” 到OSS,并命名为 “云上座右铭.txt”
    with open(oss2.to_unicode(‘本地座右铭.txt’), ‘rb’) as f:
    bucket.put_object(‘云上座右铭.txt’, f)

分类: Python, 开发 标签: , , ,

Httpry:简明http抓包工具

2017年7月27日 没有评论

tcpdump是流量分析时最常用的抓包工具,功能很强大。抓取http get交互消息的常用命令是:

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -w eth0-http.pcap

通常我们会把抓取的http包保存成文件,然后用wireshark打开分析。

有时候,我们不需要对流量观察得特别深入,仅仅是看一下有什么样的流量,不需要存盘分析。

使用tcpdump的话输出内容不直观,比如wget http://www.baidu.com/的输出如下:

15:05:27.837705 00:16:3e:04:af:53 > ee:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 165: (tos 0x0, ttl 64, id 18764, offset 0, flags [DF], proto TCP (6), length 151)
139.129.205.48.53353 > 220.181.112.244.80: Flags [P.], cksum 0xa6e5 (incorrect -> 0xe0b0), seq 2930938556:2930938667, ack 65362085, win 115, length 111
0x0000: 4500 0097 494c 4000 4006 4ab9 8b81 cd30 E…IL@.@.J….0
0x0010: dcb5 70f4 d069 0050 aeb2 92bc 03e5 58a5 ..p..i.P……X.
0x0020: 5018 0073 a6e5 0000 4745 5420 2f20 4854 P..s….GET./.HT
0x0030: 5450 2f31 2e30 0d0a 5573 6572 2d41 6765 TP/1.0..User-Age
0x0040: 6e74 3a20 5767 6574 2f31 2e31 3220 286c nt:.Wget/1.12.(l
0x0050: 696e 7578 2d67 6e75 290d 0a41 6363 6570 inux-gnu)..Accep
0x0060: 743a 202a 2f2a 0d0a 486f 7374 3a20 7777 t:.*/*..Host:.ww
0x0070: 772e 6261 6964 752e 636f 6d0d 0a43 6f6e w.baidu.com..Con
0x0080: 6e65 6374 696f 6e3a 204b 6565 702d 416c nection:.Keep-Al
0x0090: 6976 650d 0a0d 0a ive….
15:05:27.860678 ee:ff:ff:ff:ff:ff > 00:16:3e:04:af:53, ethertype IPv4 (0x0800), length 449: (tos 0x60, ttl 48, id 47418, offset 0, flags [DF], proto TCP (6), length 435)
220.181.112.244.80 > 139.129.205.48.53353: Flags [P.], cksum 0x6a94 (correct), seq 65362085:65362480, ack 2930938667, win 772, length 395
0x0000: 4560 01b3 b93a 4000 3006 e94e dcb5 70f4 E`…:@.0..N..p.
0x0010: 8b81 cd30 0050 d069 03e5 58a5 aeb2 932b …0.P.i..X….+
0x0020: 5018 0304 6a94 0000 4854 5450 2f31 2e31 P…j…HTTP/1.1
0x0030: 2032 3030 204f 4b0d 0a53 6572 7665 723a .200.OK..Server:
0x0040: 2062 6665 2f31 2e30 2e38 2e31 380d 0a44 .bfe/1.0.8.18..D
0x0050: 6174 653a 2054 6875 2c20 3237 204a 756c ate:.Thu,.27.Jul
0x0060: 2032 3031 3720 3037 3a30 353a 3237 2047 .2017.07:05:27.G
0x0070: 4d54 0d0a 436f 6e74 656e 742d 5479 7065 MT..Content-Type
0x0080: 3a20 7465 7874 2f68 746d 6c0d 0a43 6f6e :.text/html..Con
0x0090: 7465 6e74 2d4c 656e 6774 683a 2032 3338 tent-Length:.238

此时,httpry是一个很好的替代工具。使用httpry捕获上述请求,输出如下:

2017-07-27 15:08:50 139.129.205.48 220.181.112.244 > GET www.baidu.com / HTTP/1.0 – –
2017-07-27 15:08:50 220.181.112.244 139.129.205.48 < – – – HTTP/1.1 200 OK

简单明了。

  • 安装
    • 下载源码,make && make install就ok了
    • 这个程序依赖libpcap-devel库,没有的话就yum install -y libpcap-devel
  • 使用
    • 最简单的:httpry -i eth0
    • 支持过滤http请求方法:httpry -i eth0 -m GET
    • 支持保存抓包:httpry -i eth0 -o eth0-http.log
    • 可以指定packet filter:httpry -i eth0 ‘dst host www.baidu.com’
分类: 工具 标签: , , ,

一个从MongoDB中导出给定日期范围内数据的shell脚本

2017年6月29日 没有评论

前几天介绍了使用mongoexport的使用方法,结合date命令的使用,这里给出一个完整的脚本,用来从MongoDB中导出某个日期范围内的数据,数据导出后从MongoDB中进行删除

#!/bin/sh
d1=$1 #the beginning date, 2017-06-28

d1=`date -d $d1 +%F`

 

d2=`date -d $d1 +%s`
d2=`expr $d2 + 86400` #One day
d2=`date -d @$d2 +%F`

qj='{“time”:{$gte:ISODate(“‘”$d1″‘T00:00:00Z”)}, “time”:{$lt:ISODate(“‘”$d2″‘T00:00:00Z”)}}’
./mongoexport –db testDB –collection testColl –query=”$qj” –fields=”userId,userName” –type=”csv” –out results”-$d1″ –noHeaderLine

echo ‘var db = connect(“testDB”);’ > delete.js
echo ‘db.testColl.remove({“time”:{$gte:ISODate(“‘”$d1″‘T00:00:00Z”)}, “time”:{$lt:ISODate(“‘”$d2″‘T00:00:00Z”)}})’ >> delete.js
./mongo delete.js

备注:如果MongoDB使用的不是默认端口27017,上面的脚本里mongoexport和mongo都需要增加–port参数,并且delete.js中的connect方法也需要指定端口,指定方式为:

var db = connect(“127.0.0.1:port/testDB”);

分类: MongoDB, Shell 标签: ,

shell中计算偏移日期的方法

2017年6月29日 没有评论

给定一个日期,如何在shell中计算前几天或者后几天的日期?

方法如下:

d1=`date +%F` #给定当前日期

offset=2 #计算两天后的日期

d1s=`date -d $d1 +%s` #d1 in seconds, since 1970-01-01 00:00:00 UTC

offset_s=`expr 86400 \* $offset` #offset in seconds

d2s=`expr $d1s + $offset_s` #d2 in seconds

d2=`date -d @$d2s + %F` #get d2

主要原理就是通过date -d +%s来实现日期和秒之间的互转,详情man date一下吧。

分类: Shell 标签: ,

Android应用商店apk下载重定向测试

2017年6月24日 没有评论

首先声明:本文仅用于学习测试,不进行任何目的的实际应用,请勿用作非法用途!

服务器对下载的处理一般有3种方法:

  • 直接返回下载文件内容
  • 进行简单校验,将下载请求302重定向至下载文件
  • 进行简单校验,通过200返回下载URL和校验数据,客户端将文件下载完成后再次进行校验

目前大部分应用商店是通过第三种方法处理apk下载的,这样可以初步避免客户端发起的下载请求被重定向。但只要数据是通过http协议进行传输的,都不能完全避免被重定向。

比如,返回给客户端的校验数据也是可以被抓包工具捕获的,这样就提供了被修改的可能。经过认真分析比对下载过程,可以修改下载URL和校验数据,让手机应用商店下载修改后的URL,并使用伪校验数据来校验。这样就有可能将apk重定向至非法应用!

我们测试了一款appstore,发现它的下载过程分三步:

  • appstore发起下载请求,服务器通过200返回下载URL和校验数据
  • appstore再次发起下载请求,服务器通过302返回真正的下载地址
  • appstore第三次发起下载请求,下载apk后进行校验
  • 校验内容包括但不限于:文件名称、大小、md5、版本

测试过程中遇到一些问题及对应的解决办法

  • 测试环境不佳,只能在重定向服务器所在的网段内能100%捕获到下载请求:在重定向服务器上搭建nginx透明代理,将测试客户端上特定的域名解析到代理服务器
  • 使用Android模拟器测试无效果,没有办法解析域名,无法捕获到下载请求:使用真机测试
  • 在手机上下载应用商店,修改手机上的hosts文件,可以捕获到下载请求
  • 不同APP下载后无法进行安装:只能进行同一APP的下载重定向。

由于各应用商店厂商也在不断做安全调整,所以需要实时跟踪下载协议,更新重定向策略。

本文亦提醒应用商店厂商及时调整下载策略,避免流量损失。

分类: 开发 标签: ,

使用mongoexport导出某个时间段内的数据

2017年6月24日 没有评论

mongoexport是MongoDB自带一个数据导出工具,可以方便的导出查询结果。现通过一条命令来演示使用方法,特别是如何查询某个时间段内的数据。

数据库名称:testDB

集合名称:testColl

查询条件:2017-06-12当天的所有记录

导出列:userId, userName

导出文件类型:csv,不含“表头”

./mongoexport –db testDB –collection testColl –query='{“time”:{$gte:ISODate(“2017-06-12T00:00:00Z”)}, “time”:{$lt:ISODate(“2017-06-13T00:00:00Z”)}}’ –fields=”userId,userName” –type=”csv” –noHeaderLine –out results

请注意加粗参数的用法。

–query:指定查询条件,多个条件可以进行and或or的逻辑组合。此处组合了起止时间。

–fields:指定输出字段,默认输出全部字段

–noHeaderLine:不输出字段名称

官方文档指出:export不适于用作生产环境的全库数据备份,请使用mongodump进行全库备份。

分类: MongoDB 标签:

多网卡环境下VMware虚拟机桥接宿主机网络不通的解决办法

2017年5月22日 没有评论

如题所述,一般都是在个人电脑上安装VMwareWorkStation,然后装几个虚拟机进行测试。自己的电脑一般都是一个网卡,直接将虚拟机桥接到物理网卡上就行了,无须过多设置。

今天在一台Windows服务器上装了一个VMwareWorkStation,通过桥接将虚拟机连上宿主机后,网络一直不通。

service network restart命令提示网线未接入或者网卡设备未激活之类的信息,但宿主机明明是可以上网的。搜了好久终于找到原因和解决办法:

  • 宿主机上有多块网卡,只有一个网卡插入了网线
  • VMware桥接选项默认自动选择了一块网卡,恰好不是可以上网的网卡

这种情况下,需要手动编辑虚拟网络,步骤如下:

  • VMware菜单中选择“编辑”->“虚拟网络编辑器”,打开虚拟网络编辑器
  • 选中“VMnet0”,如果看不到“VMnet0”可以通过“添加网络”手动将VMnet0添加进来
  • 在下边的“桥接模式”中,通过下拉选择可以联网的网卡,保存设置
  • 重启虚拟机网络
分类: 资料 标签: