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漏洞扫描器, 数据结构, 无后门, 爬虫, 逆向工具