Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import requests
- from bs4 import BeautifulSoup
- from tkinter import *
- # Функция для отображения иконки в зависимости от уровня угрозы
- def threat_level_icon(level):
- """
- Возвращает соответствующую иконку для уровня угрозы.
- :param level: Строка, представляющая уровень угрозы. Допустимые значения: 'низкий', 'средний', 'высокий', 'неизвестный'.
- :return: Строка с иконкой, которая соответствует уровню угрозы.
- """
- if level == 'низкий':
- return '✔'
- elif level == 'средний':
- return '?'
- elif level == 'высокий':
- return '!!!'
- else:
- return '???'
- # Функция для проверки заголовков безопасности HTTP
- def check_security_headers(url):
- """
- Проверяет наличие рекомендованных заголовков безопасности в ответе сервера.
- :param url: URL сайта, который будет проверен.
- :return: Результат проверки в виде строки с выводом о наличии или отсутствии каждого заголовка.
- """
- try:
- # Отправка GET-запроса на указанный сайт
- response = requests.get(url)
- headers = response.headers
- result = "Проверка заголовков безопасности:\n"
- # Рекомендуемые заголовки безопасности
- recommended_headers = {
- 'Content-Security-Policy': ("Рекомендуется использовать политику безопасности контента, "
- "которая определяет, какие ресурсы (например, скрипты, стили) "
- "могут загружаться на ваш сайт. Это помогает предотвратить "
- "атаки, такие как внедрение вредоносного кода.", 'высокий'),
- 'Strict-Transport-Security': ("Убедитесь, что включена HSTS (безопасность транспортного уровня), "
- "которая заставляет браузеры использовать только защищенные HTTPS-соединения. "
- "Это защищает данные от перехвата и модификации во время передачи.",
- 'высокий'),
- 'X-Content-Type-Options': ("Предотвратите автоматическое определение типа содержимого браузером. "
- "Без этого заголовка браузер может интерпретировать файлы неверно, "
- "что может привести к безопасности и уязвимостям.", 'средний'),
- 'X-Frame-Options': ("Предотвратите отображение вашего сайта в фреймах на других сайтах. "
- "Это защитит от атак, когда злоумышленники могут скрывать элементы вашего сайта "
- "и манипулировать действиями пользователей.", 'средний'),
- 'X-XSS-Protection': ("Включите защиту от межсайтовых скриптов. Этот заголовок помогает предотвратить "
- "атаки, при которых вредоносный код может быть выполнен на вашем сайте.", 'средний')
- }
- # Проверка наличия каждого заголовка
- for header, (explanation, threat_level) in recommended_headers.items():
- if header in headers:
- result += f"{threat_level_icon(threat_level)} {header}: Присутствует\n"
- else:
- result += f"{threat_level_icon(threat_level)} {header}: Отсутствует - {explanation}\n"
- return result
- except requests.RequestException as e:
- return f"Ошибка при проверке заголовков безопасности: {e}"
- # Функция для проверки наличия мета-тега X-UA-Compatible в HTML-коде
- def check_html_security(url):
- """
- Проверяет наличие мета-тега X-UA-Compatible в HTML-коде страницы.
- :param url: URL сайта для проверки.
- :return: Результат проверки в виде строки с выводом о наличии или отсутствии мета-тега.
- """
- try:
- # Отправка GET-запроса на сайт
- response = requests.get(url)
- soup = BeautifulSoup(response.text, 'html.parser') # Парсинг HTML-кода страницы
- meta_tags = soup.find_all('meta') # Поиск всех мета-тегов
- result = "\nПроверка HTML безопасности:\n"
- # Проверка наличия мета-тега X-UA-Compatible
- for tag in meta_tags:
- if tag.get('http-equiv') == 'X-UA-Compatible':
- result += "✔ Мета-тег X-UA-Compatible: Присутствует\n"
- break
- else:
- result += ("!!! Мета-тег X-UA-Compatible: Отсутствует - Рассмотрите возможность добавления "
- "'<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">' в ваш HTML-код. "
- "Этот тег помогает обеспечить правильное отображение сайта в браузере.")
- return result
- except requests.RequestException as e:
- return f"Ошибка при проверке HTML безопасности: {e}"
- # Функция для проверки распространенных уязвимостей (например, листинг директорий)
- def check_for_common_vulnerabilities(url):
- """
- Проверяет наличие распространенных уязвимостей, например, листинг директорий на сервере.
- :param url: URL сайта для проверки.
- :return: Результат проверки в виде строки с выводом о наличии уязвимости.
- """
- try:
- result = "\nПроверка распространенных уязвимостей:\n"
- # Проверка доступности директории /test_directory/
- response = requests.get(url + '/test_directory/')
- if response.status_code == 200:
- result += "!!! Обнаружен листинг директорий. Рассмотрите возможность защиты директорий, чтобы предотвратить раскрытие содержимого файлов и структур сайта.\n"
- else:
- result += "✔ Листинг директорий не обнаружен.\n"
- return result
- except requests.RequestException as e:
- return f"Ошибка при проверке распространенных уязвимостей: {e}"
- # Функция для обработки нажатия кнопки и выполнения всех проверок
- def check_for_bugs():
- """
- Обрабатывает нажатие кнопки "Проверить", выполняя все проверки безопасности на указанном сайте.
- Результаты выводятся в текстовом поле.
- """
- url = field.get() # Получаем URL с поля ввода
- if not url.startswith('http'):
- url = 'http://' + url # Добавляем "http://" если не указано
- text.delete(1.0, END) # Очищаем текстовое поле для новых результатов
- text.insert(END, f"Проверка сайта: {url}\n\n")
- # Выполняем все проверки безопасности
- text.insert(END, check_security_headers(url))
- text.insert(END, check_html_security(url))
- text.insert(END, check_for_common_vulnerabilities(url))
- # Создание главного окна приложения
- root = Tk()
- root.title("Проверка Безопасности Сайта")
- root.geometry("1920x1080")
- root.maxsize(1920, 1080)
- root.minsize(1920, 1080)
- # Заголовок окна
- title = Label(root, text="Введите ссылку сайта:", font=('Arial', 14, "bold"), width=40)
- title.grid(row=1, column=1, pady=25, padx=25)
- # Поле для ввода URL
- field = Entry(root, font=('Arial', 14, "bold"), width=120)
- field.grid(row=1, column=2)
- # Кнопка для запуска проверки
- button = Button(root, text="Проверить", font=('Arial', 14, "bold"), command=check_for_bugs)
- button.grid(row=2, column=1, columnspan=2, pady=25)
- # Текстовое поле для отображения результатов
- text = Text(root, font=('Arial', 14, "bold"), width=174, height=40)
- text.grid(row=3, column=1, columnspan=2, pady=15)
- # Запуск главного цикла интерфейса
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement