Сервисы для автоматического форматирования JavaScript кода

BEAUTIFIER.IO (ex. jsbeautifier.org)

Украшает, распаковывает или деобфускирует JavaScript и HTML, делает JSON/JSONP читабельным и т. д.

Инструкция по включению JavaScript в браузере

В настоящее время почти все веб-страницы используют JavaScript, скриптовый язык программирования, который работает на веб-браузере посетителя. Это делает веб-страницы более функциональными, а если по каким-либо причинам JavaScript отключен, содержание или функциональность веб-страницы может быть ограничена или вовсе не возможна. Здесь вы можете найти инструкции о том, как включить (активировать) JavaScript в пяти наиболее распространенных веб-браузерах.

Ссылка на инструкцию: https://www.enable-javascript.com/ru/

Способы шифрования паролей к базам данных в конфигурационном файле на примере Node.js

Однажды меня спросили:

Как сделать так, что бы пароли коннекта к базам данных, расположенные в конфигурационном файле, хранились в зашифрованном или в закрытом виде, но мы могли бы ими воспользоваться в самом приложении?

Привожу пару мыслей на этот счет.

Настройка прав доступа к файлу средствами Linux

Необходимо выставить правильные настройки прав доступа к файлу на сервере так, чтобы его не мог читать любой пользователь системы и отдельный пользователь для одной конкретной задачи, т.к. контекст подразумевает не пароли пользователей сервиса, а хранения пароля к базе данных (БД).

Думаю, что шифровать пароль к БД довольно странная идея. Даже если заменить пароль на хэш и подключение будет возможно с передачей не пароля, а хэша, то если кто-то получит доступ к серверу и увидит файл с этим хэшем, он точно также использует его и подключится к базе. Шифрование пароля в такой ситуации ничем не поможет.

Плюсы:
+ В конфигурационный файл удобно вносить изменения.

Минусы:
— У пользователя root в любом случае есть все права на конфигурационный файл.

Vault by HashiCorp

На отдельном сервере лежит запечатанный контейнер к которому можно получить доступ, предварительно распечатав его и авторизовавшись при помощи ключа.

Плюсы:
+- Так таковых плюсов не увидел, т.к. этот продукт решает другую задачу — передачу секретов по незащищённым каналам в запечатанном виде, хранение всех паролей в одном месте и гибкое разделение прав доступа к паролям через различные способы авторизации.

Минусы:
— Если файл зашифрован, но рядом лежит ключ для расшифровки, то пароль будет все равно извлечен.

Обфускация, напр. через NPM-пакет javascript-obfuscator

Тот же JS, но в неудобочитаемом виде.

Плюсы:
+- Не является шифровальщиком, но позволяет скрыть какие-то алгоритмы и логику работы программы.

Минусы:
— В обфусцированном файле при детальном просмотре пароли видны в явном виде.

Инициализация приложения из другого источника

Сервер, который не смотрит во внешнюю сеть, подключается по SSH и выполняет операции по запуску на боевом сервере и после запуска удаляет не значимые файлы.

Плюсы:
+ Пароль не хранится на боевом сервере.

Минусы:
— Нужен какой-то скрипт, который будет производить запуск/перезапуск приложения и подчищать «хвосты».

Преобразование JavaScript в байткод, напр. через NPM-пакет bytenode

Байт-код (англ. bytecode) — стандартное промежуточное представление, в которое может быть переведена компьютерная программа автоматическими средствами. По сравнению с исходным кодом, удобным для создания и чтения человеком, байт-код — это компактное представление программы, уже прошедшей синтаксический и семантический анализ. В нём в явном виде закодированы типы, области видимости и другие конструкции. С технической точки зрения байт-код представляет собой машинно-независимый код низкого уровня, генерируемый транслятором из исходного кода.

Плюсы:
+ Нет ключа дешифровки.

Минусы:
— При изменении кода в файле, нужно каждый раз проделывать операцию по преобразованию файла в другой вид или придумать какое-то решение или какой-то скрипт который будет это делать автоматически.

Преобразование RegExp в String, затем обратно в RegExp

Вопрос

Объявлен RegExp regex = /asd/

Я храню его как ключ в моей системе хранения ключей.

Допустим, я попытаюсь преобразовать str = String(regex) тогда результатом будет "/asd/".

Теперь мне нужно преобразовать строку обратно в RegEx.

Я выполняю: RegExp(str) и вижу /\/asd\//

это не то, что я хочу. Это не то же самое, что /asd/

Можно ли просто удалить первый и последний символы из строки перед преобразованием ее в регулярное выражение? Это дало бы мне желаемый результат в данной ситуации, но не обязательно сработало бы, если бы в RegExp были такие модификаторы, как /i or /g

Есть лучший способ сделать это?

Ответ

Если вам не нужно хранить модификаторы, вы можете использовать Regexp#source чтобы получить строковое значение, а затем преобразовать обратно с помощью RegExp конструктора.

var regex = /abc/g;
var str = regex.source; // "abc"
var restoreRegex = new RegExp(str, "g");

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

var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var parts = /\/(.*)\/(.*)/.exec(str);
var restoredRegex = new RegExp(parts[1], parts[2]);

Это будет работать, даже если в шаблоне есть / в нем, потому чтоe .* жаден и будет продвигаться до последнего / в строке.

Если производительность вызывает беспокойство, используйте обычные манипуляции со строками, используя String#lastIndexOf:

var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var lastSlash = str.lastIndexOf("/");
var restoredRegex = new RegExp(str.slice(1, lastSlash), str.slice(lastSlash + 1));

FTP-клиент на Node.js для Windows Server

Имеется

  • Дистрибутив Linux (Debian) с установленной платформой Node.js
  • Сторонний Windows Server

Задача

Необходимо установить FTP коннект к Windows Server при помощи платформы Node.js, вырезать определенную папку (вместе с находящимися в ней папками и файлами) и вставить в определенную директорию на сервере под управлением Linux.

Вопрос

Можно ли реализовать описанную задачу? Если «Да», то какие NPM-пакеты использовать и/или какой код программы подойдет для решения задачи?

Ответ

Если ходить по обычному FTP, то инструкция получилась такая:

  1. Добавить службу FTP-сервер (веб-сервер IIS)
  2. Добавить FTP-сайт и установить физический путь к каталогу с содержимым

При помощи NPM-пакета basic-ftp, получить содержимое каталога:

const ftp = require('basic-ftp');

ftp_connect()
 
async function ftp_connect() {
    const client = new ftp.Client();
    client.ftp.verbose = true;
    try {
        await client.access({
            host: 'host',
            port: '21',
            user: 'domain\\username',
            password: 'password',
            secure: false
        })
        console.log(await client.list())
    }
    catch(err) {
        console.log(err)
    }
    client.close()
}

Как разбить массив на куски?

Вопрос

Имеется массив JavaScript, который выглядит следующим образом:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

Какой подход можно применить для разбиения массива на множество меньших массивов, скажем, с 4 элементами максимум?

Ответ

Метод array.slice может извлечь фрагмент из начала, середины или конца массива для любых целей, без каких-либо изменений исходного массива. Например:

function array_chunks(array, chunk_size) {
  let a = Array(Math.ceil(array.length / chunk_size)).fill();
  a = a.map((_, index) => index * chunk_size)
  return a.map(begin => array.slice(begin, begin + chunk_size));
}

const a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(array_chunks(a, 4)) // [[1, 2, 3, 4], [5, 6, 7, 8], [9]]