C# 刷票程序
上个月有人让我帮忙投票,我想要不写个程序给他多刷点得了,虽然这事情有悖原则,就当娱乐了。。
先上图

1.分析
既然是网页投票,那肯定可以伪造HTTP请求来实现刷票。需要分析的就是该网站到底采用了哪些防止刷票的措施。原投票已经停了,我给大家描述一下。
(1).首先,这是公开给所有人的投票,没有必须是其用户的限制。
(2).先按F12查看网络情况,抓取投票的HTTP请求。点投票,截取,发现是Get方式,QuerySting值有一个随机数,一个候选人的编号,还有一个不清楚的值,初步猜测是用Cookie限制的。
(3).投完票再点投票,显示“你已经参与过,每天只能投一次”。
(4).在Chrome浏览器,设置,隐私设置,查看Cookie里,找该网站的Cookies,发现多了一个不清楚的,还有一个存着候选人编号的Cookie。把这俩都删了,再点投票,显示“投票失败”。虽然没投票成功,但是返回信息不一样了,说明肯定和Cookie有关。
(5).直接禁用该网站的Cookie,点投票还是显示“投票失败”。
(6).这时候仔细看了看QueryString那一长传不清楚的值,和Cookie里那个不清楚的值是相同的,投票按钮的事件应是不会变的,那估计页面加载的时候这俩就一起加载了。然后刷新页面,果然这个值变了。
(7).然后只删除存候选人编号的Cookie,保留这个Cookie,再点投票,成功了!
这个网站防刷票的措施比较简陋,只要仔细看看就能发现这个问题。然后我做了第一版。
2.构造HTTP请求
(1).获取SID。先把上面我说的那个一长串不清楚的值叫做SID吧,应该是为了验证Cookie是否起作用。
private string GetSid()
{
string url = "http://www.xxxxxx.com/xxxx/list-510-1.html";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
var res = req.GetResponse() as HttpWebResponse;
string sid= res.Headers.GetValues(5)[0].Split('=')[1];//把Response里第一个Cookie的的值从Headers里取出来。
return sid;
}
(2).根据浏览器抓取的HTTP请求模拟一个HTTP请求
private HttpWebRequest CreatHttp()
{
Random rnd = new Random();
string rndstr = rnd.NextDouble().ToString();//这是模仿QueryString里那个随机数的,没有估计也不影响结果
string url = "http://www.xxxxxx.com/xxxx/api.php?op=qgtp&id=32&sid=" + sid + "&r=" + rndstr;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
CookieCollection cookies = new CookieCollection();
//添加Cookie
cookies.Add(new Cookie("xxxxaction", sid, "/rail", "www.peoplerail.com"));
cookies.Add(new Cookie("xxxxxxxrand", rndstr, "/rail", "www.peoplerail.com"));
//存的也是随机数,生命周期只有2秒,所以分析的时候没发现,为了仿的逼真就也写上了
req.CookieContainer = new CookieContainer();
req.CookieContainer.Add(cookies);
req.Method = "GET";
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36";
req.Timeout = 10000;
req.Referer = "http://www.xxxxxx.com/xxxxxx/index.php?m=content&c=index&a=lists&catid=517&page=6";
req.KeepAlive = true;
req.Headers.Add("x-requested-with", "XMLHttpRequest");
//以上全部按照浏览器里抓取的结果一一对应
return req;
}
(3).刷票,并观察刷票状况。就是将返回的内容里找到票数,更新到TextBox上。
private void Go()
{
HttpWebRequest req = CreatHttp();
var res = req.GetResponse() as HttpWebResponse;
Stream st = res.GetResponseStream();//读取Response
StreamReader sr = new StreamReader(st);
string result = sr.ReadToEnd().ToString();
try
{
textBox1.Text = result.Split(':')[1].Split('<')[0];//从返回的内容里找出票数
}
catch
{
timer1.Stop();
label2.Text = "刷票暂停";
}
}
(4).设置循环。用For循环发请求的话,嗖一下几百次循环完了,而那边还没反应过来。中间用Sleep()的话,程序有时会陷入假死的状态,不能实时观察到刷票的情况。所以我们就用Winform自带的控件Timer,在页面加载的时候先停了,设置时间间隔,然后在Timer的事件里加上上面的方法就可以了。
private void Form1_Load(object sender, EventArgs e)
{
timer1.Stop();
timer1.Interval = 1000;
}
3.改进
上面几步完成后试着刷了一下,发现刷太快系统会返回“投票失败,疑似刷票”的提示,又调整了一下间隔时间。可过了两天,突然又不好使了,几番分析,发现是加了IP限制。找代理比较麻烦,所以就用宽带重连的方法不停的换IP吧。每刷一票断线重连一次就可以了。
public static string Connect(string UserS,string PwdS)
{
string arg = @"rasdial.exe 宽带连接" + " " + UserS + " " + PwdS;
return InvokeCmd(arg);
} public static string Disconnect()
{
string arg = string.Format("rasdial \"{0}\" /disconnect", "宽带连接");
return InvokeCmd(arg);
} private static string InvokeCmd(string cmdArgs)
{
string Tstr = "";
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start(); p.StandardInput.WriteLine(cmdArgs);
p.StandardInput.WriteLine("exit");
Tstr = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
return Tstr;
}
网页投票没有完善的防止刷票的措施,只能说是防君子不防小人,要想刷了总能找到空子。
C# 刷票程序的更多相关文章
- 用python写刷票程序
刷票一般要突破以下限制: 1.验证码识别 2.同一ip不可连续投票 解决办法 1.用tesseract工具,链接在此 https://code.google.com/p/tesseract-ocr/ ...
- python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- 由 12306.cn 谈谈高并发+高负载网站性能技术
12306.cn 网站挂了,被全国人民骂了.我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题.因为仓促,而且完全基于本人有限的经验和了解, 所以,如果有什么问题还请大家一起讨论 ...
- Python-爬取"我去图书馆"座位编码
原文地址:http://fanjiajia.cn/2018/11/22/Python-%E7%88%AC%E5%8F%96%E2%80%9D%E6%88%91%E5%8E%BB%E5%9B%BE%E4 ...
- 利用X-Forwarded-For伪造客户端IP漏洞成因及防范
内容转载自叉叉哥https://blog.csdn.net/xiao__gui/article/details/83054462 问题背景 在Web应用开发中,经常会需要获取客户端IP地址.一个典型的 ...
- 由csdn开源项目评选中闹出刷票问题想到投票程序的设计
帖子<#CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!> http://www.cnblogs.com/sanshi/p/3155946.html 网站投 ...
- 年关了,抛一个模拟ip刷票的php程序
<?php $ip = $_GET['ip'] ? $_GET['ip'] : '1.1.1.1'; $ipArr = explode(".", $ip); $ipArr[3 ...
- 防刷票机制研究和.NET HttpRequest Proxy
最近应朋友之约 测试他做的投票网站 防刷票机制能力如何,下面有一些心得和体会. 朋友网站用PHP写的,走的是HttpRequest,他一开始认为IP认证应该就差不多了.但说实话这种很low,手动更换代 ...
- #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!
特别声明: 此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错.但被作为道具 ...
随机推荐
- 自定义EditText实现一键删除数据
转载请注明出处http://blog.csdn.net/xiaanming/article/details/11066685 自定义EditText带删除小图标, 实现的功能: 点击删除小图标,删除当 ...
- 《Cortex-M0权威指南》之Cortex-M0技术综述
转载请注明来源:cuixiaolei的技术博客 Cortex-M0 处理器简介 1. Cortex-M0 处理器基于冯诺依曼架构(单总线接口),使用32位精简指令集(RISC),该指令集被称为Thum ...
- 【原创】mac 上如何安装及切换输入法
1. 安装输入法 刚购入mac mini一台,默认只有英文输入法,而自己用习惯了sogou输入法,于是就在网上下载安装了一个sogou拼音输入 for mac. 下载完毕后,在屏幕下方的dock区域右 ...
- ASP.NET缓存全解析1 转自网络原文作者李天平
有时候总听到网友说网站运行好慢,不知如何是好:有时候也总见到一些朋友写的网站功能看起来非常好,但访问性能却极其的差.没有“勤俭节约”的意识,势必会造成“铺张浪费”.如何应对这种情况,充分利用系统缓存则 ...
- CSS之上边栏
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- js 动态添加元素(div、li、img等)及设置属性
把一串 html 标签赋给一个 javascript 变量,除属性的值要用转义的双引号外,某些时候字符串还很长,显得有些复杂.如果用 js 动态添加元素,就不会有那么复杂的字符串出现,代码阅读性强一点 ...
- Java关键字介绍之this与super
1.什么是super?什么是this? super关键字表示超(父)类的意思.this变量代表对象本身. 2.使用super&this调用成员变量和方法 可以使用super访问父类被子类隐藏的 ...
- C#创建Windows服务入门图解(VS2010)
C#创建Windows服务入门图解(VS2010) Windows服务大家都知道,比如Audio.Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的.所 ...
- 实例介绍Cocos2d-x开关菜单
开关菜单是MenuItemToggle类实现的,它是一种可以进行两种状态切换的菜单.它可以通过下面的函数创建: static MenuItemToggle*createWithCallback ( ...
- IOS版应用商店应用源码
app商店 swift版 用swift编写的 应用商店 支持iPad iPhone利用了ios8过渡动画 支持横竖屏操作 源码下载: http://code.662p.com/view/11384.h ...