Ответы пользователя по тегу JavaScript
  • Каким образом защищенный сайт допускает запросы "живых" пользователей, но блокирует запросы Python Requests и аналогов и как это обойти?

    @rPman
    Не дам готовый ответ но посоветую - открываешь отладчик в браузере по F12, вкладку network, проводишь полный сеанс работы пользователя с учетом чистых кук (и отдельно повторный заход), делаешь экспорт .par файла (это json файл, там все запросы, и ответы, полная информация)

    Затем смотришь нужные тебе запросы, они могут требовать (в заголовках или в параметрах) некие данные, которые собственно обфусицированным скриптом сайт и генерирует в 99% случаев это не скрытая строка а напрямую запрашиваемая в предыдущих запросах, т.е. ее можно поискать в par файле (лучше не как текст а разбирай json так как там могут быть строки с ковычками). Вместо ручного анализа может оказаться проще писать небольшой скрипт ковыряющийся в этих логах и доступных html/js файлах сайта.

    По уму отладчик в браузере умеет искать по истории запросов (там где есть поиск по url есть кнопка лупа - поиск, ее нажатие открывает еще одно поле поиска уже по данным)

    Работа с логом очень помогает, но сочувствую тебе.

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

    p.s. для тех кто пишет защиту от парсинга - совет, увеличивайте нагрузку на процессор (в т.ч. используя gpu) чтобы всякие selenium потребовали ну очень много ресурсов (грубо говоря фиктивную задачу как в майнинге либо 100500-уровневая раз дешифрация или хеширование)... подбирая такие нагрузки, чтобы рядовой клиент все еще не замечал проблем а вот массовый анализ стал бы затратным.
    Такова селяви.. либо делай данные общими либо создавай проблемы всем.
    Ответ написан
    Комментировать
  • Как выключить в браузере WebRTC через скрипт на сайте?

    @rPman
    Например расширение WebRTC Control и у firefox

    в принципе любой функционал на странице (в ее пределах само собой) можно контролировать через javascript, переопределив соответствующие методы на себя
    т.е. берешь какой-нибудь RTCPeerConnection и присваиваешь ему пустышку
    RTCPeerConnection={};
    чтобы вернуть назад, предварительно сохрани старое значение в своей переменной
    Ответ написан
  • JS в качестве БД?

    @rPman
    javascrip - это инструмент, json - это формат, а база данных - это место хранения, инструмент и формат одновременно.
    Т.е. тебе нужно еще понять где ты будешь хранить данные, и вот от сюда и полезут проблемы.

    Интернет магазин - значит участвует как минимум браузер (вырожденные случаи вида - магазин в telegram/wechat не рассматриваем), хранить данные браузер умеет только локально, для клиента, а у интернет магазина как минимум есть еще продавец, с которым клиент должен связываться для получения списка и цен на товары в наличии и указаний к пожеланию купить (корзина)... т.е. нужен еще и сервер (варианты с децентрализованной сетью так же не рассматриваем ибо это хардкор не для новичков).

    Если твой сервер однопоточный (например если речь идет про javascript то бакэнд серверный можно писать на nodejs, с оговорками про асинхронность) то в принципе можно хранить все данные в файлах, и не сильно заморачиваться с блокировками и транзакциями, а из-за них основные проблемы возникают, зачем люди к готовым базам данным идут.
    Если тебя это все еще интересует,
    веди работу с базой данных из отдельных функций (например объединив их в класс), по окончанию работу каждой чтобы данные в файлах были в консистентном - правильном состоянии, перезапись делать через временный файл с переименовыванием в оригинальный после всех изменений, это аналог транзакций, это даст гарантии по сохранности данных при смерти внезапной скрипта, например окончилась память или место на диске, само собой проверять это при следующем запуске и давать возможность вручную разрулить. Если сумарный объем базы больше мегабайтов, то не храни все в одном файле, первый уровень разделения - по типам данных, например раздели данные для редких изменений и постоянных - списки товаров и корзина, кстати цены можно так же отдельно хранить, само собой тебе тогда придется идентификаторы заводить и следить за их уникальностью - вот уже сиквенсы пошли (кстати есть алгоритмы uuid где каждый новый гарантированно уникальный без необходимости централизации и чего либо хранения), если же данных совсем много и часто меняются случайные из них то храни каждый объект в своем файле, файловая система справится, но лучше все же освой нормальные БД

    Поэтому тебе правильно посоветовали, используй sqlite, минимум усилий на обслуживание и настройку (база данных = файл, никакого сервера и при этом полноценный sql с почти бесплатной миграцией на любую sql базу данных в будущем)
    Ответ написан
    Комментировать
  • Регулярка JS на получение float числа из строки?

    @rPman
    /^([0-9]+)(\.[0-9]+)(e([+-])?([0-9])+)?$/i
    ^ и $, метасимволы начала и конца, гарантируют что вся строка соответствует регулярке а не какая то ее часть
    i в конце - опция игнорирования регистра для мантисы но можно задать в регулярке варианты и так
    Данная регулярка пример и разберет на части целую, дробную и мантису
    100
    100.001
    100.011e+12 (кстати формально неправильно целую часть при использовании мантисы делать больше 10 но все парсеры это обработают правильно)
    Ответ написан
    Комментировать
  • Как устроена технология, позволяющая смотреть видео вместе удаленно, вроде Watch2Gether или NotAlone?

    @rPman
    Практически любой видеоплеер на веб странице позволяет управлять собой из скриптов, в данном случае важны пауза, запуск и запрос текущей позиции и перевод ее на заданное значение

    Сервер устанавливает соединение между клиентами (websocket через сервер или webrtc p2p напрямую) и по нему дублирует все команды, которые отправляет любой (или ведущий) пользователь своему видеоплееру. В простой реализации интерфейс видеоплеера скрывается а пользователю выдается посреднический интерфейс, но если нужно пользоваться интерфейсом браузера, то тогда придется отслеживать оперативно состояние плеера, играет он или в паузе и в какой позиции находится.... синхронизация между пользователями у видео будет гулять, возможно даже на секунды,.. не думаю что для данной задачи это критично... но если что можно подстраивая скорость воспроизведения (многие плееры это тоже позволяют) периодически догонять отстающих или наоборот притормаживать торопыг.. так как изменения скорости будут кратковременными и незначительные доли процента, их никто не заметит
    Ответ написан
    2 комментария
  • Как в JavaScript делать такие массивы?

    @rPman
    Хранить данные нужно исходя из задачи, а точнее как именно ты будешь читать эти данные, как искать, в каком порядке (а нужен ли он) проходить, необходимость удалять или менять порядок и уровни вложенности и т.п.

    Например хранить можно список элементов в виде плоского массива, и в большинстве задач этого будет более чем достаточно

    Если нужно при этом знать, у какого элемента какой предок и какие потомки, то добавить поля parrent и childs со ссылками либо на сами объекты либо на их идентификатор (номер) в массиве всех элементов

    Если нужна связь с элементами html dom то в соответствующие элементы добавляй либо сасылку на сам dom элемент либо на его уникальный id
    Ответ написан
    Комментировать
  • Как корректно обработать ошибки сервера средствами JavaScript (Возможно ли это)?

    @rPman
    Сообщения об ошибках должны быть видны разработчику в dev консоли, потому что ошибки должны быть обработаны не только с точки зрения кода но и владельца сервиса в целом!

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

    Каждая проигнорированная ошибка или даже варнинг - это потенциальный технический долг. Даже если ты сейчас знаешь и понимаешь что конкретная ошибка не проблема, через год/два ты или твой заместитель, пришедший на смену тебе, этого знать не будет... а так как ошибки имеют тенденцию накапливаться, решать их в будущем будет все сложнее и сложнее
    Ответ написан
    6 комментариев
  • Как при окончании загрузки страницы обновить блок div?

    @rPman
    событие onload например на теге body (к сожалению оно не сработает для внутреннего контента и фреймов, т.е. страница и скрипты загружены, но изображения - нет, дляя них нужно блудет городить свой прелоадер)

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

    Меняй данные сразу при загрузке страницы
    Ответ написан
    1 комментарий
  • Нужен совет. Насколько мое решение лучше/хуже официального?

    @rPman
    использовать готовую функцию будет некрасиво, в правильной 'школе' за такой даже безупречный ответ должны ставить оценку 'хорошо'

    для 'отлично' я предлагаю написать функцию, которая будет заметно эффективнее и вместо N умножений будет делать примерно log(N)
    для этого попытаться представить возведение в степень не как N раз X*X*...*X а как (N/2 раз X*X*..*X)^2, а чтобы это делать в цикле, поступить так, если N четное, то делим его на два, вызываем рекурсивно свою же функцию и результат умнажаем на самого себя, иначе берем N-1 и делаем тоже самое но результат дополнительно умножаем на X

    p.s. полгаю если сумеешь заменить рекурсию на цикл, будет однозначно плюсищем
    Ответ написан
    Комментировать
  • Как в javascript сделать игнорирование опечаток?

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

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

    Так же, после определенной накопленной суммы разницы между строками, дальше тратить время не актуально, советую в своей реализации добавить этот параметр (особенно это актуально когда надо огромные объемы данных обработать)
    Ответ написан
    Комментировать
  • Как правильно построить логику приложения?

    @rPman
    Если у загружаемых данных (объектов) нет какого то уникального идентификатора, сделай его из самих данных, взяв к примеру md5 хеш из строки, в которую сериализовал данные (только если внутри есть списки, постарайся чтобы порядок в них не гулял или отсортируй их, речь идет исключительно для получения строки, которая будет для одних и тех же данных всегда одинаковой)

    А дальше все просто, храни этот идентификатор рядом с данными в базе и в момент записи проверяй уникальность именно по нему

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

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

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


    Поэтому, у тебя есть следующие варианты по защите своей информации (в мире криптовалют информация = деньги):
    1. Ты физически защищаешь сервер от доступа злоумышленника и шифруешь данные на случай если доступ все же они получат
      Этот путь подразумевает буквально, сервер в сейфе, а для обслуживания к нему катается физически надежный человек, почти все датацентры предоставляют закрытые защищенные помещения для этого. Этот способ самый простой для реализации но самый дорогой.
    2. Обфусцируешь доступ к информации
      Организуешь всю систему так, чтобы получив доступ злоумышленнику потребовалось бы заметное время понять как именно нужно добраться до критичной информации и главное, расставляешь ловушки, сигнализирующие о том что сервер скомпроментировал, тогда ты уже со своей надежной машины переводишь монеты с горячего кошелька, останавливаешь сервис и разбираешься.

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

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


    p.s. само собой, админы провайдеров, пока еще, массово не анализируют все виртуальные машины на предмет наличия критичной информации, иначе бы за этим последовали серии громких и необъяснимых краж денег, но такие события точно происходили (админ linode украл деньги пула, хостящегося на нем)
    Ответ написан
    Комментировать
  • Как найти координаты Б когда известны координаты А, C?

    @rPman
    информации недостаточно

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

    @rPman
    у тебя 2 пути

    простой и дорогой, нужно запустить 100 браузеров (в каждом свой профиль со своими настройками прокси)

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

    p.s. скорее всего не получится где то сэкономить или упростить, эти два пути не только являются граничными но и единственно рабочими
    Ответ написан
  • Как оптимизировать загрузку видео autoplay?

    @rPman
    При запросе видео по указанным ссылкам, есть примерно полсекундная задержка, затем идет загрузка (ростелеком 1.5мб/с)
    если зайти на сайт, примерно 6 секунд идет загрузка, потом появляется анимация loading.. еще через секунд 5 уже появляется анимация и запускается видео (на запуск видео уходит как раз эта секунда его загрузки), обновление страницы загружает сайт меньше чем за секунду (это в основном анимация 'раскрытия окна')

    Отсюда могу предположить что проблема именно с видео - это проблема отдачи его на сервере, изучайте, что у вас там? обычно nginx статику отдает максимально эффективно, откуда там пол секундная задержка до начала загрузки (смотреть тем же wget) я хз.

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

    p.p.s. как же грустно наблюдать современный вебдев, сам я от него далек но знаю каким он был 10 лет назад, это удручающее зрелище
    Ответ написан
    Комментировать
  • Как измерить сколько памяти занимает html элемент и объект созданный через new?

    @rPman
    провести эксперимент не вариант что ли?

    по теме вопроса, чтобы не лагало, вместо создания новых элементов, рекомендуется их переиспользывание

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

    создание нового dom элемента (а точнее изменение чего либо что меняет положение и размеры элементов на экране) на порядок более медленное чем изменение его содержимого или цвета

    p.s. а еще есть самостоятельное рисование на canvas, плюс webgl, позволяют отрисовывать очень сложные интерфейсы
    p.p.s. еще есть svg но он медленнее
    Ответ написан
    5 комментариев
  • Как дерево представить в видемассива?

    @rPman
    в чем вопрос если ответ в тегах есть? рекурсия
    вон id даже готовые, содержат идентификатор предка

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

    @rPman
    в похожей ситуации я реализовывал семафор следующим способом
    if(localstorage['имя_семафора']++>1)
    { // значит этот семафор уже кто то занял,
      localstorage['имя_семафора']--;
      //  ждем некоторое время и повторяем попытку
    }  else
    { // никто семафор не занял можно работать
      ...
      // по окончанию работы семафор надо освободить
      localstorage['имя_семафора']--;
    }
    смысл в том что localstorage[]++ это атомарная операция (вот в этом месте я скорее всего не прав), а благодаря тому что единственная опасная операция, которая могла бы вклиниться между работай с localstorage и if - это --, и она проихойдет когда семафор и так должен освободиться, т.е. проблем это не создаст.

    p.s. почему говорю семафор а не мьютекс, потому что можно сравнивать не только с 1 но и большим числом - это определит, сколько одновременно можно ресурс занимать
    p.p.s. в интернете гуляет реализацию мьютекс на javascrit как раз на localstorage но она какая то переусложненная и я не понимаю зачем
    если кто то по умнее, объясните пожалуйста
    Ответ написан
    Комментировать