Skocz do zawartości
  • 0
producer

Problem z usunięciem backslaha

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

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Polecane posty

  • 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.

Edytowano przez Latreso
Poprawka kodu

Udostępnij ten post


Link to postu
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

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Nie powinieneś używać ani md5, ani sha1.  Rekomendowanym sposobem na zakodowanie haseł jest korzystanie z funkcji password_hash()

Udostępnij ten post


Link to postu
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

Edytowano przez Nagasheek

Udostępnij ten post


Link to postu
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

Udostępnij ten post


Link to postu
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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

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

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.


×
Okienko zamknie się za 5 sekund...