• Возможно ли заблокировать установку Yandex браузера, Amigo, Mail и прочей нехорошей штуки через групповую политику доменной сети?

    fzfx
    @fzfx
    18,5 дм
    с помощью встроенного механизма ACL файловой системы запретите пользователям создание файлов и папок везде, кроме собственно папки пользователя, а в папке пользователя запретите запуск файлов на исполнение.
    Ответ написан
    1 комментарий
  • Какую CMS выбрать для каталога товаров на 7000 страниц?

    Hando
    @Hando
    Верстак
    Что угодно, только не Битрикс.
    Ответ написан
    Комментировать
  • PhpShorm - анализатор кода сходит с ума?

    @deliro
    За 5к-строчные пхп файлы автора нужно предавать анафеме. А код сжигать дотла.
    Ответ написан
    9 комментариев
  • Минимальные настройки безопасности Linux на VPS?

    Tyranron
    @Tyranron
    Ряд моментов Вы уже сделали, но я все равно их опишу для полноты списка.

    1. Создать отдельного пользователя и хороший пароль на sudo. Не использовать больше root напрямую. Совсем.

    2. SSH. Отключаем метод аутентификации по паролю. Если Вам не нужны другие методы, то их тоже можно отключить, оставив только publickey. Отключаем возможность аутентификации root'ом. Включаем использование только 2й версии SSH протокола.

    3. Устанавливаем Fail2Ban и настраиваем чтобы после нескольких неуспешных попыток подключения по SSH банило по IP на длительное время. Кол-во попыток и время бана можно тюнить в меру своей паранойи. У меня, например, банит на час после 2х неуспешных попыток.

    4. Iptables. Действуем по принципу "запрещено все, что не разрешено". Запрещаем по умолчанию весь INPUT и FORWARD трафик снаружи. Открываем на INPUT'е 22 порт. В дальнейшем открываем порты/forwarding по мере необходимости. Если у нас предполагаются сервисы на соседних серверах нужные только для внутренней коммуникации (Memcached, Redis, и т.д.), то открываем для них порты только для определенных IP. Просто так торчать наружу для всех они не должны.

    5. Настраиваем автоматические обновления apt-пакетов. Уровень security. То есть так, чтобы обновления безопасности накатывались автоматически, но при этом не выполнялись обновления со сменой мажорной версии (дабы обезопасить себя от "само сломалось").

    6. Устанавливаем ntpd. Серверное время должно быть точным. Также временную зону сервера лучше всего установить в UTC.

    7. TLS (не SSL) используем везде где можем. Через Let's Encrypt получаем бесплатные валидные сертификаты. В конфигах веб-серверов, mail-серверов, и других приложений торчащих наружу (в том числе и OpenVPN), запрещаем/убираем использование слабых шифров. Все ключи/параметры генерируем не менее 2048 бит. Самоподписные сертификаты подписываем с помощью SHA-256 (не SHA-1). Diffie-Hellman параметры (dh.pem) под каждый сервис лучше сгенерить отдельно. Проверяем TLS сервисов через Nmap. Минимальный grade должен быть A, не должно быть warning'ов.

    8. Правильный менеджмент пользователей/групп. Приложения/сервисы не должны запускаться под root'ом (разве что они действительно этого требуют и иначе никак). Для каждого сервиса создается свой пользователь.

    9. Если предполагается upload файлов через PHP (либо другие скриптовые языки), в директории, куда эти файлы загружаются (и которая доступна снаружи), должно быть жестко отключено любое выполнение скриптов/бинарников, что на уровне ОС (x права), что на уровне веб-сервера.

    Это была база.
    Дальше, в меру своей паранойи можно за'harden'ить сервер ещё следующими моментами:
    - SELinux, chroot
    - доступ к SSH только с определенных IP (нужно иметь 3-4 VPN-сервера под рукой)

    UPD И да, все это помнить/настраивать руками каждый раз может быть запарно. Используйте Ansible и автоматизируйте процесс (там родные и YAML, Jinja2 и Python).
    Ответ написан
    10 комментариев
  • Для чего нужен singleton?

    @MarkusD
    все время мелю чепуху :)
    В буквальном смысле синглтон призван упростить владение, инициализацию, контроль времени жизни и доступ к элементам глобального состояния программы. Эта фраза является самой важной. А важнее всего - правильно понять ее.

    Подход многократно обличался антипаттерном за то, что "глобальное состояние программы - это зло", не смотря на то, что глобальное состояние продолжает оставаться в программе даже после удаления всех синглтонов из проекта.
    Я видел проекты с более чем 50 синглтонами и очень тяжелыми проблемами их связи между собой. В синглтоны без разбора и по незнанке вытаскивали буквально все. Это яркий пример антиподхода применения абсолютно любого паттерна.
    Важно понимать что никакой элемент проектирования не является антипаттерном, он приводит к проблемам только при неумелом использовании.

    Приложение состоящее ровно из одной UI формы будет иметь глобальное состояние в виде этой формы вне зависимости от того, будет ли эта форма оформлена как синглтон или нет. Просто, если нет, то этой формой приходится управлять иными путями, не всегда более удобными чем синглтон.

    В качестве альтернативы синглтонам пропагандируются два других подхода: Registry / Service locator и Dependency injection.
    К слову, все альтернативы столь же активно и все так же незаслуженно обзываются антипаттернами. :)

    Теперь к примерам.
    - DirectX. Для работы с графикой тебе необходимо по одной инстанции интерфейсов IDirect3D и IDirect3DDevice. Эти две инстанции декларируют глобальное состояние программы. Инстанции всех буферов, текстур, шейдеров и поверхностей создаются с использованием этих инстанций. Разумным будет предоставить доступ к инстанциям DirectX через подход синглтона.
    - OpenGL старых добрых версий. Процедурный интерфейс OpenGL как бы намекает на отсутствие необходимости в глобальном состоянии. Но не тут то было. Для работы с OpenGL необходимо не просто создать контекст, но еще и помнить поток, в котором этот контекст связан с поверхностью вывода. В многопоточной среде контекстов может быть несколько для параллельной загрузки ресурсов. В этом случае помнить надо уже два потока и два контекста (минимум). Само собой, в синглтоне это глобальное состояние смотрится удобнее.
    - Sockets. Не важно какие. Когда твое приложение представляет собой MMO проект и у тебя гора подсистем, постоянно и обособленно общающихся с сервером, сетевое подключение разумно оформить в виде синглтона.
    - Assets/Resources - они бывают разные, кешируемые и нет, доступные из сети, с жесткого диска, из подсистемы пререндеринга. Опять же, я несколько раз видел боль и страдания от неоднородного контроля ресурсов без соответствующей подсистемы. А сама подсистема управления ресурсами всегда централизована и лучше всего реализуется именно на синглтоне.

    Звук, ввод, многопоточный конвеер задач... вспоминать места явной необходимости синглтонов можно еще долго.
    Ответ написан
    Комментировать
  • Процедура проверки лицензий Майкрософт? Наезд? или развод?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Послать разумеется.
    Никакая организация за исключением правоохранительных органов не имеет права у вас что-то проверять.
    Поэтому посылайте смело.

    Но будьте готовы к визиту правоохранителей. Ибо на вас тупо настучат. Т.е у вас должно быть все в порядке с лицензиями на софт.
    Ответ написан
    4 комментария
  • Как легально держать веб-сервис, подразумевающий получение прибыли (например ежемесячная подписка)?

    Jump
    @Jump
    Системный администратор со стажем.
    Вы просто несколько неправильно воспринимаете веб сервис И это порождает массу ненужных вопросов, на которые сложно ответить.
    Веб сервис не является самостоятельным хозяйствующим субъектом. Это просто инструмент, оборудование.
    В общем веб сервис с этой точки зрения ничем не отличается от холодильника для замороженной рыбы в магазине. Он просто помогает коммерсанту продавать или оказывать услуги. И холодильник не может заключать договора, платить налоги, и совершать денежные операции.

    Пока понял что ИП или ООО регистрировать в любом случае нужно.
    Да, поскольку прибыль регулярная, без этого не обойтись.

    Открывать ли расчетный счет?
    Если ИП теоретически можно и не открывать. Хотя на практике - трудно представить ситуацию когда без него можно однозначно обойтись. В случае ООО - без вариантов открывать.

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

    Нужно ли уведомлять какую-нибудь гос.структуру о том, что я храню персональные данные?
    Статья 22 пункт 1 федерального закона N 152-ФЗ
    В общем - нужно, если вы не попадаете под исключение указанное в статье 22 часть 2 федерального закона N 152-ФЗ

    А о том, то на моем сайте можно провести какую-либо денежную операцию?
    Тут все просто - на вашем сайте однозначно нельзя провести какую-то денежную операцию! Это просто физически невозможно.
    Денежные операции проводятся через банки, процессинговые центры, расчетные счета, платежные системы, наличный расчет.

    И раз уж на то пошло, сколько можно этим заниматься нелегально, при каких объемах и что за это грозит?
    www.consultant.ru

    Как работать с юриками если ты веб-сервис? Типовой договор с каждым? Выставлять счета по почте + ЭЦП?
    Неправильный вопрос. Веб сервис не может работать ни с юриками ни с физиками. Он работает с компьютерами.
    С юриками и физиками работают другие юрики и физики.
    Т.е договора с юриками будет заключать ни в коем случае не веб сервис, а организация или предприниматель которому принадлежит этот вебсервис.
    Ну а дальше все как у всех - обычная работа организации или предпринимателя с контрагентами.
    Вариантов заключения договоров и документального оформления масса, все зависит от вашей ситуации.
    Ответ написан
    3 комментария
  • Что лучше JOIN или использование нескольких таблиц в запросе?

    Melkij
    @Melkij
    PostgreSQL DBA
    mysql> explain select test6.i from test6, test9 where test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)
    
    mysql> explain select test6.i from test6 join test9 on test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)

    Как можно заметить, оба стиля переписаны в одно и то же представление.

    Имеет смысл использовать join on по соображениям читаемости человеком, т.к. такой join сразу говорит, по каким полям связаны таблицы, а where органично остаётся для фильтрации.
    Плюс, в случае как у вас со связью по паре одноимённых полей можно написать
    SELECT maker, price FROM Product JOIN PC USING(model)

    Что эквивалентно PC.model = Product.model, но короче и позволяет в дальнейшем ссылаться просто на model - парсер уже знает, что значение поля будет идентично и не будет теряться в догадках, хотели вы получить model из PC или из Product
    Ответ написан
    Комментировать
  • Проблема с открытием сайтов - куда копать?

    ifaustrue
    @ifaustrue
    Пишу интересное в теллеграмм канале @cooladmin
    /ip firewall mangle
    chain=forward action=change-mss new-mss=1452 tcp-flags=syn,!rst in-interface=all-ppp protocol=tcp tcp-mss=1453-65535
    chain=forward action=change-mss new-mss=1452 tcp-flags=syn,!rst out-interface=all-ppp protocol=tcp tcp-mss=1453-65535

    Пробуйте. Подбирая размер пакетов.
    Ответ написан
  • Выбор монитора, на что обратить внимание?

    @evgeniy_lm
    Странный вопрос. Разумеется на содержимое карманов
    Ответ написан
    Комментировать
  • PHP функциональный язык или объектно-ориентированный?

    PHP — какой угодно язык, но точно не функциональный.

    З.Ы.
    Жаль, что тут нельзя писать в какой именно конторе такое спросили.

    UPD
    Может в вопросе имелось ввиду не "функциональный", а "процедурный"? Вы не поверите как много людей путают процедурные и функциональные языки.
    Если так, то PHP — и тот и другой. Точнее говоря, думаю, что правильный ответ в вашем случае был бы, что PHP — мультипарадигменный язык.
    Ответ написан
    Комментировать
  • Как быстро выучить iptables?

    ifaustrue
    @ifaustrue
    Пишу интересное в теллеграмм канале @cooladmin
    Что конкретно хочется выучить? У всех инструментов есть область применения и от этого и порог вхождения меняется.

    Научится порты открывать - одно
    Балансировать нагрузку на трафик - другое
    Сигнатурно на лету банить неугодных - третье.
    Ответ написан
    1 комментарий
  • Как в сокращенном if использовать только 1 вариант?

    mannaro
    @mannaro
    Умею профессионально гуглить
    Это не "сокращенный if". Это - тернарный оператор. Само слово означает "троичный" ибо состоит из 3 частей: условие, первая ветка, вторая ветка. Выводится 1 потому что !false => true => 1. Так работает echo в php.
    Ответ написан
    Комментировать
  • Интернет Магазин на фронт-енде + firebase реально?

    @ZaxapKramer
    Больной верстальщик
    Для Лендинга CMS не нужна, именно CMS, а те, кто делают это на WordPress, обычно не понимают, что это неправильно.
    От WP в таком случае ничего уже не остается, в итоге он - просто куча скриптов, которые тянутся за LP и лишь занимают место на хостинге и нагружают его.
    Для интернет магазина есть свои CMS, но можно сделать и по-вашему, если не пострадаете от этого, ибо полное незнание back-end карается...
    Для Landing Page подойдет простой движок (возможно, на файлах: вам бд не нужна особо для такой задачи, хотя...на вкус и цвет).
    То, что вы описали, вполне себе реализуемо, почему нет? Главное - как именно вам будет удобно создавать, а другу - поддерживать.
    Для начала определитесь, что именно нужно вам или другу: Интернет-магазин или (продающая) LP, потому что это совсем разные вещи.

    Можете еще про SSI почитать, но вряд ли в вашем случае это будет полезно.
    Ответ написан
    3 комментария
  • Как разобраться с инверсией зависимостей?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что такое адаптер?


    Смотрите. Есть у вас например micro USB кабель. И есть дырка в новом макбуке - Usb type c. Друг в друга они, как вы понимаете, не втыкаются. И можно взять адаптер microUSB -> USB type-c.

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

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

    За счет этого достигается независимость.

    Что значит "принимает зависимость"?


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

    public function changePassword(string $password, PasswordEncoder $encoder)
    {
        $this->password = $encoder->encode($password);      
    }


    Это зависимость нашего метода. Он зависит от него. Диалог между объектами можно представить себе такой:

    - Слыш, поменяй пароль на этот
    - Оке, только хэшер паролей мне дай, мне очень надо
    - А какой тебе?
    - Да любой с этим типом
    - Ну ок. На вот пароль и хэшер. Делай дела.

    Что такое вообще эта зависимость?


    Зависимости - это все что мы используем чтобы сделать дела. Это не только библиотечки, но и просто классы, функци и т.д. Весь "сторонний" код с точки зрения нашего кода. И самое важное в том, что "нашим" кодом является тот, над которым мы работаем в данный момент времени, а не все что мы написали. Даже функции, которые есть в языке программирования из коробки являются зависимостями. Вот только от них вам не деться никуда особо, а потому с ними замарачиваться не стоит. Или если есть долговременная поддержка у библиотеки и она устаялась - тоже можно просто использовать. А вот если это поделка на гитхабе с 10-ю звездочками и там до сих пор нет ни одного релиза - но она вам вот очень нужна, возможные поломки в ней (а они рано или поздно будут) стоит "закрыть" адаптером что бы потом поменять на что-то получше или обновить без боли.
    Ответ написан
    Комментировать
  • Какая студийная CMS для лучше интернет-магазина?

    zooks
    @zooks
    Frontend
    Студийная CMS - это всего лишь привязка к студии.
    Выберите современный фреймворк или CMS.
    Ответ написан
    Комментировать
  • Какая студийная CMS для лучше интернет-магазина?

    @entermix
    А почему-бы не выбрать любую другую популярную открытую/коммерческую CMS (если битрикс не угодил) и обслуживать ее в студии?

    Я бы не стал привязываться к CMS какой-то студии... что если через год-два она рухнет?
    Ответ написан
    3 комментария
  • Как научиться разбираться в железе?

    @evgeniy_lm
    Ты знаешь, я тоже без Википедии не знаю чем принципиально отличается DDR3 от DDR4, или USB2 от USB3 и не парюсь, потому как мне это совершенно без надобности я на этом знании денег не заработаю. Для программиста позор писать хреновые программы, а железом пусть занимаются те кому это положено
    Ответ написан
    Комментировать
  • Как учить что-то новое и быстро не забывать?

    Olej
    @Olej
    инженер, программист, преподаватель
    Суть такая, что каждый день что-то читаю и учу по книгам или видеурокам.

    Вера народная в видеоуроки вообще пустая - как в одно ухо надуло, так в другое и выдуло...

    Как учить и не забывать,

    А техника программирования - это не мнемотехники запоминания как Попка-дурак, а практика применения в написания кода.
    Ничего не нужно запоминать, на то есть справочники, а нужно понимание и писать, писать и писать свой код.

    А все интересные фрагменты кода (чужого или своего) хранить на диске, под рукой, ... чтобы всегда можно было "списать" копипастом нужные строки.
    Ответ написан
    10 комментариев
  • Как учить что-то новое и быстро не забывать?

    Куча практики
    Море практики
    В какой-то момент для тебя какой-то аспект просто становится обыденным и простым, как ходьба, и забыть это почти невозможно.
    Но это только благодаря океану практики.

    PS: уметь кодить и помнить что-то - две абсолютно разные вещи. Практика и теория тут не подходят для сравнения.
    Ответ написан
    Комментировать