Комментарии 28
А вот чтобы у любого пользователя это работало, нужно что они все себе поставили nodejs и развернули это "суперприложение"?
Очевидно да...
Предложите свой вариант. Как тогда открыть на машине клиента?
А смысл тогда в этой публикации?
Как из браузера сделать системный вызов на стороне сервера и так всем ясно, какой-нибудь shellexecute с обёрткой на нужном языке, будь то php, python или что иное.
Дать клиенту десктопное приложение которое из коробки умеет все что надо без всяких bloatware
а если приложение web? а не десктоп?
все такие умники, а по факту никто не может ничего сделать?
а если приложение web?
То оно не должно лезть на диск к пользователю, иначе это уже никакой не web. У вас уже не веб если клиенту для полной функциональности надо что то устанавливать, только вместо маленького приложения пользователь получает хзчто в виде nodejs с какими то мутными инструкциями по настройке, и, как ниже отметили, еще и дыры в безопасности. Если вам нужен десктопный UI на html+js то есть электрон, он конечно УГ, но работает. Я уже молчу про то что настоящее веб приложение вы можете хоть с телефона открыть и оно будет точно так же работать, тогда как то что в статье очевидно на телефоне не взлетит
Тут не web в обычном представлении где я открою вашу ссылку и смогу открыть папку. Мне надо поставить node.js и запустить сервер локально.
Во вторых инструкция для новичков? Нет комментариев поясняющие действия. Просто код.
очевидно что тот же Electron умеет это из коробки. Но если нужно WEB?
Значит пишете бэкенд который умеет делать то, что нужно, а не чуть ли не сами даете доступ к системе. Пароль 123 на ssh и то наверное дольше будут ломать
backend написан в данной статье, но он выполняется на стороне сервера, а не на стороне клиента. А вы напишете бэкенд который открывает проводник на клиенте?
Как Вы предлагаете распространять этот подход у клиентов? У Вас же фактически клиент должен установить себе десктопное приложение для взаимодействия с сайтом. Лучше тогда сразу писать на электроне.
Так можно дать 10 примеров таких реализаций на разных языках, например: на php:
<?php
function OpenPath()
{
if( isset($_GET['path']) )
{
$path = $_GET['path'];
shell_exec( "start explorer '$path'" );
}
}
?>
Или на python с использованием Flask сделать.
Это вы к чему? Если клиенту придется локально ставить пхп вместо nodejs и с такими же танцами с бубном поднимать точно такой же локальный сервер, позволяющий выполнять любому подключившемуся произвольный код, дырявым костылем это быть не перестает
Предложите свой вариант. Как тогда открыть на машине клиента?
да легко: `python3 -m http.server`
как минимум питон есть почти у всех ибо он из коробки стоит в любом дистрибутиве, а виндовых тачек обычно в офисе сильно меньше.
Изучить Pyhon
Загадка: что будет если ввести такой путь к папке? C:" & rm -rf "C:/Users/User/Desktop
На ответ дается минуты 2, пока машину берут под контроль)
Как сделать из браузера что-то, что браузером сделать нельзя?
Делаем сервер на локалхосте, обращаемся к нему из браузера и сервер делает что нужно.
Я так делаю некоторые утилиты на Go (для личного использования): например каталогизатор скачанных видеофайлов с веб-интерфейсом, некоторые древние файлы имеют формат, который современные браузеры не воспроизводят, чтобы их посмотреть просто добавил кнопочку "открыть в стандартном плеере".
Давай вариант про выполнение пейлоада у удаленого клиента из JS
Я в этих ваших виндах слабо разбираюсь. Там что, NodeJS работает в контексте юзера, а не как системный сервис?
А что будет если это терминальный сервер и там сидит два десятка юзеров? У кого откроется окошко?
Это не уязвимость! Это фича! Поздравляю вы успешно используете Remote Code Execution уязвимость https://cqr.company/ru/web-vulnerabilities/rce/
Подержите моё пиво. Вот тебе текст для index.html на чистейшем javascript
startIn: <select id="startIn">
<option>desktop</option>
<option>documents</option>
<option>downloads</option>
<option>music</option>
<option selected>pictures</option>
<option>videos</option>
</select><br>
<button onclick="openDirectory()">Open Directory</button>
<script>
const openDirectory = async () => {
try {
const directoryHandle = await showDirectoryPicker({
startIn: document.getElementById('startIn').value,
});
console.log(`${directoryHandle.name}:`);
for await (const [name, fileHandle] of directoryHandle) {
console.log(' ', name, fileHandle.kind);
}
}
catch (e) {
console.log(e);
}
};
</script>
Как из браузера открыть папку в проводнике Windows используя ExpressJS