$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?
$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?
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ść).
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ć isset
em 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
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ćisset
em 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).
Ż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");
}
?>
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