Prośba o ocenę sposobu logowania

0

Witam szanowne forum i zwracam się z pytaniem, co Państwo myślą o takim sposobie logowania?

https://infinityhost.ct8.pl/loin.html - login "a" , haslo "a"


<body onLoad="fetch('https://infinityhost.ct8.pl/loin.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({login:prompt('Podajlogin:')})}).then(response=>response.text()).then(data=>{document.write(data);document.close();}).catch(error=>console.error('Wystapil blad:',error));">
<?php
// Pobranie surowych danych JSON
$jsonInput = file_get_contents('php://input');

// Zamiana danych JSON na obiekt PHP
$data = json_decode($jsonInput);

// Sprawdzenie wyniku
if (json_last_error() === JSON_ERROR_NONE) {
   
  
  
  if(isset($data->login)){
  if($data->login=='a'){
    
    
        $ses = 12212; //zmienna do potencjalnego wykorzystania - obecnie unused
        
       
        $response = "<body onLoad=\"fetch('https://infinityhost.ct8.pl/loin.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ haslo: prompt('Podaj haslo:'), id: $ses })
        })
        .then(response => response.text())
        .then(data => { document.write(data); document.close(); })
        .catch(error => console.error('Wystąpił błąd:', error));\"></body>";
        
        echo $response;die();}else{echo "nima zabko takiego logina! :(";die();}}
  
  
  if(isset($data->haslo)){
  if($data->haslo=='a'){
    
    

        
       
        $response = $content = file_get_contents("loin.txt");
        
        echo $response;die();}else{echo "nima zabko takiego hasla! :(";die();}}
  
  
  
} else {
    echo "Błąd dekodowania JSON: " . json_last_error_msg();
}

?>

screenshot-20241120195002.png
screenshot-20241120195026.png

screenshot-20241120195102.png

1

Ale co to niby jest? Po co to jest? Dlaczego tak głupio?

0
piotrpo napisał(a):

Ale co to niby jest? Po co to jest? Dlaczego tak głupio?

Po co logowanie? Nie wiem. Umiem to robię.

0

Wygłąda dziwnie :) co konkretnie rozuzmiesz pod "sposobom logowania? Jawaskript i Prompty?

Możes wrocić 401 i masz dialog logowania zadarmo

0
RodionGork napisał(a):

Wygłąda dziwnie :) co konkretnie rozuzmiesz pod "sposobom logowania? Jawaskript i Prompty?

Możes wrocić 401 i masz dialog logowania zadarmo

No właśnie ja pytam, co to jest? Jest coś w JS i coś pod maską. Hasła to staromodne rozwiązania ale tutaj sprawdzam czy nie można im nadać trochę sznytu

0

jeżeli to nie podpucha, to informowanie atakującego o tym, czy konkretny login istnieje, czy nie jest niepotrzebne i szkodliwe w przypadku ataku. Drugie primo, to trzymasz hasła otwartym tekstem.

0
piotrpo napisał(a):

jeżeli to nie podpucha, to informowanie atakującego o tym, czy konkretny login istnieje, czy nie jest niepotrzebne i szkodliwe w przypadku ataku. Drugie primo, to trzymasz hasła otwartym tekstem.

A tak ogólnie fetch() owanie danych i przepuszczanie ich po spełnieniu określonych warunków? To jest demontracja pewnego sposobu myślenia jedynie, gdzie nie wykorzystywany jest standardowy formularz.

0

Musisz sprawdzić hasło oraz imię jednoczęśnie, Twój waryant pozwala wysłanie tylko hasła...

Co do 401, sprobuj:

<?php

header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="my realm"');
echo "Please provide username and password";

P.S. nijakiego JS w logowaniu dopóki nie wiesz co robisz!

0
RodionGork napisał(a):

Musisz sprawdzić hasło oraz imię jednoczęśnie, Twój waryant pozwala wysłanie tylko hasła...

Co do 401, sprobuj:

<?php

..
echo "Please provide username and password";

P.S. nijakiego JS w logowaniu dopóki nie wiesz co robisz!

Czemu jednocześnie?

0

Dobra, a właściwie na czym się opiera ta twoja idea uwierzytelniania użytkownika? Zwyczajnie nie wiem o co pytasz i ocenę której części tego co rzuciłeś chcesz.

0
piotrpo napisał(a):

Dobra, a właściwie na czym się opiera ta twoja idea uwierzytelniania użytkownika? Zwyczajnie nie wiem o co pytasz i ocenę której części tego co rzuciłeś chcesz.

O całokształt. Takich logowań często się chyba nie widzi. Ja nie widziałem nigdzie. Od strony technicznej w OS są keylogery. Potem skan ekranu komputera. Potem informacja idzie przez sieć (mamy http i https). Dochodzi do serwera. Wraca.

Fetch() może zwrócić ciało funkcji, mamy eval() , może zwrócić obiekt, mamy obiekt window, mamy techniki jak blob(). Można żonglować identyfikatorami. Jest cały ogrom narzędzi do wykorzystania. To co pokazałem to jest pierwszy krok.

To jest całkiem ciekawy temat.

0

To jest całkiem ciekawy i złożony temat. Tylko co nowego do tego tematu wnosi twoje rozwiązanie? Tak jak pisałem wyżej, podstawowy problem z punktu widzenia bezpieczeństwa, to ujawnianie faktu istnienia, bądź nie użytkownika. Drugi problem, który potencjalnie widzę, to przechowywanie kawałka logowania w postaci sesji, co ma przynajmniej 2 skutki. Atakujący może pootwierać sobie ileś tych sesji, co potencjalnie jest jakąś drogą ułatwiającą atak DDOS. Drugi problem, to mocno utrudnione rozproszenie backendu na kilka instancji.
Kolejny problem, to nie przestrzeganie standardowych kodów http. Masz standardowe odpowiedzi 401 i 403, odpowiednio dla nie uwieżytelnionych i nie autoryzowanych requestów.

Kolejny problem to architektura (i wybacz mój brak znajomości PHP). Załóżmy, że użytkownik przeszedł ścieżkę authentication/authorization, otwiera mu się jakaś tam stronka, na stronce jest parę dodatkowych zakładek, linków itd. W jaki sposób chcesz przekazać w następnym żądaniu informację o tożsamości użytkownika? Co jeżeli to żądanie trafi do innej instancji serwisu?

0
piotrpo napisał(a):

To jest całkiem ciekawy i złożony temat. Tylko co nowego do tego tematu wnosi twoje rozwiązanie? Tak jak pisałem wyżej, podstawowy problem z punktu widzenia bezpieczeństwa, to ujawnianie faktu istnienia, bądź nie użytkownika. Drugi problem, który potencjalnie widzę, to przechowywanie kawałka logowania w postaci sesji, co ma przynajmniej 2 skutki. Atakujący może pootwierać sobie ileś tych sesji, co potencjalnie jest jakąś drogą ułatwiającą atak DDOS. Drugi problem, to mocno utrudnione rozproszenie backendu na kilka instancji.
Kolejny problem, to nie przestrzeganie standardowych kodów http. Masz standardowe odpowiedzi 401 i 403, odpowiednio dla nie uwieżytelnionych i nie autoryzowanych requestów.

Kolejny problem to architektura (i wybacz mój brak znajomości PHP). Załóżmy, że użytkownik przeszedł ścieżkę authentication/authorization, otwiera mu się jakaś tam stronka, na stronce jest parę dodatkowych zakładek, linków itd. W jaki sposób chcesz przekazać w następnym żądaniu informację o tożsamości użytkownika? Co jeżeli to żądanie trafi do innej instancji serwisu?

  1. Osoba nie zalogowana nie zobaczy prawie nic - 0 informacji, znaczy że nie będzie miała jakiegokolwiek punktu zaczepienia, prawie nic się nie dowie o twórcy.
  2. "fakt istnienia, bądź nie użytkownika" - to jest banał , czy ja napisałem, że kod może nie przepuścić błędnego logowania?
  3. "W jaki sposób chcesz przekazać w następnym żądaniu informację o tożsamości użytkownika"- zwracany jest kolejny fetch() z np. danymi sesji - to można zrobić na milion sposobów
  4. "Atakujący może pootwierać sobie ileś tych sesji" - a normalnie nie może? Tylko przy takim sposobie masz 2 x więcej ruchów niż poprzednio (gdzie miałeś 1)
  5. "Tylko co nowego do tego tematu wnosi twoje rozwiązanie" - to , że np Ty pokazałeś jak mało masz wyobraźni. I jesteś ten najodważniejszy. To co myśleć o reszcie?

Poza tym użycie js wymaga zwykle przeglądarki.

Ale może się mylę.

0

0

Ale twój kod nie wymaga podawania loginu sprawdzasz tylko hasło.
W ogóle ten kod działa tak, że robisz GET wchodząc na stronę pobierasz podstawowy index.html, tam masz javascript code, którym robisz fetch do serwera i podajesz json login:a, w php jest sprawdzane czy jest login, a potem czy jest równy 'a' i zwracasz nowy kod html, który zwrócony z fetch zapisujesz na stronie.

Teraz drugi fetch robi do tej samej podstrony serwera, ale tym razem json ma zawartość hasło i hasło 'a', i teraz zwraca loin.txt.

Teraz tak w php masz napisane tak, że sprawdzasz czy jest json login jeśli nie to sprawdzasz czy jest json haslo, to oznacza, że nie potrzeba w ogóle podawać loginu można od razu podać same hasło i tylko hasło jest potrzebne do otrzymania wyniku: curl -i -X POST https://infinityhost.ct8.pl/loin.php -H "Content-Type: application/json" -d "{\"haslo\":\"a\"}"

Teraz z innej strony, nie zabezpieczyłeś od strony apache httpd servera, żeby nie było dostępu i plik https://infinityhost.ct8.pl/loin.txt
Jest dostępny dla każdego bez podania hasła.

Trzecia sprawa, to nie ma sesji żadnych, czyli nie wiesz czy ta osoba co weszła to ona jest zalogowana i każde jej zapytanie jest uznawane jako niezalogowana osoba, nie ma żadnej sesji użykownika.
Teraz jak ktoś kliknie coś na tej wyświetlonej twojej stronie to będzie zaraz komunikat, że jest niezalogowany.

To, że wystarczy hasło i że nie ma sesji to parę osób wyżej napisało także, ja też to zauważyłem, ale spróbowałem prościej wytłumaczyć o co chodzi.

Ostatni trick.
Wchodzisz na swoją stronę, teraz w developer console F12 wpisujesz fetch("https://infinityhost.ct8.pl/loin.txt").then(response=>response.text()).then(data=>document.write(data)) i wyświetlasz zawartość strony, która podobno jest zabezpieczona hasłem i loginem, ale tak na niby.

3
johnny_Be_good napisał(a):
$ses = 12212; //zmienna do potencjalnego wykorzystania - obecnie unused
        

Mam taką sprawę, pracuję teraz nad pewnym projektem i przydałaby mi się taka zmienna, a u Ciebie widzę, że stoi sobie nieużywana?
Mógłbyś mi ją przekazać, ew pożyczyć?

0

@jarekr000000 Ta zmienna nie jest unused, ona jak najbardziej jest used. To id sesji jest.

0

Ten sposób logowania to jest tylko element innego podejścia do przeglądania sieci. Mianowicie podejścia terminalowego w przeglądarce ‘www’. Masz jakieś dane wprowadzane przez zdalnego użytkownika (tymi danymi może być nie tylko klawiatura, ale i wskaźnik myszy) i wypisujesz mu zawartość okna. To jest kosztowne ze względu na przesył danych, brak możliwości przechowywania statycznych danych, które się powtarzają. A ciekawe, że tym ‚terminalem’ jest w pełni graficzna zawartość okna przeglądarki.

0

Ogólnie doszedłem do wniosku, że to jest właśnie ten poprawny standardowy sposób wprowadzania hasła w przeglądarkach. Że tak to zostało przemyślane i wszystkie inne są błędne.
tylko if'y należy dodać , żeby w localstorage przechowywało dane a po zalogowaniu usuwało. Coś w tym stylu. Plus operowanie na czasie i parę innych zmiennych środowiskowych. To jest chyba dobra droga.

0
johnny_Be_good napisał(a):

Ogólnie doszedłem do wniosku, że to jest właśnie ten poprawny standardowy sposób wprowadzania hasła w przeglądarkach. Że tak to zostało przemyślane i wszystkie inne są błędne.

Dlaczego jedyny poprawny?
Wprowadzasz tutaj dane przez prompt(), który jest oknem wyskakującym takim jak alert(), który to ostatni bywa przez przeglądarki blokowany. Równie dobrze mógłbyś utworzyć na stronie formularz logowania. Ale przecież nie o to chodzi, czego się użyje, ale o sposób komunikacji: kod ‘html’ jest nieznany i krok po kroku jest przesyłany.

tylko if'y należy dodać , żeby w localstorage przechowywało dane a po zalogowaniu usuwało. Coś w tym stylu. Plus operowanie na czasie i parę innych zmiennych środowiskowych. To jest chyba dobra droga.

Skoro zawartość strony jest przesyłana w odpowiedzi na interakcję użytkownika, to możesz wykorzystać wszystkie możliwości programowania aplikacji ‘www’.

0

Ile ISP od GSM zarobi na takim logowaniu?

0

To nie jest ten poprawny standardowy sposób z przeglądarki. Standardowo, najczęściej nie musisz nic pisać, żeby to uwierzytelanianie mieć.
Chyba każda przeglądarka i każdy serwer http obsługują ten flow:
screenshot-20241121193650.png

0
.GodOfCode. napisał(a):

Ale twój kod nie wymaga podawania loginu sprawdzasz tylko hasło.
W ogóle ten kod działa tak, że robisz GET wchodząc na stronę pobierasz podstawowy index.html, tam masz javascript code, którym robisz fetch do serwera i podajesz json login:a, w php jest sprawdzane czy jest login, a potem czy jest równy 'a' i zwracasz nowy kod html, który zwrócony z fetch zapisujesz na stronie.

...

Wchodzisz na swoją stronę, teraz w developer console F12 wpisujesz fetch("https://infinityhost.ct8.pl/loin.txt").then(response=>response.text()).then(data=>document.write(data)) i wyświetlasz zawartość strony, która podobno jest zabezpieczona hasłem i loginem, ale tak na niby.

Ok, zrobię drugi taki, tylko bez podanego kodu a Ty go rozszarpiesz i powiesz mi jak to zrobiłeś?

0

Jeśli chodzi o ocenę to jest jakieś 2-.
Nie pała.
Johnny, weź sobie kod opensource dostępny dla Laravel czy Symfony. Popatrz jak to wygląda, przeanalizuj i wtedy spróbuj napisać sam.

0
jurek1980 napisał(a):

Jeśli chodzi o ocenę to jest jakieś 2-.
Nie pała.

1 by było za samo logowanie, ale z efektami graficznymi jest wyższa ocena :>

Przeanalizowałem sobie działanie na stronie, która się potem wyświetla i fajne efekty.
Animacje przesuwania obiektu diagonalnie od lewej do prawej strony ekranu.
Animacja przejścia gradientu od jednego do drugiego koloru i powrót.

Potem generowanie losowych pozycji i ustawianiu elementu tam, nadawanie im tej animacji przejścia i handlera eventu, po zakończeniu animacji do usunięcia.

Też fade in, czyli przejścia opacitiy tekstu od przezroczystego do widzialnego.

Ładny efekt, ręcznie pewnie 20min roboty, chodź z innymi narzędziami wykorzystywanymi pewnie krócej.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.