Advertisement
k1alo

Finally

Nov 22nd, 2024
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.03 KB | None | 0 0
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from tkinter import *
  4.  
  5.  
  6. # Функция для отображения иконки в зависимости от уровня угрозы
  7. def threat_level_icon(level):
  8.     """
  9.    Возвращает соответствующую иконку для уровня угрозы.
  10.  
  11.    :param level: Строка, представляющая уровень угрозы. Допустимые значения: 'низкий', 'средний', 'высокий', 'неизвестный'.
  12.    :return: Строка с иконкой, которая соответствует уровню угрозы.
  13.    """
  14.     if level == 'низкий':
  15.         return '✔'
  16.     elif level == 'средний':
  17.         return '?'
  18.     elif level == 'высокий':
  19.         return '!!!'
  20.     else:
  21.         return '???'
  22.  
  23.  
  24. # Функция для проверки заголовков безопасности HTTP
  25. def check_security_headers(url):
  26.     """
  27.    Проверяет наличие рекомендованных заголовков безопасности в ответе сервера.
  28.  
  29.    :param url: URL сайта, который будет проверен.
  30.    :return: Результат проверки в виде строки с выводом о наличии или отсутствии каждого заголовка.
  31.    """
  32.     try:
  33.         # Отправка GET-запроса на указанный сайт
  34.         response = requests.get(url)
  35.         headers = response.headers
  36.  
  37.         result = "Проверка заголовков безопасности:\n"
  38.  
  39.         # Рекомендуемые заголовки безопасности
  40.         recommended_headers = {
  41.             'Content-Security-Policy': ("Рекомендуется использовать политику безопасности контента, "
  42.                                         "которая определяет, какие ресурсы (например, скрипты, стили) "
  43.                                         "могут загружаться на ваш сайт. Это помогает предотвратить "
  44.                                         "атаки, такие как внедрение вредоносного кода.", 'высокий'),
  45.             'Strict-Transport-Security': ("Убедитесь, что включена HSTS (безопасность транспортного уровня), "
  46.                                           "которая заставляет браузеры использовать только защищенные HTTPS-соединения. "
  47.                                           "Это защищает данные от перехвата и модификации во время передачи.",
  48.                                           'высокий'),
  49.             'X-Content-Type-Options': ("Предотвратите автоматическое определение типа содержимого браузером. "
  50.                                        "Без этого заголовка браузер может интерпретировать файлы неверно, "
  51.                                        "что может привести к безопасности и уязвимостям.", 'средний'),
  52.             'X-Frame-Options': ("Предотвратите отображение вашего сайта в фреймах на других сайтах. "
  53.                                 "Это защитит от атак, когда злоумышленники могут скрывать элементы вашего сайта "
  54.                                 "и манипулировать действиями пользователей.", 'средний'),
  55.             'X-XSS-Protection': ("Включите защиту от межсайтовых скриптов. Этот заголовок помогает предотвратить "
  56.                                  "атаки, при которых вредоносный код может быть выполнен на вашем сайте.", 'средний')
  57.         }
  58.  
  59.         # Проверка наличия каждого заголовка
  60.         for header, (explanation, threat_level) in recommended_headers.items():
  61.             if header in headers:
  62.                 result += f"{threat_level_icon(threat_level)} {header}: Присутствует\n"
  63.             else:
  64.                 result += f"{threat_level_icon(threat_level)} {header}: Отсутствует - {explanation}\n"
  65.  
  66.         return result
  67.  
  68.     except requests.RequestException as e:
  69.         return f"Ошибка при проверке заголовков безопасности: {e}"
  70.  
  71.  
  72. # Функция для проверки наличия мета-тега X-UA-Compatible в HTML-коде
  73. def check_html_security(url):
  74.     """
  75.    Проверяет наличие мета-тега X-UA-Compatible в HTML-коде страницы.
  76.  
  77.    :param url: URL сайта для проверки.
  78.    :return: Результат проверки в виде строки с выводом о наличии или отсутствии мета-тега.
  79.    """
  80.     try:
  81.         # Отправка GET-запроса на сайт
  82.         response = requests.get(url)
  83.         soup = BeautifulSoup(response.text, 'html.parser')  # Парсинг HTML-кода страницы
  84.         meta_tags = soup.find_all('meta')  # Поиск всех мета-тегов
  85.  
  86.         result = "\nПроверка HTML безопасности:\n"
  87.  
  88.         # Проверка наличия мета-тега X-UA-Compatible
  89.         for tag in meta_tags:
  90.             if tag.get('http-equiv') == 'X-UA-Compatible':
  91.                 result += "✔ Мета-тег X-UA-Compatible: Присутствует\n"
  92.                 break
  93.         else:
  94.             result += ("!!! Мета-тег X-UA-Compatible: Отсутствует - Рассмотрите возможность добавления "
  95.                        "'<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">' в ваш HTML-код. "
  96.                        "Этот тег помогает обеспечить правильное отображение сайта в браузере.")
  97.  
  98.         return result
  99.  
  100.     except requests.RequestException as e:
  101.         return f"Ошибка при проверке HTML безопасности: {e}"
  102.  
  103.  
  104. # Функция для проверки распространенных уязвимостей (например, листинг директорий)
  105. def check_for_common_vulnerabilities(url):
  106.     """
  107.    Проверяет наличие распространенных уязвимостей, например, листинг директорий на сервере.
  108.  
  109.    :param url: URL сайта для проверки.
  110.    :return: Результат проверки в виде строки с выводом о наличии уязвимости.
  111.    """
  112.     try:
  113.         result = "\nПроверка распространенных уязвимостей:\n"
  114.  
  115.         # Проверка доступности директории /test_directory/
  116.         response = requests.get(url + '/test_directory/')
  117.         if response.status_code == 200:
  118.             result += "!!! Обнаружен листинг директорий. Рассмотрите возможность защиты директорий, чтобы предотвратить раскрытие содержимого файлов и структур сайта.\n"
  119.         else:
  120.             result += "✔ Листинг директорий не обнаружен.\n"
  121.  
  122.         return result
  123.  
  124.     except requests.RequestException as e:
  125.         return f"Ошибка при проверке распространенных уязвимостей: {e}"
  126.  
  127.  
  128. # Функция для обработки нажатия кнопки и выполнения всех проверок
  129. def check_for_bugs():
  130.     """
  131.    Обрабатывает нажатие кнопки "Проверить", выполняя все проверки безопасности на указанном сайте.
  132.    Результаты выводятся в текстовом поле.
  133.    """
  134.     url = field.get()  # Получаем URL с поля ввода
  135.     if not url.startswith('http'):
  136.         url = 'http://' + url  # Добавляем "http://" если не указано
  137.  
  138.     text.delete(1.0, END)  # Очищаем текстовое поле для новых результатов
  139.     text.insert(END, f"Проверка сайта: {url}\n\n")
  140.  
  141.     # Выполняем все проверки безопасности
  142.     text.insert(END, check_security_headers(url))
  143.     text.insert(END, check_html_security(url))
  144.     text.insert(END, check_for_common_vulnerabilities(url))
  145.  
  146.  
  147. # Создание главного окна приложения
  148. root = Tk()
  149. root.title("Проверка Безопасности Сайта")
  150. root.geometry("1920x1080")
  151. root.maxsize(1920, 1080)
  152. root.minsize(1920, 1080)
  153.  
  154. # Заголовок окна
  155. title = Label(root, text="Введите ссылку сайта:", font=('Arial', 14, "bold"), width=40)
  156. title.grid(row=1, column=1, pady=25, padx=25)
  157.  
  158. # Поле для ввода URL
  159. field = Entry(root, font=('Arial', 14, "bold"), width=120)
  160. field.grid(row=1, column=2)
  161.  
  162. # Кнопка для запуска проверки
  163. button = Button(root, text="Проверить", font=('Arial', 14, "bold"), command=check_for_bugs)
  164. button.grid(row=2, column=1, columnspan=2, pady=25)
  165.  
  166. # Текстовое поле для отображения результатов
  167. text = Text(root, font=('Arial', 14, "bold"), width=174, height=40)
  168. text.grid(row=3, column=1, columnspan=2, pady=15)
  169.  
  170. # Запуск главного цикла интерфейса
  171. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement