In windows è possibile registrare un protocollo custom per il browser in modo da associare ad esso l'esecuzione di uno specifico eseguibile o script.
Con protocollo si intende, ad esempio, https:, file:, mailto, tel:, zoommtg:, ecc...
Ad ogni protocollo, nel registry, è associata una specifica azione, ad esempio il protocollo file: provoca l'esecuzione di explorer.exe che apre la cartella corrispondente oppure zoommtg: che provoca l'apertura del client Zoom per fare video conferenze.
La registrazione di un protocollo custom prevede la creazione di specifiche chiavi di registro.
Il modo più veloce per creare delle chiavi di registro è creare un file di testo con estensione .reg, ed eseguirlo con doppio click. Ecco un esempio:
Windows registry file: sgart-file-1.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\sgart-file]
@="URL:Sgart File Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sgart-file\shell]
[HKEY_CLASSES_ROOT\sgart-file\shell\open]
[HKEY_CLASSES_ROOT\sgart-file\shell\open\command]
@="C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -Command \"& {Invoke-Item ('%1' -replace 'sgart-file:','') }\""
In questo caso registro un protocollo sgart-file: che prende il parametro passato e lo passa al comando Invoke-Item di PowerShell.
PowerShell deve essere scritto con il full path C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Per provarlo si può creare una pagina html con un tag anchor, ad esempio, con il path di una cartella locale o di rete
HTML
<a href="sgart-file:c:/temp/p1">apri cartella locale</a>
<a href="sgart-file://server/temp/p1">apri cartella locale</a>
cliccando su uno di questi link verrà chiesta una conferma prima di eseguire l'azione
Conferma di ChromeConferma di Chrome
confermando con Apri Windows PowerShell, si vedrà per un momento partire la finestra di PowerShell, che subito dopo si chiuderà e si aprirà il percorso indicato con explorer.exe.
Questo trucco potrebbe essere usato in Chrome per aggirare l'attuale limitazione di sicurezza che non permette più l'esecuzione dei link di tipo file: per accedere a cartelle locali o di rete.

Così com'è il custom protocol è molto pericoloso, infatti è possibile avere coma parametro anche dei file eseguibili (exe, com, bat, ecc...).
Ad esempio, è possibile avviare notepad.exe
HTML
<a href="sgart-file:notepad.exe">esegue un comando</a>
Questo comportamento deve essere assolutamente evitato, in quanto potrebbero esserci dei malintenzionati che costruiscono pagine internet pubbliche, al fine di sfruttare questo comportamento libertino per compromettere il computer inducendo l'utente a cliccare su questi link malevoli.

Per prevenire questo comportamento è possibile modificare lo script precedente per permettere solo percorsi locali o di rete
PowerShell
# rimuovo il protocollo sgart-file:
$p = '%1' -replace 'sgart-file:','';
# recupero l'estensione
$ext = [system.IO.Path]::GetExtension($p);
# per debug resitro su un file di log le esecuzioni
(Get-Date -Format 'yyy-MM-dd HH:mm:ss') + ' ' + $p + ', ext=' + $ext >> c:\temp\sgart-protocol.log;
if($ext -eq '') { 
    # solo se non ho delle estensioni eseguo il comando
    Invoke-Item $p; 
}
a questo punto il file .reg deve essere modificato in questo modo
Windows registry file: sgart-file-1.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\sgart-file]
@="URL:Sgart File Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sgart-file\shell]
[HKEY_CLASSES_ROOT\sgart-file\shell\open]
[HKEY_CLASSES_ROOT\sgart-file\shell\open\command]
@="C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoLogo -NoProfile -NonInteractive -Command \"& {$p = '%1' -replace 'sgart-file:',''; $ext = [system.IO.Path]::GetExtension($p); (Get-Date -Format 'yyy-MM-dd HH:mm:ss') + ' ' + $p + ', ext=' + $ext >> c:\\temp\\sgart-protocol.log; if($ext -eq '') { Invoke-Item $p; }}\""
Nella stringa deve essere fatto l'escape di alcuni caratteri. Ad esempio la back-slash si raddoppia \\, mentre le virgolette doppie vanno insrite così \".
Attenzione, non è detto che lo script impedisca in tutti i modi di lanciare degli eseguibili, non ho fatto test approfonditi. Questo esempio è solo dimostrativo.
Molto meglio rafforzare i controlli, ad esempio, inserendo una lista di percorsi permessi.

Ovviamente è possibile utilizzare anche un eseguibile.
Ad esempio con .NET Core 5 è possibile creare una console application
DOS / Batch file
dotnet new console
e inserire questo codice C#
C#: Program.cs
using System;

namespace SgartProtocol
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = args[0].Replace("sgart-file:", "");
            // TODO: rafforzare la sicurezza controllando i percorsi permessi
            Console.WriteLine($"Parametro: {args[0]} => {p}");
            System.Diagnostics.Process.Start(@"C:\Windows\explorer.exe", p);
        }
    }
}
da compilare ed eseguire per test con il comando
DOS / Batch file
dotnet run c:\temp
In questo viene mandato in esecuzione (Process.Start) explorer.exe con il parametro passato. Questo evita che possa essere lanciato un qualsiasi eseguibile.
A questo punto il nostro file .reg diventa
Windows registry file: sgart-file-1.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\sgart-file]
@="URL:Sgart File Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sgart-file\shell]
[HKEY_CLASSES_ROOT\sgart-file\shell\open]
[HKEY_CLASSES_ROOT\sgart-file\shell\open\command]
@="C:\\temp\\sgart-protocol\\bin\\Debug\\net5.0\\sgart-protocol.exe \"%1\""
Se non funziona verificare con regedit.exe se la chiave HKEY_CLASSES_ROOT\sgart-file\shell\open\command contiene il comando corretto.
Se sono presenti degli errori nella stringa di comando, questa non viene scritta nel registry.
Il popup di comferma del browser a questo punto è parlante in quanto riporta il nome dell'eseguibile e non la generica scritta PowerShell
Conferma eseguibileConferma eseguibile
Potrebbe interessarti anche: