Zabezpieczenie połączenia

0

Witam. Ostatnio stworzyłem skrypt w js do komunikacji z serwerem. Ma on za zadanie zmieniać liczbę monet, jednak aby go zabezpieczyć chciałem wykonać coś takiego:

-przeglądarka wysyła nową liczbę monet i obecne hasło,
-serwer sprawdza czy hasło jest poprawne,
-jeśli tak zapisuje nową wartość do bazy.

A pobieranie hasła odbywa sie tak:
-przeglądarka wysyła prośbę o hasło do serwera, przekazując przy tym poprzednie hasło (chyba że jest to dopiero początek sesji wtedy hasło jest puste),
-serwer przekazuje przeglądarce nowe hasło,
-przeglądarka zapisuje hasło do zmiennej.

I to pobranie następuje co 10 sec.

Skypt js:

setInterval(getPassword,10000); //Zmiana hasla co 10 sec

function getPassword (){
    if(login !== undefined){
    $.post (pageLink + "getSessionPassword.php", {lastPassword : localStorage.getItem("serverPassword")}, function (password){
        //console.log(localStorage.getItem("serverPassword"));
    if(password=="Error")
        console.error("Zle haslo");
    else
        localStorage.setItem("serverPassword", password);
        console.log(password);
        return 0;
    }
    );
    } else return -1;
}

Skrypt getSessionPassword.php:

<?php

session_start(void);

if($_POST["lastPassword"] == $_SESSION["sessionPassword"]){
        $_SESSION["sessionPassword"] = rand(11111111111, 999999999999999999999);
        echo $_SESSION["sessionPassword"];
}
else
    echo "Error";

?>

No i skrypt do zmiany ilości monet:

function TokenMinus (tokenNum)
{
    if (tokenNum > 0)
    {
    tokens -= tokenNum;
    $.post(pageLink + "setTokens.php", {newTokensNumber: tokens, connectPassword: localStorage.getItem("serverPassword")}, function (a){
        if(a == "Error")
            console.error("Bad server password");
        });
    document.getElementById("tokensNum").textContent = tokens;
    } 
    else 
        console.error("Bledna ilosc tokenów");
}	

I wszystko by było fajnie gdyby nie to że przez przeglądarkę można uruchomić konsole i wpisać coś takiego:

$.post(pageLink + "setTokens.php", {newTokensNumber: 1000000, connectPassword: localStorage.getItem("serverPassword")});

Dostęp do zmiennej serverPassword można uzyskać bez problemu. I tu pytanie czy można w jakiś sposób zabezpieczyć tą zmienną? Tak aby taką komendą nie udało się uzyskać do niej dostępu?

Z góry dzięki za pomoc.

0

Nie. To zła forma zabezpieczenia z trzech powodów:

  1. Kod w JS jest jawny, każdy go może przeczytać, co ułatwia rozpracowanie rzeczy
  2. W JS praktycznie nie istnieją rzeczy prywatne. Do wszystkiego można się dostać i wszystko nadpisać.
  3. Powyższe i tak nie ma znaczenia, bo w narzędziach deweloperskich przeglądarki można podejrzeć co się wysyła i odbiera przez sieć.

Jak poprawnie zrobić taką komunikację z serwerem to nie wiem. Zawsze mnie to jedynie zastanawiało, ale 100% skutecznych rozwiązań to chyba nie ma - patrz: ilość cheaterów w grach online. Każda gra ze statystykami osiągnięć ma po jakimś czasie te statystyki pohakowane.

Popatrz też pod tym linkiem i podobnymi hasłami:
https://www.google.pl/search?q=how+securely+send+high+score+data+to+server&gws_rd=cr&ei=EetCWL7yOIScsgHKor-QBw

Do głowy mi przychodzą takie rzeczy jak:

  • Jak najczęstsza komunikacja z serwerem. Zastosowanie prostych elementów typu podpisywanie wysłanych danych. Blokowanie gracza w momencie wykrycia jakichkolwiek 100% pewnych nieprawidłowości (np. niepoprawny podpis, zapewne w pierszych requestach coś spieprzy, ale w późniejszych poprawi).
  • Rozwijając powyższe - być może dobrym sposobem jest coś w rodzaju honeypota. Tj. wykrywasz oszustwa - oznaczasz sobie gracza jako oszusta i po prostu wykluczasz go z publicznie dostępnych wyników, jednocześnie pozwalasz mu widzieć jego własny oszukany wynik - często uznając swój "sukces" taki ktoś odpuszcza od dalszego - tym razem skutecznego - atakowania.
  • Również rozwijając pierwsze - wysyłając wszelkiego rodzaju dane jak najczęściej jesteś w stanie przewidzieć na ile możliwy w ogóle jest określony wynik. Jesteś pewien, że w minutę można uzyskać max. 800-1000 punktów. Oznacz gracza jako oszusta, jeżeli wyśle coś powyżej 1500. Większość na dzień dobry po rozpracowaniu komunikacji i tak Ci wyśle wartości idące w miliony.

Powyższe można zastosować nie tylko do gier, ale wszelakich systemów online.

0

Dzięki za odpowiedź. Rozumiem wszystkie twoje idee i z pewnością je wykorzystam, ale mam pytanie czy można by utrudnić jeszcze jakoś życie chiterowi? Może właśnie jakieś oprogramowanie które utrudnia czytanie kodu js? Wiem że takie programy są i zmniejszają kod js przy okazji. No i może są jeszcze jakieś języki które nie można odczytać przez przeglądarkę lub jest to trudne a mógłbym wywołać taką funkcję z js no i żeby działało w sposób jak podany wyżej?

0

Nie zrozumiałem do końca co chcesz osiągnąć ale jako 1 z form zabezpieczeń możesz wykrywać czy użytkownik ma otwartą konsolę I blokować wyniki tych którzy przynajmniej raz ją otworzyli. https://github.com/sindresorhus/devtools-detect

1 użytkowników online, w tym zalogowanych: 0, gości: 1