Jak mogę utworzyć własny protokół URL? (np. więc: //…) [zamknięte]

212

Widziałem:

  • http://www...
  • ftp://blah.blah...
  • file://blah.blah...
  • unreal://blah.blah...
  • mailto://blah.blah...

Jaka jest ta pierwsza sekcja, w której się widzisz httpi tym podobne?

Czy mogę zarejestrować swój własny?

Michael Beck
źródło
5
Nie jestem pewien, czy wymaga to znaczników c # i .net, jest szerszy niż to.
Rob Hruska,
To uczciwe. Oznacziłem to tylko w ten sposób, ponieważ planowaliśmy używać C # do implementacji czegoś takiego. W każdym razie dzięki. :-)
Michael Beck
14
Prawidłowa nazwa to „schemat” (patrz RFC 2616 i 2396). Nawet jeśli wiele schematów adresów URL jest nazwanych po protokołach, nie oznacza to, że jedynym sposobem na dostęp do zasobu jest protokół
Marek,
Istnieją dwa typy protokołów, ale nie wiem, jakiego terminu użyć, aby je rozróżnić. Protokoły „plik” i „mailto” są przetwarzane w kliencie. Protokoły „http” i „ftp” są przetwarzane na serwerze. Na początku byłem zdezorientowany odpowiedziami na protokoły przetwarzane w przeglądarce, gdy chcę czegoś, co jest przetwarzane na serwerze.
user34660,

Odpowiedzi:

203

Część z HTTP://, FTP://itp nazywane Schematy URI

Możesz zarejestrować swój własny poprzez rejestr.

HKEY_CLASSES_ROOT/
  your-protocol-name/
    (Default)    "URL:your-protocol-name Protocol"
    URL Protocol ""
    shell/
      open/
        command/
          (Default) PathToExecutable

Źródła: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml , http://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx

James Gregory
źródło
19
Co z systemami innymi niż Windows?
Bdoserror
9
„Co z systemami innymi niż Windows?” Jest to specyficzne dla aplikacji. Myślę, że tak naprawdę często jest on specyficzny dla aplikacji również w systemie Windows (nie spowoduje to magicznego działania).
Calum,
2
Zdefiniuj wszystko. Wpis rejestru mówi systemowi Windows, aby przekazał Uri z tym protokołem do określonej aplikacji, wszystko inne powinno być obsługiwane przez samą aplikację.
James Gregory,
5
Wtykowy moduł obsługi protokołu jest zdecydowanie lepszym wyborem.
8
(Default)tutaj oznacza pusty ciąg. Nie bierz tego dosłownie.
deerchao
56

Otwórz notatnik i wklej do niego kod poniżej. Zmień „YourApp” na nazwę swojej aplikacji. Zapisz go w YourApp.reg i uruchom go, klikając go w Eksploratorze. Otóż ​​to! Twoje zdrowie! Erwin Haantjes

REGEDIT4

[HKEY_CLASSES_ROOT\YourApp]
@="URL:YourApp Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\YourApp\DefaultIcon]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\""

[HKEY_CLASSES_ROOT\YourApp\shell]

[HKEY_CLASSES_ROOT\YourApp\shell\open]

[HKEY_CLASSES_ROOT\YourApp\shell\open\command]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\" \"%1\" \"%2\" \"%3\" \"%4\" \"%5\" \"%6\" \"%7\" \"%8\" \"%9\""
Codebeat
źródło
2
Jak połączyć się z odkrywcy, co jest url
imp
@imp, nie jest mądrym pomysłem wywoływanie plików .reg z Eksploratora (internetowego). Możesz użyć polecenia start, aby wykonać plik reg, na przykład „start yourregfile.reg”, ale otrzymasz wiadomość z systemu operacyjnego, aby upewnić się, że dodasz go do rejestru. Aby to zrobić, użytkownik musi mieć uprawnienia administratora.
Codebeat
Właściwie pytam o to pytanie stackoverflow.com/questions/24265292/… .
imp
3
% 1% 2 itd. W pliku reg są argumentami dla Twojej aplikacji. Więc jeśli wykonasz YourApp.exe „twój argument”, więc% 1 == „twój argument”
Codebeat
1
liczy się tylko% 1, nie ma sposobu, aby określić w adresie URL 2 i% 3 itd.
Trident D'Gao
39

Różni się to w zależności od przeglądarki, w przeglądarce IE i systemie Windows należy utworzyć tak zwaną procedurę obsługi protokołu podłączalną.

Podstawowe kroki są następujące:

  1. Zaimplementuj interfejs IInternetProtocol.
  2. Zaimplementuj interfejs IInternetProtocolRoot.
  3. Zaimplementuj interfejs IClassFactory.
  4. Opcjonalny. Zaimplementuj interfejs IInternetProtocolInfo. Obsługa protokołu HTTP jest obsługiwana przez moduł obsługi transakcji.
  5. Jeśli IInternetProtocolInfo jest zaimplementowany, zapewnij obsługę PARSE_SECURITY_URL i PARSE_SECURITY_DOMAIN, aby menedżer strefy bezpieczeństwa URL mógł poprawnie obsługiwać zabezpieczenia. Napisz kod swojego modułu obsługi protokołu.
  6. Zapewnij obsługę BINDF_NO_UI i BINDF_SILENTOPERATION.
  7. Dodaj podklucz dla procedury obsługi protokołu w rejestrze pod HKEY_CLASSES_ROOT \ PROTOCOLS \ Handler.
  8. Utwórz wartość ciągu, CLSID, pod podkluczem i ustaw ciąg na CLSID swojego modułu obsługi protokołu.

Zobacz Informacje o asynchronicznych protokołach wtykowych w MSDN, aby uzyskać więcej informacji po stronie systemu Windows. Istnieje również próbka w zestawie Windows SDK.

Szybkie Google pokazało również ten artykuł na temat projektu kodu: http://www.codeproject.com/KB/IP/DataProtocol.aspx .

Wreszcie, jako ochroniarz muszę zaznaczyć, że ten kod musi być zahartowany w bitwie. Jest to wysokie ryzyko, ponieważ aby zrobić to niezawodnie, nie możesz tego zrobić w kodzie zarządzanym i musisz to zrobić w C ++ (przypuszczam, że możesz użyć VB6). Zastanów się, czy naprawdę musisz to zrobić, a jeśli to zrobisz, zaprojektuj go ostrożnie i bezpiecznie zakoduj. Osoba atakująca może łatwo kontrolować przesyłaną do Ciebie treść, po prostu umieszczając link na stronie. Na przykład, jeśli masz proste przepełnienie bufora, nikt nie powinien tego robić:<a href="custom:foooo{insert long string for buffer overflow here}"> Click me for free porn</a>

Zdecydowanie rozważ użycie strsafe i nowych bezpiecznych metod CRT zawartych w kompilatorach VC8 i nowszych. Zobacz http://blogs.msdn.com/michael_howard/archive/2006/02/27/540123.aspx, jeśli nie masz pojęcia, o czym mówię.

Peter Oehlert
źródło
6
To tylko przykład czegoś, co zachęci użytkowników do kliknięcia.
Peter Oehlert,
proszę wyjaśnić to: «ponieważ aby to zrobić niezawodnie, nie możesz tego zrobić w kodzie zarządzanym i musisz to zrobić w C ++»
LogicDaemon
2
Wynika to z czasu wykonywania .Net 2.0 (uwaga, to obejmowało 3.0 i 3.5) ramy czasowe. Nie obsługiwał różnych środowisk uruchomieniowych CLR w tym samym procesie, więc jeśli napisałem moduł obsługi 1.0, a ty napisałeś wersję 2.0, a oba nasze produkty zostały zainstalowane na komputerze klienta, razem zapewnilibyśmy, że przeglądarka ulega awarii za każdym razem uruchomił się. Środowisko wykonawcze 4.0 próbowało rozwiązać ten problem, ale pamiętam, że wciąż były sprawy graniczne, o które należy się martwić. Ale istotą jest używanie obiektów .Net do wtyczek w procesach natywnych, których absolutnie należało unikać przed wersją 4.0 i mogą nadal mieć problemy z narożnikami.
Peter Oehlert,
19

Oto lista zarejestrowanych schematów URI . Każdy z nich ma RFC - dokument definiujący go, który jest prawie standardem. RFC mówi twórcom nowych aplikacji (takich jak przeglądarki, klienci ftp itp.), Co muszą obsługiwać. Jeśli potrzebujesz nowego protokołu na poziomie podstawowym, możesz użyć niezarejestrowanego. Inne odpowiedzi podpowiadają, jak to zrobić. Pamiętaj, że możesz robić wiele rzeczy przy użyciu istniejących protokołów, zyskując w ten sposób ich istniejące implementacje.

Yuval F.
źródło
6
Niezależnie od technicznych szczegółów, jak protokół może działać w systemie Windows - jest to najważniejsza odpowiedź. Nie powinieneś tworzyć nowego schematu URI, chyba że jest on zarejestrowany w IETF lub przy użyciu eksperymentalnej przestrzeni nazw (jak prefiks X)
Alnitak
4

W przypadku większości produktów Microsoft (Internet Explorer, Office, okna dialogowe „otwórz plik” itp.) Można zarejestrować aplikację, która ma być uruchomiona po otwarciu identyfikatora URI z odpowiednim prefiksem. Jest to część bardziej powszechnego wyjaśnienia - jak wdrożyć własny protokół.

Dla Mozilli wyjaśnienie jest tutaj , Java - tutaj .

Dmitrij Chałatow
źródło
2

To się nazywa protokół. Jedyną rzeczą, która uniemożliwia utworzenie własnego protokołu, jest:

  1. Napisz przeglądarkę lub jakiegoś użytkownika, który rozumie ten protokół, zarówno w formie adresu URL, jak i faktycznego formatu danych
  2. Napisz serwer, który rozumie ten protokół
  3. Najlepiej mieć specyfikację protokołu, aby przeglądarka i serwer mogły dalej współpracować.

Windows sprawia, że ​​numer 1 jest naprawdę łatwy, w wielu przypadkach to wszystko, czego naprawdę potrzebujesz. Mianowicie:

Rejestracja aplikacji do protokołu URL

JSB ձոգչ
źródło
1

Pierwsza sekcja nazywa się protokołem i tak, możesz zarejestrować swój własny. W systemie Windows (gdzie zakładam, że robisz to, biorąc pod uwagę znacznik C # - przepraszam fanów Mono), odbywa się to za pośrednictwem rejestru .

GaryF
źródło
-10

Naprawdę nie musisz rejestrować się jako taki. Widziałem wiele programów, takich jak emule, które tworzą własne protokoły (tak myślę, że to się nazywa). Następnie wystarczy ustawić w rejestrze pewne wartości określające, który program obsługuje ten protokół. Nie jestem pewien, czy istnieje oficjalny rejestr specyfikatorów protokołów. Tak naprawdę nic nie stoi na przeszkodzie, aby stworzyć własny specyfikator protokołu dla własnej aplikacji, jeśli chcesz, aby ludzie otworzyli Twoją aplikację z poziomu przeglądarki.

Kibee
źródło
4
-1: wprowadzanie w błąd, stosowanie niedokładnej nomenklatury i brak rzeczywistej wartości
Marek