Skocz do zawartości
  • 0

Problem z usunięciem backslaha


producer
 Udostępnij

Pytanie

Witam witam, ostatnio męczyłem się z wszystkimi znakami a teraz przyszła pora na jeden konkretny.

Do systemu logowania podczas pobierania hasła z formularza zastosowałem

htmlspecialchars($_POST['password']);

Wszystko było by świetnie, lecz fakt że \ (backslash) potrafi wysypać mi stronę. Po wpisaniu ukośnika w pole hasło wyświetla się taki błąd " blad zapytania You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"\")' at line 1 " Wygląda na to że owy backslash przerywa polecenie, czy znacie jakąś funkcję lub możliwość naprawienia tego błędu? Mogę użyć str_replace() lecz ta funkcja całkowicie usunie użytkownikowi nawet możliwość zakładania konta z hasłem w którym będzie właśnie owy ukośnik, a chyba nie o to chodzi, wolałbym jednak aby użytkownik miał możliwość korzystania z slasha tak jak na innych stronach. 

 

Zamieszczę wycinki z kodu odpowiadającego za logowanie

Spoiler
if(isset($_POST['password'])){
		$password = htmlspecialchars($_POST['password']);
	}
if(!$connect){
		echo "Błąd połączenia z bazą danych";
	} else { 
			$zapytanie0 = 'select * from user where login = "'.$login.'" AND password = SHA1("'.$password.'")';
			$wynik0 = mysqli_query($connect,$zapytanie0);
			$wiersz0 = mysqli_fetch_array($wynik0);

$zapytanie = 'select * from user where login = "'.$login.'" AND password = SHA1("'.$password.'")';
			$wynik = mysqli_query($connect,$zapytanie);

if(!$wynik) {
					echo "blad zapytania ".mysqli_error($connect);
} else {
 // Tutaj mam polecenia co ma otworzyć gdy poda dobre dane logowania //

 

Z góry bardzo dziękuje wszystkim za pomoc

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Proste rozwiązania są najskuteczniejsze

htmlspecialchars(str_replace('\\','\\\\',$_POST['password']))

Powinno działać, nie analizowałem w ogóle kodu może gdzieś jeszcze coś do poprawy.

(podwójny "\\" jest dlatego, że sam znak "\" jest specjalny i trzeba go tak jakby anulować)

 

Ogólnie są jakieś funkcje i zasady, którymi należy się kierować, ale kiedyś sam się wszystkiego nauczysz ;)

 

 

PS: poczytaj sobie o hashowaniu haseł, wpisz w google np "php password hash" - chodzi o szyfrowanie haseł w bazie danych tak aby praktycznie niemożliwym było ich rozszyfrowanie.

Edytowane przez Latreso
Poprawka kodu
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
25 minut temu, Latreso napisał:

Proste rozwiązania są najskuteczniejsze

htmlspecialchars(str_replace('\\','\\\\',$_POST['password']))

Powinno działać, nie analizowałem w ogóle kodu może gdzieś jeszcze coś do poprawy.

(podwójny "\\" jest dlatego, że sam znak "\" jest specjalny i trzeba go tak jakby anulować)

 

Ogólnie są jakieś funkcje i zasady, którymi należy się kierować, ale kiedyś sam się wszystkiego nauczysz ;)

 

 

PS: poczytaj sobie o hashowaniu haseł, wpisz w google np "php password hash" - chodzi o szyfrowanie haseł w bazie danych tak aby praktycznie niemożliwym było ich rozszyfrowanie.

Dziękuje za pomoc, hah używam sha1, ale miałem dylemat nad md5

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

zignoruj powyzsze rady i zainteresuj sie prepared statements

 

a na upartego nie wykonuj takich kombinacji, po prostu zahashuj ciag znakow przed konkatenacja

 

I nie uzywaj zadnych funkcji konwertujacych przy haslach (html_special_chars)

 

btw hashowanie i szyfrowanie to dwie rozne rzeczy

Edytowane przez Nagasheek
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Ogólnie to tak:

hashowanie, nie szyfrowanie - i wtedy nie używaj żadnych "htmlspecialchars" "str_replace" itp.

Do hashownia tak jak kolega wyżej napisał:

- funkcja hashująca https://secure.php.net/manual/pl/function.password-hash.php

- funkcja sprawdzająca https://secure.php.net/manual/pl/function.password-verify.php

 

 

A jeżeli chcesz wstawić rekordy do bazy to używaj tych funkcji:

htmlspecialchars( addslashes( $variable ) );

Wtedy A: pozbędziesz się tagów html, B: zneutralizujesz wszystkie znaki specjalne typu "\", "&" itp

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Po pierwsze - do bazy się łącz przez PDO i tam przygotowuj zapytania.

Po drugie - hasła hashowane. Koledzy już dali sporo informacji, nie dodam cegiełki, poza dodanie soli do tego. Salt+Hash to podstawa.

Po trzecie - htmlspecialchars - pomoże Ci w walce z XSS (nie pomoże, ale zmniejszy szanse minimalnie), ale nie nadaje się do pracy z hasłem.

Potrzebujesz pomocy z hostingiem? Daj znać poprzez Telegram lub Priv!

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Zaloguj się poniżej.

Zaloguj się
 Udostępnij

  • Ostatnio przeglądający forum Problem z usunięciem backslaha   0 użytkowników
    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...