Перейти к основному содержимому

"Шифруем" CSS и JS на сайте

· 3 мин. чтения
Alex Congritta

Есть малоизвестный способ "скрыть" CSS и JS-код на сайте. Может быть полезно, если вы не хотите, чтобы ваш код можно было прочитать из инструментов разработчика в браузере. Однако при желании код всё равно можно прочитать, используя несложные консольные утилиты

Как выглядит "шифрованный" JS-код

Такой код будет работать, если вписать его в HTML любого сайта. Такое же возможно и с CSS:

Такое же можно применять в подключении чего угодно на сайт, в т.ч. картинок, SVG, шрифтов и т.д.

Что это такое вообще

Это Data URLs, по сути виртуальные ссылки на что угодно (текст, HTML, CSS, JS, изображение, видео и т.д.); сам контент хранится прямо в ссылке текстом или закодированным в base64. Вы прямо сейчас можете открыть новую вкладку у себя в браузере и набрать там:

data:text/html,<h1>This is my site</h1>

Откроется страничка с заголовком "This is my site".

Почти все современные браузеры поддерживают Data URLs, но они редко используются, ибо прятать код особой нужды нет, а контент можно подгружать по старинке из сервера.

Data URLs можно использовать практически везде вместо обычных ссылок. Например:

<img
src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw
AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH
hhx4dbgYKAAA7"
alt="Larry"
/>
ul.checklist > li.complete {
margin-left: 20px;
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC') top left no-repeat;
}
window.open('data:text/html;charset=utf-8,%3C!DOCTYPE%20HTML%20PUBLIC%20%22-' +
'%2F%2FW3C%2F%2FDTD%20HTML%204.0%2F%2FEN%22%3E%0D%0A%3Chtml%20lang%3D%22en' +
'%22%3E%0D%0A%3Chead%3E%3Ctitle%3EEmbedded%20Window%3C%2Ftitle%3E%3C%2Fhea' +
'd%3E%0D%0A%3Cbody%3E%3Ch1%3E42%3C%2Fh1%3E%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E' +
'%0D%0A', '_blank', 'height=300, width=400');

(Примеры кода скопированы из статьи про Data URLs из википедии)

Как создавать такие ссылки:

Любые такие ссылки составляются по такой схеме:

data:[<MIME-тип>][;base64],<data>

То есть в начале пишем data:, дальше пишем MIME-тип. Его можно загуглить для нужного вам контента, но вот маленькая табличка с популярными MIME типами:

MIME-типОписание
text/plainОбычный текст
text/htmlHTML
text/cssCSS
text/javascriptJavaScript
application/jsonJSON
image/pngКартинка PNG
image/jpegКартинка JPG
image/gifКартинка GIF
image/svg+xmlКартинка SVG

Далее сам контент. Текстовый контент можно писать прямо как он есть, либо, что лучше, закодировать его в base64. Для этого гуглим любой онлайн сервис, либо же, если у вас ОС на основе Linux, открываем терминал и пишем команду:

cat << EOF | base64

После чего пишем свой код и в самом конце нажимаем Enter, потом пишем EOF, потом ещё раз Enter.

Как это должно выглядеть:

То, что после EOF, это наш base64-код.

Вы так же можете создать текстовый файл и написать исходный код туда, а потом выполнить команду в терминале:

cat мойФайл.txt | base64

Полученный base64 мы добавляем в конец нашей ссылки. В итоге получаем

data:text/css;base64,aHRtbCB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7Cn0KCmJvZHkgewogIGZvbnQ6IDFlbSBz
YW5zLXNlcmlmOwp9CgpwIHsKICBjb2xvcjogYmx1ZTsKfQo=

Если вам надо проверить работоспособность ссылки, просто откройте новую вкладку в браузере, вставьте ссылку в адресную строку и нажмите Enter. Если всё откроется как надо, значит ссылка составлена правильно.

А можно ли это расшифровать?

Можно. base64 легко расшифровывается любыми популярными языками программирования и встроенными консольными утилитами в Linux.

Использование Data URLs поможет разве что защититься от некоторых парсеров сайтов, если у вас SPA (например если у вас React с клиентской генерацией) или если парсеры лезут в JS код. Но если у кого-то будет задача парсить именно ваш сайт, то использование Data URLs не поможет