Problem z kodem php - polski znak

0

Mam plik active.php
Plik ten będzie startowal, gdy ktoś w swojej skrzynce mailowej kliknie w link, w którym zdefiniowana jest zmienna $_GET
Przykład linku: www.page.php?active=username

Skrypt sprawdza czy konto jest nieaktywowane.
Jeśli jest nieaktywowane, kod aktywuje konto (wiersz 24 i 25) - (zmieniając wartość w kolumnie active na "y"),
oraz tworzy 3 zmienne SESSION dla moich potrzeb.

Gdy w zmiennej $_GET["active"] przechowuje "ś" (i każdy inny polski znam) to 3 zmienne SESSION deklarowane w wierszach 26, 27, 28 nie są tworzone - Dlaczego?
Ale wiersz 25 jest wykonywany. Wykonuje tam zmiane wartości w bazie danych. Dochodzi do zmiany. Jest to zawarte w tym samy bloku instrukcji if.

Gdy w zmiennej $_GET["active"] przechowuje "s" - jest wszystko OK.

0

Masz problem polegający na braku ochrony przed SQLInjection, dobrze, że nie podałeś adresu strony bo już miałbyś potencjalnie włam do bazy danych.

Skrypt generuje jakiś błąd PHP przy wartości z polskimi znakami diakrytycznymi?

Generalnie skrypt jest niedobry - nie przewidujesz np. sytuacji, że konto nie istnieje? Jesteś pewny, że zawsze będzie istnieć konto (linia 23)? Pomyśl, co się stanie jeżeli ktoś ten skrypt wywoła z jakąś bzdurną wartością dla parametru GET active? Skrypt jest strasznie dziurawy.

0

Skrypt nie generuje błędu.
Jeżeli konto (dokładniej mówiąc: nazwa użytkownika) nie istnieje to:

  • zmienna $result nie będzie zawierać danych (wiersz 21)
  • wiersz 23 - zapytanie if nie zwroci prawdy i blok nie zostanie wykonany.
  • Jeżeli ktoś wywola skrypt z jakas bzdurna wartoscia dla zmiennej get - skrypt nie zadziała.

Zdiagnozowałem problem:

  • Gdy w wierszu 20 użyję "ś" zamiast $name wszystko działa dobrze.
  • Coś niezrozumiałego dla mnie dzieje się w wierszu 18, podczas zapisu do zmiennej $name wartości zmiennej $_GET["active"] definiowanej w pasku adresu.

p.s. Co znaczy dziurawy kod?

0

Adres URL nie przechowuje polskich znaków, spacji itp.
Metoda GET wykorzystuje dane z adresu URL.

0

@dualjack

Utworzylem na mojej stronie użytkownika "a", oraz "ą"
Następnie wpisałem w pasku adresu: www.myPage.php/?active=ą

Zostaje uruchomiony skrypt odczytujący wartość zmiennej $_GET ["active"]

  • Wartość zostaje zapisana w zmiennej $name,
  • $name zostaje użyta w zapytaniu SQL,
  • Zostaje zmieniona wartość w kolumnie active z wartości: "n" na wartość: "y", w wierszu gdzie nazwa użytkownika to wartość pobrana z pasku adresu.

Po użyciu powyższego linku następuje zmiana wartości dla użytkownika "ą" - polski znak.
Wniosek::::::::::::::::::::::
Adres URL PRZEchowuje polskie znaki.

Problemem jest nie tworzenie się zmiennych SESSION w tym samym bloku kodu, gdy w wartości zmiennej $_GET istnieje polski znak. ;(

0

Może zamiast używać nazwy użytkownika, używaj numeryczneog identyfikatora? Musisz się jeszcze wiele nauczyć, zamiast tutaj męczyć, lepiej przeczytaj kursy php, i to najlepiej kilka.

0

Jak już to powinieneś konwertować tą nazwę użytkownika. Są do tego funkcje

$utf8 = 'testżźćą';
$url = rawurlencode('testżźćą');
var_dump($url);
$decoded = rawurldecode($url);
var_dump($decoded);

A jeśli chodzi o "dziurawość" kodu, to faktycznie poczytaj o walidacji. Koniecznie musisz to sobie zabezpieczyć.

0

@Irus8: Ogólnie z założenia kod wydaje się błędny. Ale jak to kod na potrzeby nauki to się męcz - jakieś wnioski wyciągniesz. Jak to kod który ma pójść na Internet to katastrofa. Jakbyś ogólnie powiedział co tworzysz i może dałoby się to jakoś opakować w coś normalnego i bezpiecznego

0

@hapertown

  • Kod jest częścią mojego projektu panelu autoryzacyjnego, który tworzę w ramach edukacji.
  • Fragment kody, kóry załączyłem służy jedynie do zmiany wartości z: "n" na wartość: "y" w kolumnie active w bazie danych.
  • Nie rozumiem jakie zagrożenie istnieje.
  • Kod przyjmuje wartość zmiennej $_GET["active"] a następnie porównuje ją z nazwami użytkowników w bazie, jeśli znajdzie dopasowanie to
    sprawdza czy konto jest nieaktywne i w takim przypadku aktywuje je - zmieniając wartość w kolumnie active.
  • Nie widzę zagrożeń.
  • Ktoś potrafi wskazać konkretne? zamiast mówić o dziurach

@jurek1980

  • Obadam temat i opowiem jak mi poszlo.

@TomRZ

Dziękuje za pomysł - wydaje się świetny - może go użyje.

0

Nie rozumiem jakie zagrożenie istnieje.

@Irus8: widziałeś kiedyś na jakiś portalach/stronach, żeby aktywacja konta przebiegała przez nazwę użytkownika w GETcie? W ogóle żeby tego typu dane jawnie przesyłać poprzez GETa? To jak ktoś sobie wygeneruje 20k losowych loginów i przepuści przez Twoją apkę te loginy w żądaniach GET to aktywuje Ci albo dezaktywuje 20000 kont?
Słyszałeś o czymś takim jak BOOLEAN? Zmiana stanu z 0 na 1 (nieaktywny/aktywny)?
Nie wiem co tam sobie kombinujesz, nie musisz nikogo słuchać na tym forum jak nie chcesz, ale skoro jest to kwestia edukacji to po co uczysz się od razu źle? Nie rozumiem tego..
Jak pójdziesz do pracy z takim kodowaniem to pierwszego dnia Cię wyrzucą..

0

@hapertown

Samemu wpadłem na taki pomysł aktywacji konta. Na razie nie znam innego.

@jurek1980

<?php //Wpisuje adres: //http://www.index.php?active=ś $name = $_GET["active"]; echo $name; //// Efekt w przeglądarce: � - Dokładnie to wyskakuje kwadracik, który tutaj wygląda właśnie tak po wklejeniu. // Wniosek: Polskie znaki pobierane z paska adresu są kodowane jakoś // - pobieram "ś" - otrzymuję: "�" // Wsyzstkie trzy funkcje nie potrafią zdekodować tego znaczka do "ś"> $url_01 = base64_decode($name); $url_02 = rawurldecode($name); $url_03 = urldecode($name); var_dump($url_01); echo "
"; var_dump($url_02); echo "
"; var_dump($url_03); echo "
"; ?>

P.s. Użytkownik @TomRZ dał mi dobry pomysł jak rozwiązać mój problem i spróbuje go zastosować.

  • Jednak w ramach nauki bardzo pragnę dowiedzieć się jak pobrać (poprawną) wartość zmiennej $_GET gdy jest definiowana w pasku adresu, oraz zawiera polski znak.
0

Samemu wpadłem na taki pomysł aktywacji konta. Na razie nie znam innego.

To może warto byłoby najpierw zgłębić podstawy a potem zabrać się za kodowanie takich rzeczy.

0

Dostałeś już rozwiązanie problemu, tylko kręcisz się w kółko. Problemem jest przygotowanie adresu linku aktywacyjnego, użytkownik powinien dostać coś takiego:

$link = "https://jakas.strona/?active=".  rawurlencode($username);
0

Irus8 - źle mnie zrozumiałeś.Funkcja rawurlencode() służy do zamiany znaków z poza ASCI na szesnastkowe, tak by można było poprzez GET przesłać znaki z UTF8.
Zobacz tutaj: https://www.w3schools.com/tags/ref_urlencode.asp
Jak napisał Panczo stosujesz to zarówno do tworzenia URL'a jak i potem do transformacji danych z GET..

0

A nie możesz tego rozwiązać po ludzku, tokenem? W najprostszej postaci robisz sobie jakiś token via SHA512, zapisujesz do usera do bazy. wpinasz do urla, odszukujesz usera po tokenie i odpalasz aktywację. I co tu kombinować i się pałować...

Kto słyszał w ogóle o tym, żeby loginy były w UTFie..

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