• Есть ли модуль для NodeJS для работы с КриптоПРО CSP?

    @retuned
    Кроме как внешним вызовом, думаю, сейчас Node JS не сможет подписать файлы средствами Крипто Про CSP.
    1) Консольная утилита "cryptcp -signf" как раз делает отделенную подпись в формате PKCS#7. Покупается у Крипто Про.
    2) на Java + Крипто Про JCP написать jar с обертками функций
    3) на C# под Крипто Про.NET опять же написать обертки и реализовать как rest-сервис или exe-шник для вызова.
    4) на C/C++ написать то же, что в п. 3) или dll/so. Это даже дешевле, т.к. не надо покупать ничего кроме CSP. Но это посложней.

    Ещё как идея - использовать для Node JS версию OpenSSL с поддержкой ГОСТ и набора параметров от Крипто Про. Тогда Node JS будет нативно работать из модуля crypto. Возможно, придётся компилировать Node JS из исходников.

    Я ещё не отговорил использовать Node JS для вашей задачи? :)

    Вряд ли мой совет актуален, но в поисковике часто вылазит эта тема, так что может кому пригодится.
    Ответ написан
    5 комментариев
  • Как для каждого сайта назначить свой PHP.INI или изменить его параметры через NGINX?

    noway
    @noway
    В конфиге nginx параметры PHP_VALUE нужно через ; прописывать, а не отдельными вызовами.

    Например:
    fastcgi_param PHP_VALUE "mbstring.func_overload = 2; mbstring.internal_encoding = UTF-8; max_input_vars = 10000; realpath_cache_size = 4096k";
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

    * Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
    - Время.
    - Протухание по бизнес логике.
    Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
    - При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Как дождаться в NodeJS выполнения mongodb.forEach и подзапросов и вернуть результат?

    @bromzh
    Drugs-driven development
    promise

    UPD
    Отвечаю на коммент тут.

    В промисах (их есть несколько реализаций, но суть у всех одна) есть функция all, которая вернёт результат промисов всех переданных в неё промисов. Типа такого

    Так что можешь создать массив, на каждом шаге цикла оборачивать ответ в промис (если он сам не промис) и потом передать всё в метод all. Например, смотри в конец первого ответа

    Примерный код такой:
    var queue = [];
    cursor.forEach(function (element) {
        queue.push(Promise.resolve(element));
    });
    Promise.all(queue).then(function(arrayOfResults) {
        // тут делаешь что-то с массивом результатов.
    });
    Ответ написан
    3 комментария
  • Какой должна быть структура nginx.conf с basic authorization и cors?

    @aguz
    Client-side developer
    Пожалуй для истории оставлю пример.

    Заголовки Access-Control-Allow-* потребуются во всех типах запросов. Поэтому их нет необходимости сегментировать как на enable-cors.org
    Необходимость условия if ($request_method) на уровне location, а не server, была связана с особенностям работы nginx.

    server {
    
        #Authentification
        satisfy any;
    
        allow 123.456.789.001;
        allow 123.456.789.002;
        deny  all;
            
        auth_basic           "Admin section";
        auth_basic_user_file .htpasswd;
    
        #CORS
        add_header Access-Control-Allow-Origin "http://localhost"; # <- needs to be updated
        add_header Access-Control-Allow-Methods "GET, OPTIONS"; # 
        add_header Access-Control-Allow-Headers "Authorization";
        add_header Access-Control-Allow-Credentials "true"; 
    
        location / {
            if ($request_method = OPTIONS ) { # <- because if ($request_method) doesn't work on server level
                add_header Content-Length 0;
                add_header Content-Type text/plain;
                return 200;
            }
        }
    
        #Routing
        location ~ ^/(images|javascripts|stylesheets|system)/  {
             root /some/directory/for/rails/app/public;
             expires max;
            break;
        }
    
        location ... {
            ...
        }
    
    }
    Ответ написан
    2 комментария
  • Как установить Node.js 4.2 из пакетов на Ubuntu 15.04?

    Jeiwan
    @Jeiwan
    Ещё не обновился пакет, потому и не доступна 4.2 пока.
    Ответ написан
    2 комментария
  • MongoDB Enterprise сколько стоит лицензия?

    mak_sim
    @mak_sim
    maksim77ster@gmail.com
    Не ручаюсь за актуальность но порядок цен наверное можно увидеть здесь.
    Ответ написан
    1 комментарий
  • MicroSD с сертификатом эцп?

    ipswitch
    @ipswitch
    IT-инженер
    А ещё есть вот эти отличные ключи:
    www.guardant.ru/products/guardant-mobile/guardant-sd/
    Могут помочь.
    Ответ написан
    Комментировать
  • Криптографический алгоритм шифрования по мастер-паролю

    Carcharodon
    @Carcharodon
    люблю криптографию
    Чем хорош RSA, например, то с ним можно использовать любой «мастер-ключ», так как там открытый и закрытый ключ взаимозависимые, а не как, например, в протоколе Эль-Гамаля.

    Но тут будет проблема. Для программы, которая сама хранит пароли, хранить еще информацию о ключе шифрования ключей (мастер-ключе) — как-то небезопасно.
    Лучше использовать другой подход. А именно стойкую (!) криптографическую хэш-функцию (так проще и информации о мастер-ключе почти не будет в программе) и симметричный алгоритм шифрования (3DES, AES, любой другой, который будет понятен для реализации. Даже ГОСТ28147-89 подойдет. Для всех них в сети много максимально разжеванных алгоритмов).

    Теперь собственно протокол работы программы.

    Шифрование:
    Есть сообщение M, содержащее пользовательский пароль, который необходимо хранить в программе.
    Шифруется оно случайно созданным ключом шифрования K.
    К в свою очередь шифруется ключом шифрования ключей (мастер-ключом).
    Ключ шифрования ключей — пусть будет результат воздействия стойкой криптографической хэш-функции H() на фразу-пароль P.

    Расшифрование:
    Я беру фразу-пароль P.
    Беру от нее хэш H(P).
    Расшифровываю разовый ключ шифрования данных K с помощью H(P) в качестве ключа.
    Расшифровываю с помощью K хранимое сообщение М, содержащее пароль.

    Возможные проблемы:
    стойкость хэш-функции
    равномерное распределение ГПСЧ

    В остальном, будет очень даже увлекательное занятие. Для меня бы точно было таким =)
    А если для хранения данных использовать списки и деревья, то преподаватели будут довольны)))
    Ответ написан
    1 комментарий
  • Cервис автоматического списания с банковской карты за услуги?

    @rainwall
    Это называется рекурентные платежи. Paysto, например, умеет.
    Ответ написан
    Комментировать
  • Подскажите OCR консольную программу для win и unix систем

    @simpleadmin
    Есть ещё mirrors.webhostinggeeks.com/gnu/ocrad/, но версий под win вроде нет и вроде необходимо преобразование в pbm.
    По качеству распознавания больше понравился tesseract, но местами и ocrad был не лишним.
    Ответ написан
    Комментировать
  • Подскажите OCR консольную программу для win и unix систем

    la0
    @la0
    Знаю только одну. OpenOcr.org (альт. ссылка cognitiveforms.ru/products/cuneiform/) + самому делать парсинг результата.
    Ответ написан
    Комментировать
  • Как продать плагин для браузера?

    @NeonMercury
    Поднять сервер и хранить там список лицензий (ключ, ...). При старте плагина отправлять на свой сервер запрос и указывать, что этот ключ онлайн. При завершении плагина отправлять запрос и указывать, что оффлайн. Как только поступит запрос сделать онлайном ключ, который и так онлайн, значит произошла утечка ключа и он блокируется.
    Ответ написан
    6 комментариев
  • В чем заключается принцип работы банковских (и не только) токенов?

    Singerofthefall
    @Singerofthefall
    Они работают на математических функциях, а для вычисления каждого ключа (под ключем я имею в виду то число, которое генерируется, и которое вы вводите для авторизации) используется либо счетчик, либо последовательное хеширование.

    Грубо говоря, в токене зашита некоторая односторонняя функция f(x), и некоторое стартовое число k. Сервер также знает, какая функция и какое число используется в токене, привязанном к вашему аккаунту.

    Если это модель со счетчиком, то с помощью вашей функции вычисляется f(k), а затем k увеличивается на единицу (или изменяется как угодно еще, главное чтобы по известному алгоритму). Если это последовательные вычисления ключа, то каждый следующий ключ это результат работы функции на предыдущем ключе, то есть вычисляется f(k), потом f(f(k)), f(f(f(k))), и так далее.

    Соответственно каждый раз, когда вы нажимаете на кнопку, токен вычисляет следующий ключ. Когда вы вводите его для авторизации, сервер также вычисляет тот же самый ключ и сравнивает их.
    Ответ написан
    1 комментарий