• Что может отслеживать конкретный сайт и как с этим бороться?

    @rPman
    Косвенная информация о месторасположении
    - по ip адресу клиента и по времени ответа можно выявить наличие vpn и даже расстояние от клиента до выходной ноды vpn
    - наличие прокси, с теми же возможностями, а если прокси внезапно на том же адресе что и выходной ip и анонимна, то анализ может быть более подробный

    Атака на сеть
    - можно анализировать локальную сеть запросами, подбирая ip адреса и типовые порты можно обнаружить наличие роутера и даже его тип (cors не дает читать содержимое https->http но есть информация о заголовках и самом факте верного ответа), помимо роутера программисты часто в десктопных приложениях поднимают веб сервер (особо криворукие - без авторизации), это можно обнаружить и при наличии ошибок даже на него повлиять (повторяю, пользователь заходит на веб сайт, и его локальная сеть может быть просканирована, уязвимые приложения найдены и атакованы... я наблюдал как сбер онлайн делал такое сканирование, делая запросы к localhost по разным портам), примером таких приложений могут быть remote control медиа плееров.
    - XSS/CSRF. открывая уязвимые веб приложения в прозрачном iframe можно двигать его под мышь пользователя таким образом, чтобы пользователь не ведая того, кликак в этом приложении в нужных местах (уязвимое приложение будет открыто с авторизацией пользователя, это оправдано и такие еще встречаются), доступа к данным не будет но действия пользователя пройдут.
    - можно просто ddos-ить какой-либо сайт запросами, которые будут идти от пользователя но referer так подделать нельзя, т.е. будет видно кто виновник (понятно что в iframe можно открыть заранее сгенерированные мусорные домены)
    Помню в одном веб приложении была ошибка, оно не проверяло результат и случайно ddos-ило гугловский сервис, который в результате отказывал в обслуживании пользователю вне этого веб приложения.
    - используя webrtc можно даже вылезти в локальную сеть (найти соседний браузер без proxy/vpn если там тоже открыта страница сервера)
    Было время, когда при использовании java applet/flash/silverlight и прочих нативных аддонов, можно было еще сильнее вылезать из браузерной песочницы и вытворять в сети пользователя лютую дичь.
    - есть какие то направления в атаке через уведомления (если ты подписываешься на них на сайте, всплывающее окошко с ним открывается в ином контексте безопасности чем оригинальная страница), я не изучал но наверняка тут тоже можно что то вытянуть

    Типовая информация о железе
    - характеристики монитора (разрешение, масштабирование, глубина цвета - хотя все уже 32бит но слабые железки могут быть все еще 16битными)
    Из размера окна можно вытянуть информацию об операционной системе, нестандартном оборудовании и установленных темах, меняющих его размер
    - производительность cpu и gpu замеряя их бенмчмарками
    можно вычислять размер кеша и от сюда косвенно получать информацию о модели процессора и даже о вендоре intel/amd/... arm
    - почти полную информацию о gpu и даже попытку скрыть ее за виртуальной машиной
    - через тайминги и сетевой бенчмарк можно собрать информацию о скорости сети (ethernet или wifi)
    - через storage api можно собрать бенчмарки по скорости жесткого диска, как минимум можно понять hdd или ssd
    - инструмент ввода мышь/тачпад, даже если ты на планшетнике запускаешь мобильный браузер в режиме и в режиме PC, по тому как работает пользователь с тачпадом можно вытянуть информацию (отсутствие mousemove там где оно должно быть)

    Атака на железо
    - до сих пор я вижу сообщения о закрываемых уязвимостях доступа к gpu ram при использовании особенностей gpu, доступные в т.ч. из браузера, т.е. буквально вытаскивают изображение экрана и содержимое окон соседних приложений... это не просто, не гарантированно но при наличии желания и ресурсов, адресные атаки возможны, не удивлюсь если так будут воровать веса приватных нейронок.
    - из производительности кеша процессора вытягивают информацию об оперативной памяти соседних процессов (уязвимости Meltdown/Spectre) но это еще сложнее

    Информацию о софте
    - класс браузера (firefox/chromium и при желании opera/edge/...) по поведению javascript и многим специфическим особенностям и само собой по заголовках запроса по useragent (это само собой подменяется)
    - наличие некоторых плагинов (по тому что они добавляют на странице, например api или специфические изменения)
    например блокировщики рекламы выявляются не сложно, правда лучше прикручивать автоматизацию на основе публикуемых правил

    Доступ к clipboard
    - clipboard api не дает доступа к буферу обмена, но при клике на страницу возможна его подмена, типовой пример - пользователь держит в буфере финансовую информацию (номер счета например) и кликая по 'сайту с инструкциями' может получить подмену содержимого буфера и вставить эту подмену как адрес для денежного перевода.

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

    p.s. а сколько открывается дивных возможностей, когда веб сервис запрашивает доступ к чему то еще и пользователь его разрешает, типа камера, положение по gps, доступ к clipboard,..

    Как бороться - отдельное железо для чувствительных вещей, или наоборот, отдельное железо для развлечения и интернета. Всегда помнить об этом (та же атака через звук).
    Ответ написан
    2 комментария
  • Вопрос такого характера. У меня вэб страница и я не могу сделать выбор между React и Vue. Что лучше подойдёт в моём случае?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Такую простую форму я бы писал на ванилке вообще.

    Если надо именно фреймворк, берите то, что знаете.
    Если не знаете ничего или знаете одинаково, берите то, что субъективно выглядит приятнее.
    Если выглядит одинаково, бросьте монетку.

    Обратите внимание, что в ответе нет никакого технического сравнения Vue и React. Это сделано по двум причинам: 1) провести его адекватно всё равно невозможно и 2) для такой задачи оно не будет иметь абсолютно никакого смысла.
    Ответ написан
    1 комментарий
  • Python cоздание переменной с значением генерируемой переменной?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если ты только изучаешь python, зачем тебе pandas. Код не надо править его нужно выкидывать.

    a) Ты хочешь прочитать каждый xlsx файл в отдельный фрейм, это нормально. Создаешь пустой список и складываешь в него фреймы.
    dfs = []
    for filename in fileanmes:
        df = pd.read_excel(filename)
        dfs.append(df)

    где filenames твои пути для xlsx файлов.

    б) Задача не ясна. На сколько я понял у этих файлов разные имена колонок и надо выбрать общий для всех набор.

    from functools import reduce
    import numpy as np
    
    df1 = pd.DataFrame({
        'A':[1],
        'B':[2]
    })
    
    df2 = pd.DataFrame({
        'A':[1],
        'C':[2]
    })
    
    df3 = pd.DataFrame({
        'A':[1],
        'D':[2]
    })
    
    dfs_column_names = [df1.columns, df2.columns, df3.columns]
    print(reduce(np.intersect1d, dfs_column_names))
    Вот так ты можешь найти общие колонки у любого количества фреймов.
    Естественно тебе не нужно хардкодить список с колонками прям в первом цикле заноси не только фрейм в список, но и в другой список заноси его колонки потом вне списка сохрани общий набор колонок как я привел в примере.

    Ну и я так понимаю в дальнейшем ты собираешься выбрать по уникальным для всех фреймов колонкам и собрать все в единый фрейм. pd.concat(dfs). Где dfs это список фреймов, с едиными колонками. То есть предварительно, ты как я показал нашел common_columns. и затеам dfs=[df[common_columns] for df in dfs]. И затем конкатенируешь.
    Ответ написан
    4 комментария
  • Где искать JS код если в консоль показывает что он в VM?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    JS из WM - это что то вроде выполнение кода в контексте браузера, но не из js файла при загрузке страницы. Как вариант, где искать: innerHTML, eval, createElement(script).
    Ответ написан
    Комментировать
  • Как получить список файлов, начиная с определенного файла и заканчивая через определенное количество файлов?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Если имена файлов именно такие, то все очень просто

    $start = 10;
    $count = 5;
    
    for ($i = $start; $i < $start + $count; $i++) {
      $filename = 'file'.$i.'.ex';
      // Что-то делаем с этим файлом
    }
    Ответ написан
    1 комментарий
  • Нужно ли снова устанавливать Node.js для каждого нового проекта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Попробую объяснить простым языком.

    0. Каждый проект по умолчанию имеет свои локальный пакеты (библиотеки), которые самостоятельно устанавливаются в корневую директорию node_modules, они устанавливаются на основе файла проекта package.json (инициализация).

    Предположим, что Вы не используете контейнеризацию, то:
    1. Ноду необходимо ставить глобально, например 18 версии. Что такое глобально? В таком случае, все Ваши проекты NodeJS смогут использовать эту ноду, хотя нода при этом не будет находиться локально ни в одном из Ваших проектов.
    2. Если все Ваши проекты используют исключительно ноду 18 версии, то дополнительную ноду ставить не требуется.
    ---
    3. Если у Вас проекты используют разные версии ноды, то рекомендую с нодой работать не на прямую, а через nvm (установка/удаление/переключение).
    ---
    4. Если Вы используете контейнеризацию, то обычно, нода+проект ставится в каждый контейнер.
    Ответ написан
    Комментировать
  • Нужно ли снова устанавливать Node.js для каждого нового проекта?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Смотрите нода бывает разных версий, так что рекомендуется использовать селектор
    https://npm.github.io/installation-setup-docs/inst...

    а так делайте следующее
    https://docs.npmjs.com/cli/v10/commands/npm-init

    инициализируете пакет ,переходите в папку и начинаете работать.

    Почему важно?
    Нод куча версий и все они не совсем или совсем не совместимы. Поэтому нужно выбирать нужную версию
    Ответ написан
    Комментировать
  • Как оцените тестовое задание для junior front-end?


    (я так понял, наподобие ночного режима)

    Большая ошибка. "Заказчик" может это понимать совершенно иначе. Все непонятки лучше уточнять - это тоже часть твоего тестового задания, как ты умеешь коммуницировать с другими членами команды разработки.

    По срокам - если исключить время на чтение документации Гугла и возможные проблемы при "установке на сайт" - всё должно занять один рабочий день неспешной работы. С учётом всех рисков и того что врядли ты будешь 8 часов в день над этим тестовым заданием сидеть - я бы ориентировался на несколько дней

    Сколько это займёт у тебя и какой дедлайн даёт "заказчик" (это ты должен был уточнить).

    Дедлайнов по тестовым заданиям как правило не дают - если будешь очень долго делать, то на твоё место просто найдут другого.
    Ответ написан
  • Как переписать код c jquery на js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Ответ написан
    Комментировать
  • Select не прогружает варианты выбора, не могу разобраться, почему?

    DanArst
    @DanArst Куратор тега JavaScript
    Гриффиндор в моде при любой погоде!
    selectElements - это select-ы с классом val, а у select5 у тебя такого класса нет, есть только added
    Ответ написан
    1 комментарий
  • Хочу сделать чтобы при нажатии на кнопку создавался точно такой же select под тем что есть. Как сделать не пойму?

    sergski
    @sergski
    web-developer
    Что-то много всего понаписали.) Выбрать select, скопировать cloneNode, вставить последним. И все это по клику на button
    Например, так
    Ответ написан
    1 комментарий
  • Стоит ли читать лутца в 2023?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты должен искать тот путь который будет работать для тебя. Важно не вот книга "А" лучше чем книга "Б". А в какой момент времени (твой текущий уровень, мотивация, конечная цель, индивидуальные предпочтения и т.д.) Ты читаешь книгу "А" или книгу "Б". Может быть стоит читать эту книгу, может стоит читать статьи, может быть стоит почитать что-то в контексте применения python в той области где ты собираешься его применять и т.д. Самообразование - это не набор определенных действий почти одинаковый для всех - а твой индивидуальный путь.

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

    Я бы не искал единственную книгу, как способ обучится.
    Ответ написан
    Комментировать
  • Стоит ли читать лутца в 2023?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Лучше Лутца ещё ничего не написали. Да и Python за годы с последнего издания сильно не поменялся.
    Ответ написан
    Комментировать
  • Как начать учить программированию детей начальной школы?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Зависит от детей.
    Чтобы программировать, прежде всего дети должны уметь читать. Иметь желание читать. Иметь желание разбираться со значками.
    Иначе надолго не увлечешь.
    Поэтому правильно - учить тех детей, кто за первые годы своей жизни уже увлекся чем-то подобным. Тогда можно развивать.
    А так - играть в логические игры - шашки, шахматы (сейчас есть много такого)
    Развивать продвинутого пользователя - как работает компьютер и что на нем можно разного делать.

    может быть сразу с первых минут делать игру - чтобы они к концу урока уже почувствовали себя программистами?
    я думаю нужен восторг от осознания этого
    и этот восторг надо продлить на первые 10 уроков

    В массе это невозможно. Это возможно только в индивидуальном подходе. Иначе будет фокус, а потом реальность.
    Ответ написан
    8 комментариев
  • В чем ошибка в задаче hh #1?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Например, не соблюдается условие "0, если в офисе нет печенек":
    countCookies(3, 6, [0, 0, 0]); // 1
    Некорректная проверка, должно быть 2.
    countCookies(3, 2, [0, 2, 2]); // 0
    Ну и пара стилистических правок
    - const allCookies = cookies.reduce((sum, acc) => sum + acc, 0);
    - let maxCookies = Number(Math.max.apply(null, cookies));
    + const maxCookies = Math.max(...cookies);
    - let sum = cookies.reduce((acc, c) => acc + Math.floor((c + K - 1) / K), 0);
    + const sum = cookies.reduce((acc, c) => acc + Math.ceil(c / K), 0);
    Ответ написан
  • Как сделать из трех компьютеров один?

    @Drno
    Так Вы сами отвечаете на свой вопрос.. сервер терминалов сделайте
    Например через ВПН можно спокойно получить внешний IP и пробросить нужный порт
    В итоге цепочка будет - VPS(впн севрвер)>>rdp внутри ВПНа
    Пользователь может спокойно подключаться по внешнему IP VPSки
    Ответ написан
    2 комментария
  • Скажите пожалуйста почему выдает разные ответы?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В первом случае ты подсчитываешь все a, которые с любым x дают false.
    Во втором случае, ты подсчитываешь все пары a, x, которые удовлетворяют условию.
    Ответ написан
    4 комментария
  • Как выбрать базу данных для проекта?

    @alexalexes
    1. Если в разрабатываемой системе нет потребности производить нечеткий поиск, получать сверхбыстрый ответ на запрос в реальном времени (не более пары миллисекунд), производить аналитику данных в самых разных разрезах. У вас в потоках данных определены сущности с четкими реквизитами и сущности имеют высокую связность, то в 99% случаях вы даже не повернете голову в сторону нереляционных СУБД, будете использовать реляционные.
    2. На самом деле, просто зависит от того, как сложно администрировать СУБД в том масштабе, в которой развилась база данных. Сначала берут первую попавшуюся, или с тем, с чем освоились более-менее, а потом смотрят с течением времени, как сложно нанять нужного специалиста на администрирование, удобно ли масштабировать экземпляры баз данных при возросшей нагрузке, удобно подымать экземпляры из небытия, держать непрерывный аптайм. Вот тут уже выясняется специфика работы предметной области и необходимость переезжать на подходящее окружение.
    Ответ написан
    1 комментарий
  • Как выбрать базу данных для проекта?

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

    Какую конкретно? Ту, которую лучше знаешь, если не можешь назвать конкретную причину, почему лучше изучить другую и взять другую. Например вот я беру postgres по-умолчанию, но вот у меня проект, который требует минимального жора ресурсов и наиболее простой инфраструктуры - тогда беру sqlite.
    Или наоборот - я понимаю, что у меня какие-то специфичные требования по консистентности и доступности, система у меня будет распределённая, а запросы у меня будут исключительно key-value, да и желательно ещё иметь возможность подписки на изменения каких-то ключей - тогда беру etcd.
    Ответ написан
    Комментировать
  • Какие архитектурные решения можно применить?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Нет деления по слоям из DDD. Нужно отделять бизнес логику от инфраструктуры. Ответственно контроллерах минимум кода и никакой логики.
    2. Анемичные сущности, которые не имеют контроля над своим состоянием агрегата.
    3. Сущности знают про то где они хранятся. Если завтра мы начнем хранить данные в другом месте, то ваш код придётся переписывать.
    4. Про структурные паттерны можете почитать тут: https://refactoring.guru/ru/design-patterns/struct.... Там есть примеры на PHP.

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

    Например, у вас Request размазан по разным папкам: Events, Models, Listeners и т д. Вам завтра скажут вынести модуль заявок в отдельный сервис или вообще его удалить. Вместо того чтобы удалить одну папку, то вам нужно во всех папках найти где есть Request. Конечно, это не удобно. Не говоря о том, то вся логика, в том числе и бизнес логика хранится по всему проекту. И это у вас простой код. А что если будет 100 разных модулей. С вашей структурой вы точно увязните. Плюс у вас будет куча конфликтов при разработке. Нельзя за каждым программистом закрепить папку, за которую он отвечает. Каждому программисту придётся лезть в соседнюю попку, потому что они общие. Ревью делать тоже сложно.
    Ответ написан
    2 комментария