yuri yu

geek, programmer, web developer, acfuner

关于GITHUB刷星星的原理简析

今天看github的时候发现动态里有朋友关注了一个 https://github.com/prachi1210/starbot项目,看起来是能够无限刷github星星数量的。

程序是php写的,虽然没学过这个语言,但是估计基本能看懂其中原理,赶紧clone一个下来。

The Installion

关注的人还挺多的,主要程序文件只有main.py和unstar下面的unstar.py,需要的文件是names.txt和一些php的支持库

来看代码 get_random_word(file_name): # function to get random name from file total_bytes = os.stat(file_name).st_size random_point = random.randint(0, total_bytes) file = open(file_name) file.seek(random_point) file.readline() return file.readline() 这段很简单从文本文件里读出随机的名字

username = get_random_word(r"names.txt").lower() username = username.replace('\n','') username = username+str(random.randint(10000,99000)) # generate random username email = username+"@yahoo.com" password = "iambatman69" f.write(username+"\n") print(username) print(email) 然后构造出一个个假的邮箱地址,密码都是一样的

br.open("https://github.com/join?source=header-home") br.form = list(br.forms())[1] login_control = br.form.find_control("user[login]") if login_control.type == "text": login_control.value = username email_control = br.form.find_control("user[email]") if email_control.type == "text": email_control.value = email password_control = br.form.find_control("user[password]") if password_control.type == "password": password_control.value = password for control in br.form.controls: submit = control submit.readonly = False print ("Created new user") br.submit() 解析注册网页,注册很多个新用户

br.open("https://github.com/"+searchusername+"/"+searchreponame) br.form = list(br.forms())[4] for control in br.form.controls: star= control star.readonly = False print("Starred") br.submit() # Star the repo time.sleep(2) # Time delay to prevent too many requests i = i+1 用这个新用户去请求加星的网页,post一个加星的请求,然后歇一会儿继续上面的操作

恢复刷星呢,就是同样的原理把上一步存好的用户登陆一下解除加星操作即可

其实这个hack呢没有太多高深的技术,只是利用了github未激活邮箱也能加星的一个机制,可以在很短时间内刷榜,如下图

实际上呢这个功能对github影响不是太大,但是会误导一些用户,而且刷星会增加大量的垃圾账号

作者已经上报了这个漏洞,但是目前呢还没有官方的修复值得一提的是,作者本身这个项目并没有刷星