bezpieczeństwo if

1
$zmienna = sha1("test");

if($_POST['string'] != $zmienna)
{
echo "blad";
}

Czy w taki sposób zapisany if jest w pełni bezpieczny, czy zaleca się jeszcze użyć np. htmlspecialchars na $_POST['string'] przy porównywaniu?

0

a po co? przecież if nie wykonuje zawartości zmiennych, nie wyświetlasz też w tym kodzie zawartości post.
rozumiesz co robi htmlspecialchars i gdzie się tego powinno używać? poczytaj dokumentację i przykłady, zapoznaj się z pojęciami xss i sql injection (to drugie tak na przyszłość).

0
pele221 napisał(a)
$zmienna = sha1("test");

if($_POST['string'] != $zmienna)
{
echo "blad";
}

Czy w taki sposób zapisany if jest w pełni bezpieczny, czy zaleca się jeszcze użyć np. htmlspecialchars na $_POST['string'] przy porównywaniu?

nie wiem skąd wziąłeś takie teorie - dopóki ten kod nie będzie w eval to wszystko jest ok
jedynie warto by tam było sprawdzić issetem czy $_POST['string'] jest w ogóle ustawione bo inaczej będziesz mieć notice - potem taki ktoś ma dużo notice'ów i zamiast się ich pozbyć to je wyłącza. A notice'y mogą informować o potencjalnych dziurach - tak więc taką oto pokrętną drogą można powiedzieć że ten kod nie jest bezpieczny

1
pele221 napisał(a)

Czy w taki sposób zapisany if jest w pełni bezpieczny

Nie, nie jest, zagrożenie jest niewielkie, ale istnieje, wynika to ze słabego typowania PHP.

ŁF napisał(a)

a po co? przecież if nie wykonuje zawartości zmiennych

unikalna_nazwa napisał(a)

nie wiem skąd wziąłeś takie teorie - dopóki ten kod nie będzie w eval to wszystko jest ok
jedynie warto by tam było sprawdzić issetem czy $_POST['string'] jest w ogóle ustawione

No właśnie, w tym wypadku właśnie zmienne interpretuje! W PHP i Perlu operator == to porównanie słabe, numeryczne kiedy to tylko możliwe. Jeśli oba stringi składają się z samych cyfr to zostanie wykonana automatyczna konwersja, przy czym duże liczby są reprezentowane w formie floatów, co prowadzi do niedokładności:

<?php
$s1 = "12345678901234567890123456789012";
$s2 = "12345678901234567890123456789069";

if ($s1 == $s2) {
  echo('o, kurwa, niespodzianka!');
}
?>

Pierwsza zasada bezpiecznego programowania w PHP, używaj === wszędzie tam, gdzie nie oczekujesz konwersji (czyli w 99% przypadków).

2

Żeby Wam uzmysłowić problem, ten sam przykład z perspektywy SHA256, używanego w tym serwisie:

<?php
$s1 = "1234567890123456700000000000000000000000000000000000000000000000";
$s2 = "1234567890123456755555555555555555555555555555555555555555555555";
if ($s1 == $s2) {
  echo("o, kurwa, niespodzianka!\n");
}
?>
1
cicho durnie napisał(a)

Żeby Wam uzmysłowić problem, ten sam przykład z perspektywy SHA256, używanego w tym serwisie:

<?php
$s1 = "1234567890123456700000000000000000000000000000000000000000000000";
$s2 = "1234567890123456755555555555555555555555555555555555555555555555";
if ($s1 == $s2) {
  echo("o, kurwa, niespodzianka!\n");
}
?>

nom tylko że wystarczy tylko jedna litera w hashu żeby php przestał zamieniać typ na liczby a znajdź mi chociaż jeden hash w którym są same cyfry
więc ta luka taka bardzo naciągana ale faktycznie jest w 1 / 146'150'164 przypadków

poza tym jeszcze musiałałbyś znać pierwsze kilkanaście cyfr i znaleźć częściowy konflikt więc realność ataku już jest niemal całkiem zerowa
ale jest
+1

// żeby nie było - samemu oczywiście stosuję "===" gdzie się da

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