Задать вопрос
  • Как предотвратить имитацию запросов?

    Elaryks
    @Elaryks
    Да, сымитировать запрос можно. Поэтому есть правило: "Нельзя доверять данным, которые приходят с клиента". Следовательно, данные с клиента нужно проверять на сервере. Критические данные и операции нужно подписывать или хэшировать, чтобы избежать подмены. Например, для защиты от Replay Attack используют одноразовые токены — при повторном запросе токен уже не сработает.
    Ответ написан
    4 комментария
  • Какие могут быть способы определения автоматизации Selenium?

    kshnkvn
    @kshnkvn Автор вопроса
    yay ✌️ t.me/kshnkvn
    Перепробовал кучу разных вариантов, вот что из них может сработать для кого-то (не для меня):
    1. Очень сомнительно, но некоторые люди пишут, что для них это работало:
    Изменение название переменной документа js, используемой Selenium - $cdc_. Для этого достаточно открыть файл chromedriver.exe в любом шестнадцатеричном редакторе (я использовал HxD) изменить её название на любое другое. Это не сработало для меня, но сам chromedriver работает нормально после этого. Так-же я пробовал изменить все переменные где есть слова driver, но это была плохая идея - chromedriver перестал запускать. Без изменения исходников тут точно не обойтись, но я не уверен что это может сработать.
    2. Это более действующий вариант, который даёт хоть какой-то результат. На этой странице можно определить используется chromedriver, или нет и при запуске этой страницы через selenium действительно отображается, что используется webdriver. Добавление следующего куска кода помогло обойти эту идентификацию:
    options.add_experimental_option("excludeSwitches", ['enable-automation'])

    Но это всё-равно не помогло мне.
    Так-же нашел очень сомнительное и вероятнее всего просто нерабочее решение:
    Запуск js-кода, который меняет состояние переменных navigator, включая navigator.webdriver.
    Так он запускается:
    driver.execute_script("var s=window.document.createElement('script'); s.src='javascript.js';window.document.head.appendChild(s);")

    Сам js-код
    // overwrite the 'languages' property to use a custom getter
    const setProperty = () => {
        Object.defineProperty(navigator, "languages", {
            get: function() {
                return ["en-US", "en", "es"];
            }
        });
    
        // Overwrite the 'plugins' property to use a custom getter.
        Object.defineProperty(navigator, 'plugins', {
            get: () => [1, 2, 3, 4, 5],
        });
    
        // Pass the Webdriver test
        Object.defineProperty(navigator, 'webdriver', {
          get: () => false,
        });
        callback();
    };
    setProperty();

    Ерунда в том, что в Chrome вообще отсутствует переменная navigator.webdriver, в этом можно убедиться вводом navigator в консоли браузера, её там нет. Зато эта переменная есть в Firefox, но этот код её не меняет, т.е. он просто ничего не делает, значение переменной Firefox navigator.webdriver всегда равно true при запуске через selenium. В обычном (ручном) режиме она false.

    UPD. Не знаю, как проглядел, но в конечном итоге всё уперлось в проверку reCAPTCHA v3. Эта проверка проходится практически всегда при следующих условиях:
    1. Не используется User-Agent.
    2. Не используется прокси.
    3. Не отключаются уведомления.
    4. Не блокируются запросы на разрешения.
    4. Используется вот этот параметр:
    options.add_experimental_option("excludeSwitches", ['enable-automation'])

    Но при таких параметрах зарегистрировать более одного раза с одного IP не представляется возможным. Как я и указывал в своём вопросе - прокси использовал совершенно разные - от паблик до микро-серверов google cloud, так что дело не в "качестве" прокси а сугубо в факте его использования.
    Ответ написан
    Комментировать
  • Вопрос с собеседования на Java Бекенд. Как гарантировать согласованность операций?

    Я не из МТС банка, но у нас в собесе тоже есть похожий вопрос, но я бы не назвал его простым, так как там дальше ещё много дополнительных вопросов и обсуждений можно невертеть.

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

    Самый простой и часто используемый вариант - Outbox.

    Смысл в том, что мы должны в нашей основной базе завести таблицу, в которой будет записано, что нам нужно отправить запрос в тот сервис и с какими параметрами. (Например отправить письмо по электронной почте)

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

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

    Переносить взаимодействие со сторонним сервисом в Outbox также имеет смысл из-за того что ты не можешь гарантировать его доступность и задержки - если будешь работат с ним при обработке запроса от клиента по API, то можешь просто упасть по тайм-аут.

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

    66ab5b548e5a9142225375.png

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

    2ord
    @2ord
    Это про валюту? Ее нельзя представлять при помощи Float64. Это противопоказано в любых ЯП.

    Просто используй строку.
    Для работы с валютой есть пакеты. Допустим, см. здесь.
    Ответ написан
    Комментировать
  • Как реализовать models для сущностей разных по атрибутному составу?

    @Everything_is_bad
    Вопрос всплывает 100500 раз, есть очень общее решение EAV, в это же время это одна из проблем производительности. Так что в итоге все приходят к своим промежуточный решениям на основе EAV, например в postgresql, часто это через денормализация через jsonb. С другой стороны у тебя мало типов и атрибутов, возможно и "чистый" EAV не будет тормозить.
    Ответ написан
    2 комментария
  • Какой язык программирования лучше для создания асинхронного api и асинхронной работы с бд?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    С таким подходом по задаче - любой.
    Хотите конкретики - пишите конкретику.
    Большие потоки данных очень растяжимое понятие. Кому-то и 100 мб большой поток, кому-то терабайт средненький.
    Тут вообще вопрос не про язык, а про архитектуру, потому что можно даже на батниках написать сервис, и будет работать, если его правильно масштабировать.
    Ответ написан
    4 комментария
  • Как выбрать записи, для которых записи в связанной таблице не равны значению?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Буквально так и пишется дай messages для который нет вот таких
    select ... from messages where not exists (select from comments where comments.message_id = messages.id and comments.author_id = 100);
    Ответ написан
    Комментировать
  • Почему VLC прекращает запись через 22 минуты?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    А в какой формат пишете? Помню раньше на цифровых фотоаппаратах было ограничение 24мин на файл из-за того что какой-то кодек толи mp4 толи h264 требовал дорогой лицензии, а в бесплатной версии предоставлял максимум такое время.
    Ответ написан
    1 комментарий
  • Сколько оперативной нужно веб серверу?

    @Drno
    на базу данных и обработку веб запросов
    а сколько юзеров может показать только тестирование, т.к. непонятно какой сервис и как Вы там будете располагать
    Ответ написан
    1 комментарий
  • Как определить, что пользователь использует официальную версию клиента программы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос должен звучать так -
    Купил ли пользователь лицензию или достаточное число лицензий?


    А то что он сделал копию у соседа - это вобщем-то не должно вас волновать.
    Ответ написан
    Комментировать
  • Как определить, что пользователь использует официальную версию клиента программы?

    @rPman
    Только разместив ключевую часть алгоритма его работы на своем сервере, требуя доступ приложению к нему по сети, можно получить какие то гарантии, в пределах стоимости ревносинжегеринга и воспроизведения ее пользователем самостоятельно.

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

    Все иные простые способы будет взломаны, как только это кому либо понадобится достаточно сильно.
    Ответ написан
    Комментировать
  • Почему babel использует метод concat() вместо оператора "+"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    ...или есть какой-то скрытый от меня смысл?

    Есть:

    It will handle cases with Symbol.toPrimitive correctly and throw correctly if template literal expression is a Symbol(). See babel/babel#5791.
    Ответ написан
    1 комментарий
  • Разграничение файлов пользователей в s3 хранилищах?

    kawabanga
    @kawabanga
    Я начал использовать s3 не очень давно и у меня возник такой вопрос.

    Проверьте трафик ваш. S3 может оказаться дорогим решением.

    1/2) И подходит, и нет. Если кратко, у вас должно быть
    ?fileId=123 -> потом проверка доступа на этот файл -> потом отдача файла через ваш сервер ( не через прямую ссылку s3).

    А так, любое решение хранения файлов, и отдача через прокси.
    Ответ написан
    Комментировать
  • Шаблонизаторы Python?

    fenrir1121
    @fenrir1121
    Начни с документации
    Если не считать Django Templates на ум приходит только Mako.

    P.S. меня тоже интересует вопрос какой смысл скрывается за асинхронными шаблонизаторами и в чем проблема Jinja2
    Ответ написан
    Комментировать
  • Низкая скорость отдачи с VPS на конкретный хост?

    Vamp
    @Vamp
    Разница почти наверняка из-за неудачного маршрута PC2->PC1. Маршрут можно посмотреть командой traceroute или mtr (в ubuntu пакет называется mtr-tiny). Далее можно попробовать написать письмо в техподдержку хостера PC2, приложив трейсы (с обоих сторон) и результаты iperf3 (так же с обоих сторон). Тогда хостер может подправить маршрутизацию и скорость восстановится.
    Ответ написан
    5 комментариев
  • Чем заменить службу файлового сервера на Windows?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    TrueNAS, правда там фряха, а не линукс, но так даже лучше, ИМХО. Куча фич и других плюшек.
    Ответ написан
    1 комментарий
  • PostgreSQL ON CONFLICT неожиданный токен?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега PostgreSQL
    Седой и строгий
    Потому что вы пытаетесь выполнить этот запрос на сервере MySQL.
    Ответ написан
    Комментировать
  • Как сделать связь между сервером и десктоп программой?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Связь осуществляется через сетевое соединение, а именно через сокеты и кучу разных протоколов поверх типа HTTP/WS и прочего. На стороне сервера реализуете выбранный вами протокол в виде сервиса API, который слушает сокет, а в десктопном приложении подключаетесь к серверу и взаимодействуете с API вашего сервиса.
    Ответ написан
    Комментировать
  • Как разумно поставить себе начало в программировании (C++ и C#)?

    saboteur_kiev
    @saboteur_kiev Куратор тега C++
    software engineer
    C++ является одним из сложных ЯП... блабла...Я осознаю, что для меня это слишком серьёзное и тяжелое начало

    Я разобрался как работает стек и как адресуется память в пятом классе без интернета и практически без документации. Была какая-то книжка по С++, которую просто перечитал раза 3-4, пока не понял смысл.

    На протяжении обучения в школе я размышлял о начале изучения языка программирования.

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


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

    Если ты оцениваешь знания школьными мерками (типа экзамен сдал), то пора вырасти из этого статуса и переходить на оценку "я могу сделать вот это, оно будет работаь". Насколько красиво - это уже другой вопрос. Если ты можешь писать рабочий продукт, уже потом можно начинать его шлифовать и читать про красивый код.
    С нуля сложная архитектура сильно мешает, потому что не достаточно фундамента чтобы понимать почему именно вот это решение красивое а это нет.

    Если тебе интересна разработка и в будущем планируешь стать айтишником - просто бери и работай с компом. Пиши программы, сайты, поделки, настраивай что-то, интегрируй. Набирай фундамент. Интенсивность - по своему увлечению.
    В какой-то момент сможешь понять что тебе приятнее заходит, тогда может быть начнешь продвигаться уже в более узкой области, в конкретном языке, технологии. Специализация обычно начинается на уровне ну хотя бы джуниор, а не новичок/стажер.

    А про трудоустройство начинай думать, когда при прочтении описания вакансии ты считаешь, что 50-60% ты знаешь.
    Ответ написан
    12 комментариев
  • Стек технологий, чтобы верстать быстрее?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    1) Опыт
    2) Emmet для написания разметки
    3) Второй моник
    4) Sass/Scss препроцессоры
    5) БЭМ, в связке с препроцессорами особенно.
    6) Любой шаблонизатор, главное чтоб импортировать файлы умел. Если пишу фуллстэк - юзаю EJS для Node.js. Если только фронт - JSX (React.js)
    7) Не юзал zeplin/avocode, но figma - офигенная штука.

    *Порядок произвольный, не по важности.
    Ответ написан
    11 комментариев