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

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

Вы можете резонно предположить, что есть протокол file:// (я позволю себе использовать здесь и далее слово протокол, хотя правильнее, конечно, схема URI), который позволяет браузерам открывать локальные файлы, но с ним также есть две проблемы:

1) он не может отобразить список файлов в папке;
2) такие ссылки нельзя открывать с внешних (не локальных) веб-страниц.

Чтобы решить данную проблему, мы будем использовать свой протокол с собственным обработчиком. Метод будет работать в Windows и потребует некоторых (очень простых) действий на компьютере.

В HTML-коде это будет выглядеть как-то так:

<a href="myproto://C:/My Folder/123">открыть папку</a>

Можно из JavaScript:

window.open('myproto://C:/My Folder/123');

Сначала необходимо придумать название протокола (у меня будет myproto) и зарегистрировать его в системе. Для этого в любом месте (хоть на рабочем столе) создаём файл с расширением .reg (например, myproto.reg) и следующим содержимым:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\myproto]
"URL Protocol"=""
@="URL:Myproto Protocol"

[HKEY_CLASSES_ROOT\myproto\shell]

[HKEY_CLASSES_ROOT\myproto\shell\open]

[HKEY_CLASSES_ROOT\myproto\shell\open\command]
@="\"C:\\myproto.bat\" \"%1\""

Здесь myproto — название моего только что созданного протокола. Можете изменить на своё (но не используйте стандартные названия протоколов типа http, ftp, mailto и прочие).

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

Далее в корне диска C: необходимо создать файл myproto.bat со следующим содержимым:

@echo off
set "path=%~1"
setlocal enabledelayedexpansion
set path=%path:myproto://=%
set path=%path:"=%
set path=%path:/=\%
set path=!path:%%20= !
set path=!path:%%5C=\!
C:\Windows\explorer.exe "%path%"

Здесь также меняем myproto на название вашего протокола. Это и будет его обработчик.
Всё готово. Теперь вы можете прямо из браузера (абсолютно любого) на данном компьютере открывать папки в проводнике в отдельном окне, просто открыв ссылку вида myproto://C:/My Folder/123.

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

Комментарии (17)


  1. tzlom
    31.12.2022 12:17
    +13

    Это прям черная дыра безопасности


    1. BigDflz
      31.12.2022 14:10

      телеграм так же открывается. и ничего, не дыра.


      1. tzlom
        31.12.2022 16:55
        -1

        Телеграмм не передаёт произвольный экзешник в Эксплорер, попробуйте открыть исполняемый файл этой ссылкой. А если это URL ?


      1. numb13
        01.01.2023 05:51

        Есть много обработчиков протоколов. Но конкретно этот батник с дырой.


  1. LuchS-lynx
    31.12.2022 12:23
    +2

    может слегка не по теме, но есть целая программка HFS которая осуществляет обмен расшаренными файлами через протокол http

    https://www.rejetto.com/hfs/


    1. Firsto
      31.12.2022 14:51
      +4

      Ооо, с далёких нулевых пользовались для шаринга файлов в локальной сети


      1. LuchS-lynx
        31.12.2022 17:01

        ей можно шарить и через интернет по текущему активному внешнему ip твоего ПК


        1. Firsto
          31.12.2022 20:41

          Более того, там ещё аплоад можно разрешить, очень удобная фича - сам себе клауд сторадж: особенно круто на удалённом компе автоматом настроить скрипт по заданным правилам загружаемое например по папкам сортировать (перемещать/запускать/удалять, "вашедействие", и т.д.)


  1. Myclass
    31.12.2022 14:20
    +15

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

    как такой дизайн процесса кому-то в голову может придти?! Сколько людей могут/будут работать с этим заказзом? А что если этот единственный человек, на диске которого лежат эти документы помрёт/полетит диск/забудет свой логин/ зайдёт через мобильное приложение и тд.? Как локальная папка может быть занесена в базу CRM? Даже, если это будет папка в лок.сети - боже избавь от такого архитектора.


  1. vmkazakoff
    31.12.2022 16:03
    +12

    Тот костыль, что вы изобрели - дичайщее пробитие дна и адищенская дырень в безопасности. Надеюсь что читатели вашей статьи дойдут до комментов и никогда не станут заниматься таким когнитивным онанизмом. А уж в корп.среде ваши ИБ обязаны были не только вас уволить, так ещё и физически сжечь все сервера и машины мимо которых вы могли ходить. Зная ваш протокол я буквально могу со своей страницы перебрать все файлы на вашем компе. Я уж молчу про .bat файл который вы можете запускать. Короче просто раззнайте это обратно, или хотя бы напишите наверху статьи капсом что так делать нельзя.

    А вот как надо было: https://developer.mozilla.org/en-US/docs/Web/API/FileSystem

    Уже давно есть готовое API для работы с файловой системой, с понятным ограничении доступа и внятными правами. Нормально поддерживается. Так работают различные системы для ведения заметок, из того что встречал. Они выполнены как онлайн сервис но хранят данные как файлы оффлайн, обычно в маркдауне.


  1. excoder
    31.12.2022 16:49
    -1

    Ну а что вы сразу продакшн. Я прикрутил к своей личной Докувики по этой инструкции, очень удобно, автору спасибо.


  1. numb13
    01.01.2023 06:05
    -1

    Автор, уберите пожалуйста этот cmd injection, чтобы неокрепшие умы не копипастили баг в свои CRM системы.


  1. iliabvf
    01.01.2023 13:32
    -1

    проще да, но безопаснее уже сделать electron-приложение, оно умеет открывать файлы и папки с диска, там можно и авторизацию и прочее добавить, и в Linux/MacOS
    будет работать


  1. wertex15
    01.01.2023 19:44
    -1

    Программист, который занимается копипастой на хабр


  1. Kenya-West
    01.01.2023 22:39
    +2

    К сожалению, как разработчик, имеющий хотя бы отдалённые представления о безопасности, я обязан осудить решение в данной статье по следующим причинам:

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

    • Создание решений, запрещенных Женевской конвенцией: батник в корне C:\

    • Требование админских прав как преступление против безопасников человечности. Их ведь тупо может и не быть!

    • Заведомый наброс на вентилятор (обсуждаемо, будет решено на Гаагском трибунале). Слишком толсто, попробуйте потоньше

      Прошу всех, у кого глаза не вытекли кровью после прочтения статьи, не повторять описанные ими шаги ни в кровавом энтерпрайзе, ни в стартапе, ни клиентам на галере, даже если менеджер это одобрит! Только на собственной локальной машине (если IQ ниже 50), на виртуальной машине или песочнице (Windows Sandbox).


  1. serafims
    02.01.2023 02:37
    +2

    Задача, на самом деле, интересная. Например, я рабочих целей тоже начал разработку маленькой программки, которая вызывается ОС для обработки протокола, при этом после начала схемы идет идентификатор корневой папки. К примеру, при вызове
    myproto://YDISK/Хрень по работе\Гемор\Тупые клиенты\Неплательщики\охреневшие\Уважаемый Сергей Анатольевич.doc
    программа знает заранее, какая корневая папка задана для YDISK, и открывает соответствующий путь.
    В контекстном меню проводника появляется дополнительный пункт типа "Скопировать путь для MyProtoViewer". Программа получает путь в параметр, анализирует, совпадает ли какая-то из нескольких корневых папок с началом пути, и формирует в буфер обмена ссылку вида

    myproto://GDRIVE/Архив для маркетинга.zip

    Это полезно для всяких диких CRM, которые неприспособлены нормально работать с файлами (даже битрикс с его аналогом яндекс диска оказался полной шляпой) в виде ссылок на файлы на ПК пользователя или на сервере в локалке.

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


  1. OptimumOption
    02.01.2023 09:47

    Не знаю почему, но напомнило старый анекдот:

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