Problem z kodem php - polski znak

Problem z kodem php - polski znak
I8
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:11
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.

TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
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.


DRY > SOLID (nie bierz tego zbyt poważnie)
edytowany 7x, ostatnio: TomRZ
I8
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:11
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?

edytowany 2x, ostatnio: Irus8
DU
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:106
0

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

I8
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:11
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. ;(

edytowany 1x, ostatnio: Irus8
TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
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.


DRY > SOLID (nie bierz tego zbyt poważnie)
edytowany 1x, ostatnio: TomRZ
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 godzin
  • Postów:3462
0

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

Kopiuj
$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ć.

HA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:335
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

pol90
Jak można po 6 linijkach oceniać kod ?
HA
Tak jak i wprawny mechanik samochód - po wyglądzie wiadomo czego się spodziewać.
I8
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:11
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.

edytowany 1x, ostatnio: Irus8
HA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:335
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ą..

I8
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:11
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.
edytowany 2x, ostatnio: Irus8
pol90
A kodowanie znaków w pliku php masz dobre ?
HA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:335
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.

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
  • Postów:3866
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:

Kopiuj
$link = "https://jakas.strona/?active=".  rawurlencode($username);
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 godzin
  • Postów:3462
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..

HA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:335
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..

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)