Анализ страницы https://rot256.dev/post/h1/

Основное Готовность: 100%

Домен

rot256.dev
Состояние доменного имени ?
Домен второго уровня идеален для продвижения.
Отличный запоминающийся домен.

Ответ сервера

200 Успешный ответ
HTTP-код ответа и цепочка редиректов ?
Сервер настроен корректно.

Безопасность

Сайт безопасен
Использование HTTPS и SSL-сертификат ?
Не настроен HSTS (Strict-Transport-Security) — рекомендуется включить.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 24.09.2026 5:44:33.
Сервер поддерживает HTTP/3 (QUIC) — новейший протокол.
Поздравляем! Сайт не содержится в реестре РКН.

Кодировка

utf-8
Кодировка символов страницы ?
Указана кодировка на странице utf-8.

Язык

en-us
Атрибут lang в HTML-теге ?
Язык документа указан явно: en-us.

Скорость загрузки

~0,38сек
Время отклика сервера (TTFB) ?
Скорость загрузки сайта 0,38сек оптимальна.

Объем документа

94Кб
Размер HTML-кода страницы ?
Объем html-документа 94Кб оптимален.
Структура html-документа корректна.

Ресурсы

Ресурсы: 1
Внешние ресурсы страницы (CSS, JS, изображения) ?
Кол-во файлов ресурсов 1 достаточно.
Показать полный список ресурсов

Серверные заголовки

Кол-во: 9
HTTP-заголовки ответа сервера ?
Найдены серверные заголовки 9шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков

CMS

Не определена
Система управления сайтом (движок) ?
CMS не определена. Вероятно, сайт самописный либо движок надёжно скрыт. Это не ошибка.

Веб-сервер

Caddy
Программное обеспечение сервера ?
Сайт работает на веб-сервере Caddy.

Мета-теги Готовность: 27%

Title

H1 @ Google CTF 2021
Заголовок страницы в браузере и поисковой выдаче ?
Необходимо увеличить число символов в title (текущее значение мало: 20, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.

Description

The “H1” Challenge We are given two files. A python3 script (chall.py): Python Script (click to expand) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 #!/usr/bin/python3 import os import hashlib from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import padding from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes flag = open('flag.txt').read() INF = (1, 1, 0) mod = 8948962207650232551656602815159153422162609644098354511344597187200057010413552439917934304191956942765446530386427345937963894309923928536070534607816947 a = 6294860557973063227666421306476379324074715770622746227136910445450301914281276098027990968407983962691151853678563877834221834027439718238065725844264138 b = 3245789008328967059274849584342077916531909009637501918328323668736179176583263496463525128488282611559800773506973771797764811498834995234341530862286627 n = 8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169 G = (5139617820728399941653175323358137352238277428061991823713659546881441331696699723004749024403291797641521696406798421624364096550661311227399430098134141, 1798860115416690485862271986832828064808333512613833729548071279524320966991708554765227095605106785724406691559310536469721469398449016850588110200884962, 5042518522433577951395875294780962682755843408950010956510838422057522452845550974098236475624683438351211176927595173916071040272153903968536756498306512) def Double(p): x, y, z = p if z == 0 or y == 0: return INF ysqr = y * y % mod zsqr = z * z % mod s = 4 * x * ysqr % mod m = (3 * x * x + a * zsqr * zsqr) % mod x2 = (m * m - 2 * s) % mod y2 = (m * (s - x2) - 8 * ysqr * ysqr) % mod z2 = 2 * y * z % mod return x2, y2, z2 def Add(p, q): if p[2] == 0: return q if q[2] == 0: return p x1, y1, z1 = p x2, y2, z2 = q z1sqr = z1 * z1 % mod z2sqr = z2 * z2 % mod u1 = x1 * z2sqr % mod u2 = x2 * z1sqr % mod s1 = y1 * z2 * z2sqr % mod s2 = y2 * z1 * z1sqr % mod if u1 == u2: if s1 != s2: return INF else: return Double(p) h = u2 - u1 % mod hsqr = h * h % mod hcube = hsqr * h % mod r = s2 - s1 % mod t = u1 * hsqr % mod x3 = (r * r - hcube - 2 * t) % mod y3 = (r * (t - x3) - s1 * hcube) % mod z3 = h * z1 * z2 % mod return x3, y3, z3 def Multiply(p, x): if p == INF: return p res = INF while x: x, r = divmod(x, 2) if r: res = Add(res, p) p = Double(p) return res def Transform(m, l): z = m shift = l - n.bit_length() if shift > 0: z >>= shift return z def RNG(nbits, a, b): nbytes = nbits // 8 B = os.urandom(nbytes) return a * sum([B[i] * b ** i for i in range(len(B))]) % 2**nbits def Sign(msg, d): h = hashlib.sha512(msg) z = Transform(int.from_bytes(h.digest(), 'big'), h.digest_size*8) k = RNG(n.bit_length(), 16843009, 4294967296) x1, y1, z1 = Multiply(G, k) r = (x1 * pow(z1, -2, mod) % mod) % n s = pow(k, -1, n) * (z + r * d) % n assert int(s) == pow(k, -1, n) * (z + r * d) % n return r, s def Verify(msg, Q, r, s): h = hashlib.sha512(msg) z = Transform(int.from_bytes(h.digest(), 'big'), h.digest_size*8) u1 = z*pow(s, -1, n) % n u2 = r*pow(s, -1, n) % n x1, y1, z1 = Add(Multiply(G, u1), Multiply(Q, u2)) return r == (x1 * pow(z1, -2, mod) % mod) % n def Encrypt(plaintext, x): key = hashlib.sha256(str(x).encode()).digest() aes = algorithms.AES(key) encryptor = Cipher(aes, modes.ECB(), default_backend()).encryptor() padder = padding.PKCS7(aes.block_size).padder() padded_data = padder.update(plaintext) + padder.finalize() ciphertext = encryptor.update(padded_data) + encryptor.finalize() return ciphertext def Decrypt(ciphertext, x): key = hashlib.sha256(str(x).encode()).digest() aes = algorithms.AES(key) decryptor = Cipher(aes, modes.ECB(), default_backend()).decryptor() unpadder = padding.PKCS7(aes.block_size).unpadder() decrypted_data = decryptor.update(ciphertext) + decryptor.finalize() plaintext = unpadder.update(decrypted_data) + unpadder.finalize() return plaintext # Alice and Bob have their keys: da = RNG(n.bit_length(), 1, 256) Qa = Multiply(G, da) db = RNG(n.bit_length(), 1, 256) Qb = Multiply(G, db) x1a, y1a, z1a = Multiply(Qb, da) ka = x1a * pow(z1a, -2, mod) % mod x1b, y1b, z1b = Multiply(Qa, db) kb = x1b * pow(z1b, -2, mod) % mod # Alice sends message to Bob: msga = b'Hello Bob.' ra, sa = Sign(msga, da) ca = Encrypt(msga, ka) print('Alice -> Bob:', (ra, sa, int.from_bytes(ca, 'big'))) # Bob receives and verifies message: recv_msg = Decrypt(ca, kb) assert Verify(recv_msg, Qa, ra, sa) # Bob sends message to Alice: msgb = b'Hello Alice.' rb, sb = Sign(msgb, db) cb = Encrypt(msgb, kb) print('Bob -> Alice:', (rb, sb, int.from_bytes(cb, 'big'))) # Alice receives and verifies message: recv_msg = Decrypt(cb, ka) assert Verify(recv_msg, Qb, rb, sb) # Alice sends message to Bob: msga = (f'Dinner tonight? What about Tapioca? Btw, here is the flag: {flag}').encode() ra, sa = Sign(msga, da) ca = Encrypt(msga, ka) print('Alice -> Bob:', (ra, sa, int.from_bytes(ca, 'big'))) # Bob receives and verifies message: recv_msg = Decrypt(ca, kb) assert Verify(recv_msg, Qa, ra, sa) # Bob sends message to Alice: msgb = b'Dinner sounds good. Thanks for the flag.' rb, sb = Sign(msgb, db) cb = Encrypt(msgb, kb) print('Bob -> Alice:', (rb, sb, int.from_bytes(cb, 'big'))) # Alice receives and verifies message: recv_msg = Decrypt(cb, ka) assert Verify(recv_msg, Qb, rb, sb) And the following output (stdout from the python script):
Описание страницы в поисковой выдаче (сниппет) ?
Необходимо уменьшить число символов в description (текущее значение: 6511, оптимально: от 120 до 130)

Keywords

Список ключевых слов страницы (устаревший тег) ?
Установите мета-тег keywords!

Канонический Url

Указывает поисковику основную версию страницы ?
Рекомендуем прописать канонический Url.

Robots

Есть ошибки
Директивы для поисковых роботов на уровне страницы ?
Meta-тег robots указан, но в нем содержится неизвестное значение...

Адаптивность

width=device-width,initial-scale=1,shrink-to-fit=no
Настройка масштабирования на мобильных устройствах ?
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».

Разметка OpenGraph

Не найдено
Мета-теги для красивых превью в соцсетях ?
Разметка OpenGraph не задана. Страница не оптимизирована под социальные сети. Мета-теги с разметкой Og помогают социальным роботам лучше структурировать Ваш сайт.

Все мета-теги

Кол-во: 4
Полный список мета-тегов страницы ?
Найдены мета-теги 4шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов

Оптимизация Готовность: 90%

Структура

Ошибок нет
Семантические HTML-элементы страницы ?
Структура документа корректна (теги <html> и <body> присутствуют в единственном экземпляре).

Контент

Ошибок нет
Объём и качество текстового содержимого ?
Слова из title 5 встречаются в тексте достаточно.
Абзацев с текстом 53 достаточно.
Среднее число слов в абзаце 69 достаточно.
Кол-во знаков контента 27968 на странице оптимально.
Кол-во слов 6415 на странице оптимально.

Заголовки

Ошибок нет
Иерархия заголовков H1–H6 ?
На странице присутствуют заголовки <h1> 7. Это прекрасно.
На странице присутствуют заголовки <h2> 3. Это хорошо.

Тошнота

6,32
Насколько одно слово доминирует в тексте ?
Тошнота превышает норму 5. Измените текст страницы!

Академич. тошнота

6,42%
Насколько текст перенасыщен ключевыми словами ?
Академическая тошнота страницы в пределах нормы.

Семантическое ядро

20
Наиболее часто встречающиеся слова на странице ?
Контент страницы содержит осмысленный текст и слова.
Показать список слов

Индексация Готовность: 80%

Индексирование

Ошибок нет
Разрешено ли индексирование страницы ?
Анкоров на странице 6 оптимально. Поисковые роботы обязательно проиндексируют сайт.

Robots.txt

Найден корректный robots.txt
Файл управления сканированием сайта роботами ?
Robots.txt настроен корректно. Размер файла: 31 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Показать содержимое robots.txt

Sitemap

Кол-во: 0
XML-карта сайта для поисковиков ?
Robots.txt не содержит ссылку на карту сайта. Рекомендуется добавить карту сайта и указать ссылку на нее в robots.txt.

Внутренние ссылки

Кол-во: 2
Ссылки на другие страницы своего сайта ?
Внутренних ссылок на странице 2 оптимально.
Внутренние ссылки не запрещены к индексации в robots.txt.
Показать внутренние ссылки

Внешние ссылки

Кол-во: 4
Ссылки на сторонние сайты ?
Внешних ссылок на странице 4 оптимально.
Показать внешние ссылки

Конкуренты Готовность: 0%

Конкуренты в Яндексе

Кол-во: 0
Топ сайтов-конкурентов в Яндексе ?
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.

Конкуренты в Google

Кол-во: 0
Топ сайтов-конкурентов в Google ?
Конкуренты в Google тоже не найдены. Займитесь продвижением сайта!
Конкурентов в ТОП-10 Google не нашлось.

ЗоЗПП: права потребителей Готовность: 100%

Нарушения

Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.

ФЗ-149: рекомендательные технологии Готовность: 100%

Нарушения

Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.

ФЗ-38: реклама Готовность: 100%

Нарушения

Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.

ФЗ-436: защита детей Готовность: 100%

Нарушения

Не выявлены
Признаков информационной продукции (новости, видео, книги, игры, курсы) не обнаружено — обязательная возрастная маркировка по ФЗ-436 сайту не требуется. Нарушений нет.

Вердикт

Страница https://rot256.dev/post/h1/ готова к продвижению на 74%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
 Исправьте ошибки в мета-тегах.
Поделитесь с друзьями:

Обратная связь

Оставьте ваши данные, и мы свяжемся с вами в ближайшее время.

Ваше имя * 0/100
Email * 0/200
Телефон 0/50
Тема обращения * 0/200
Подробнее 0/4000