suyog1209shah-rgb/Mini-Web-Vulnerability-Scanner-

GitHub: suyog1209shah-rgb/Mini-Web-Vulnerability-Scanner-

一个手写数据结构实现的迷你 Web 漏洞扫描器,结合爬虫去重与 Tkinter 图形界面演示基础安全检测流程。

Stars: 0 | Forks: 0

# 迷你 Web 漏洞扫描器 import argparse import re import sys import time import threading import tkinter as tk from tkinter import ttk, scrolledtext, messagebox from urllib.parse import urlparse, urljoin, parse_qs, urlencode, urlunparse import html import requests from flask import Flask, request, make_response # ========================= #数据结构 # ========================= class Stack: """简单的基于数组的 LIFO 栈。""" ``` def __init__(self): self._data = [] def push(self, item): self._data.append(item) def pop(self): if self.is_empty(): raise IndexError("pop from an empty stack") return self._data.pop() def peek(self): if self.is_empty(): raise IndexError("peek from an empty stack") return self._data[-1] def is_empty(self): return len(self._data) == 0 def __len__(self): return len(self._data) ``` def _hash_string(key, table_size): """djb2 风格的字符串哈希,映射到表大小范围内。""" h = 5381 for ch in str(key): h = ((h * 33) + ord(ch)) & 0xFFFFFFFF return h % table_size class HashSet: """ 开放寻址哈希集合(线性探测),用于跟踪爬虫已经加入队列或访问过的 URL,在不使用 Python 内置 set 的情况下提供平均 O(1) 的成员检查。 """ ``` def __init__(self, capacity=256): self._capacity = capacity self._slots = [None] * capacity self._deleted = object() # tombstone marker self._count = 0 def _resize(self): old_slots = self._slots self._capacity *= 2 self._slots = [None] * self._capacity self._count = 0 for item in old_slots: if item is not None and item is not self._deleted: self.add(item) def add(self, item): if self._count / self._capacity > 0.6: self._resize() idx = _hash_string(item, self._capacity) start = idx while self._slots[idx] is not None and self._slots[idx] is not self._deleted: if self._slots[idx] == item: return False # already present idx = (idx + 1) % self._capacity if idx == start: self._resize() return self.add(item) self._slots[idx] = item self._count += 1 return True def contains(self, item): idx = _hash_string(item, self._capacity) start = idx while self._slots[idx] is not None: if self._slots[idx] is not self._deleted and self._slots[idx] == item: return True idx = (idx + 1) % self._capacity if idx == start: break return False def __len__(self): return self._count ``` class _ListNode: __slots__ = ("value", "next") def __init__(self, value): self.value = value self.next = None class LinkedList: """用于按发现顺序存储结果的单向链表。""" def __init__(self): self._head = None self._tail = None self._size = 0 ``` def append(self, value): node = _ListNode(value) if self._tail is None: self._head = node self._tail = node else: self._tail.next = node self._tail = node self._size += 1 def __len__(self): return self._size def __iter__(self): current = self._head while current is not None: yield current.value current = current.next ``` class HashTable: """ 分离链式哈希表,以 (漏洞类型, URL) 元组作为键,用于对发现的结果进行去重,从而避免同一个 URL 上的相同问题被重复报告。 """ ``` def __init__(self, capacity=128): self._capacity = capacity self._buckets = [None] * capacity # each bucket is a LinkedList of (key, value) def _bucket_index(self, key): return _hash_string(key, self._capacity) def put(self, key, value): idx = self._bucket_index(key) if self._buckets[idx] is None: self._buckets[idx] = LinkedList() bucket = self._buckets[idx] for existing_key, _ in bucket: if existing_key == key: return False # already recorded bucket.append((key, value)) return True def contains(self, key): idx = self._bucket_index(key) bucket = self._buckets[idx] if bucket is None: return False for existing_key, _ in bucket: if existing_key == key: return True return False def values(self): result = [] for bucket in self._buckets: if bucket is not None: for _, value in bucket: result.append(value) return result ```
标签:BeEF, CISA项目, Flask, GUI, Python, Web漏洞扫描器, 数据结构, 无后门, 爬虫, 逆向工具