zabezpieczanie klucza API

zabezpieczanie klucza API
Gouda105
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 dni
  • Postów:487
0

Witam,
czy istnieje możliwość zabezpieczenia klucza API w zapytaniu, aby nie był on widoczny w debugerze? Chodzi o to, że mam funkcję fetch, w której mam adres URL do openweathermap, w którym znajduje się klucz API. Cały ten kod można podejrzeć w konsoli i w ten sposób może wyciec klucz API, a tego nie chce. Czy ma ktoś pomysł jak temu zaradzić? Czy będzie trzeba zrobić to w PHP?

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:3462
6

To co masz w JS i co wykonuje się po stronie przeglądarki można zawsze podejrzeć. Możesz dopisać jakaś funkcję kodująca, no ale i tak ktoś kogo ten klucz zainteresuje to znajdzie tą funkcję.

edytowany 1x, ostatnio: jurek1980
KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 godziny
  • Postów:663
3

Jeśli zapytanie do OWM jest wykonywane przez kod JS w przeglądarce, to jak zauważyłeś, można go podejrzeć. Żadne szyfrowanie czy cudowanie nie pomoże, bo ostatecznie cwany użytkownik wejdzie w zakładkę Network i będzie go widział. Najczęstsze rozwiązanie to odpytywanie swojego backendu (np. tak jak mówisz w PHP), a backend odpytuje zewnętrzny serwis, odpowiedź przekazując na frontend. Wtedy klucz zostaje na serwerze.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:29 minut
  • Lokalizacja:Poznań
  • Postów:8769
3

@kelog: a w jaki sposób zabezpieczysz się przed tym, żeby ktoś inny nie zaczął z boku bombardować tego backendu zapytaniami? Klucz zasłonisz w ten sposób, ale jeśli np. masz naliczane opłaty za każde skorzystanie z klucza, to i tak możesz się narazić na nieplanowane wydatki.


edytowany 1x, ostatnio: cerrato
KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 godziny
  • Postów:663
1

A to już inne pytanie :) Fakt, należało by zastosować coś, co uniemożliwi nadużywanie dostępu do API. Limit odpytań na minutę/godzinę, limit per użytkownik, jakiś backpressure może.

mar-ek1
  • Rejestracja:prawie 14 lat
  • Ostatnio:2 dni
  • Postów:525
1

Niektóre API, zwłaszcza te płatne albo bardzo płatne mają opcję ograniczenia zapytań do konkretnej domeny - jak ktoś nie uderza z Twojej domeny to ten klucz będzie dla niego bezużyteczny. Więc możesz spróbować poszukać takiej opcji. W Google Maps mają coś takiego (https://webmasters.stackexchange.com/a/95919) wiec w OWM może ma podobnie.


TomekCph
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:26
0
Gouda105 napisał(a):

czy istnieje możliwość zabezpieczenia klucza API w zapytaniu, aby nie był on widoczny w debugerze?

Tak, istnieje, jest tylko jedna skuteczna metoda => nie ujawniać niepublicznych danych. Jakiś publiczny klucz w ścieżce ujdzie, ale jakiś ClientSecret... nope my friend. Wiele stron, które ma jakieś usługi i sekretne klucze API zawsze krzyczy, żeby ich kluczy nie ujawniać. Radzę stosować się do tych zaleceń :)


Success is the ability to go from failure to failure without losing your enthusiasm
mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
0

@TomekCph: ale też wiele stron nie krzyczy i nie oferuje żadnych zabezpieczeń lub nawet w przykładach zaleca korzystanie na froncie, zresztą, jakbyś przeczytał cały wątek to byś nie popełnił takiego postu.


It's All About the Game.
AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 4 godziny
1

Jakieś chyba 5 lat temu próbowałem automatycznie zgrać listę stacji z SDR.hu (już to nie istnieje), długo myślałem, dlaczego lista odbiorników w formacie JSON nie odpowiada temu, co wyświetla się na stronie. Okazało się, że odpowiedzi JSON to, co było otwartym tekstem i robiło się czytelne po sformatowaniu tego tekstu, to były tylko śmieci (co odświeżenie, wartości parametrów były inne, co już sugerowało, że coś jest nie tak i że to nie jest użyteczna treść), natomiast prawdziwa treść była zakodowana w spacjach, tabulatorach i enterach. Po dłuższym czasie udało się odnaleźć funkcję, przez którą był przepuszczany ten tekst i na wyjściu dostawałem już tą prawdziwą treść JSON. Nie próbowałem analizować sposobu kodowania tekstu w niewidocznych znakach, bo nie było potrzeby, ale długo nie wpadłem na to, że właśnie w nich może być ukryta wartościowa treść.

Tak, jak przedmówcy napisali, dostęp do danych przetwarzanych po stronie klienta można utrudnić, ale nie można uniemożliwić. Jednak, jak się uprzesz, to może spróbujesz przemycić klucz w spacjach i tabach, dodając do tego jakieś śmieci.

Chyba jedynym sposobem jest PHP lub innej technologii wykonywania kodu po stronie serwera i użycie jakiegoś pośrednika, gdzie pośrednik wczyta mapę pogody, czy co tam chcesz, do siebie korzystając z klucza, a potem odda tą treść do klienta.

edytowany 3x, ostatnio: andrzejlisek
TomekCph
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:26
0
mr_jaro napisał(a):

@TomekCph: ale też wiele stron nie krzyczy i nie oferuje żadnych zabezpieczeń lub nawet w przykładach zaleca korzystanie na froncie, zresztą, jakbyś przeczytał cały wątek to byś nie popełnił takiego postu.

No jakieś słabe strony pewnie nie. Ja takich nie spotkałem jeszcze, poza tym, no na logikę, jak ktoś zalecać stosowanie kluczy na froncie, które z zasady są niejawne? Nie kupuję takiego tłumaczenia :) Ogólna zasada - na froncie w JS nic nie jest bezpieczne.


Success is the ability to go from failure to failure without losing your enthusiasm
mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
0

@TomekCph: np wczytywanie map, maptiler najlepszy obecnie odpowiednik google mapsów do wstawiania na stronę, w jaki sposób chcesz wyświetlić dynamiczną mapę na stronie nie podając publicznie klucza? W Dokumentacji jest podane by dodawać listę akceptowanych domen i to się robi ale nie zabezpieczysz się przed tym całkowicie np gdy ktoś sobie na localu postawi taką domenę :)


It's All About the Game.
edytowany 1x, ostatnio: mr_jaro
TomekCph
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:26
0
mr_jaro napisał(a):

@TomekCph: np wczytywanie map, maptiler najlepszy obecnie odpowiednik google mapsów do wstawiania na stronę, w jaki sposób chcesz wyświetlić dynamiczną mapę na stronie nie podając publicznie klucza? W Dokumentacji jest podane by dodawać listę akceptowanych domen i to się robi ale nie zabezpieczysz się przed tym całkowicie np gdy ktoś sobie na localu postawi taką domenę :)

No bo to klucz publiczny i musisz dodać akceptowaną domenę, aby nikt inny jej nie użył (patrz dokumentacja), i w takim przypadku jest to wystarczające zabezpieczenie - nie, na lokalu nikt sobie niczego nie postawi ;)

To chyba zły przykład ;) Chodzi o sekretne klucze, takie, których nie chcemy ujawniać, no takich to ja wolę nie ujawniać.


Success is the ability to go from failure to failure without losing your enthusiasm
mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
1

@TomekCph: Taki sam klucz jak każdy inny z dostępem do api


It's All About the Game.
TomekCph
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:26
0
mr_jaro napisał(a):

@TomekCph: Taki sam klucz jak każdy inny z dostępem do api

Imho dla mnie nie, rozróżnienie jest celowe i nie bierze się znikąd - jest większa szansa, że jakiś Janusz nie będzie klucza API umieszczał w kodzie itp. itd. Ogólna zasada, wszystko co wrażliwe, nie jest wystawiane na widok publiczny. A wyjątki, jak sam podałeś, ograniczyć API key do domeny, plus sam klucz może mieć krótką żywotność, itd.


Success is the ability to go from failure to failure without losing your enthusiasm
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)