Bezpieczne logowanie

Status
Zamknięty.

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
oto część skryptu logowania który mam na swojej stronie:
Kod:
$login = $_POST['login'];
$haslo = $_POST['haslo'];

try
{
    $baza = baza_lacz();
    $wynik = zapytanie($baza, "select * from login where login='$login' and haslo='" . md5($haslo) . '\'');
        
    if(mysqli_num_rows($wynik) == 0)
        throw new Exception('Błędny login lub/i hasło.');
        
    $_SESSION['login'] = $login;
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
    wyswietl_przekierowanie('gra/podglad.php');
}
catch(Exception $e)
{
    echo $e -> getMessage();
    wyswietl_przekierowanie('logowanie.php');
}
czy jest on bezpieczny jeśli chodzi o błąd SQL injection?
oczywiście na serwerze włączone jest magic_quotes
EDIT:
oczywiście mogę też dać linka jak by ktoś chciał wypróbować jakiś błąd
 

Kopaczka92

Użytkownik
Dołączył
Luty 2, 2008
Posty
274
A propo chciałem się przyłączyć do tematu i spytać się jeszcze czy takie logowanie jest bezpieczne czy logowanie na sesjach. Które bezpieczniejsze?
 

adikx

Użytkownik
Dołączył
Maj 21, 2007
Posty
415
Ja np. swój cms na jednym hostingu musiałem przerobić na trzymanie id usera w cookies + sesja przypisana do usera w bazie.
I pytanie do nowy_me Czy masz zapisywane gdzieś dane sesji i loginu które się na nim zalogował.
Bo z tego co widzę to by można zrobić podmianę usera poprzez zatrucie sesji.
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
adikx zauważ że:
1) zapisuje nie tylko login ale również IP, i potem konsekwentnie sprawdzany jest i login i IP(oczywiście zawsze może się trafić ktoś z tym samym IP, np. jedna sieć i jedno zewnętrzne IP)
2) docelowo skrypt będzie stał na hostingu gdzie każdy ma własny wirtualny serwer wiec i tak session poisoning odpada bo każdy wirtualny serwer ma swoje numery sesji
ale dzięki za troskę
ponawiam pytanie:
czy skrytp jest on bezpieczny jeśli chodzi o błąd typu SQL injection?
 

widmo17

Były Moderator
Dołączył
Lipiec 16, 2007
Posty
1089
Po pierwsze: nie radzę sprawdzać IP, bo co jak ktoś będzie miał neostradkę? xP
A te "genialne" magic_quotes jest bardzo łatwe do obejścia
<
Polecam htmlspecialchars($_POST["login"],ENT_QUOTES) lub addslashes(strip_tags($_POST["login"]));

mogę też dać linka[/b]
To ja poproszę ^^

chciałem się przyłączyć do tematu i spytać się jeszcze czy takie logowanie jest bezpieczne czy logowanie na sesjach[/b]
Zależy od umiejętności programisty ;] Jak ktoś sobie zrobi logowanie master-super-pr0, a będzie miał sql, xss i wszystko inne, to choćby był nie wiem jak zaj*** i tak dostanie owna ;]
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
jak będzie miał neostradę to jeśli się połączy i rozłączy to będzie musiał się jeszcze raz zalogować, wiem że to może być uciążliwe
co do htmlspecialchars i strip_tags to nie ma sensu sprawdzać ich przy logowaniu bo tagi są wycinane przy rejestracji więc nawet jak ktoś w logowaniu poda tag HTML i tak takiego loginu nie ma w bazie
mówisz że łatwo można obejść magic_quotes, ale magic_quotes to dokładnie to samo co addslashes, tylko że przy włączonym magic_quotes funkcja addslashes jest dodawana automatycznie przez praser PHP więc to i tak będzie to samo, ale i tak napisz jak można to obejść
link
 

PHPechowiec

Użytkownik
Dołączył
Luty 27, 2008
Posty
11
wiem że temat troche stary ale...
nowy_me: a osoby używające tora? one mają zmienione ip co kilka minut jeśli nie sekund...
widmo17 ma racje zobacz:
Twoje zapytanie to
Kod:
"select * from login where login='$login' and haslo='" . md5($haslo) . '\''
zmienne login i haslo sa niefiltrowane. haslem za duzo nie namieszamy ale za to logi juz daje pole do popisu
jesli w $_POST['login'] przyjdzie ci cos takiego:
Kod:
login' AND '1'='2' OR DROP DATABASE `users`--
to zapytanie wyglada juz tak
Kod:
select * from login where login='login' AND '1'='2' OR DROP DATABASE `users`--' and haslo='" . md5($haslo) . '\''
o ile dobrze pamiętam to -- oznacza komentarz.
prędzej czy później ktoś moze odgadnąć nazwę twojej dany bazych, albo zmienic zapytanie na inne.
imho. lepszym rozwiązaniem byłyby wyrażenia regularne i funkcja mysql_real_escape_string(); przeczytaj o niej w manualu.
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
co do osób z torem to mają pecha zmienią IP i zostaną od razu wylogowani(przynajmniej dopóki nie postawie gry na wirtualnym serwie gdzie session hijacking będzie niemożliwe) a co do twojego pseudo SQL injection może to Ty poczytaj najpierw o magic_quotes

EDIT:
z resztą jak chcesz to kilka postów wyżej jest link, spróbuj się włamać
 

Gondoller

Użytkownik
Dołączył
Luty 21, 2008
Posty
259
Ty najpierw zrób tak, żeby to się ładowało w całości na neo 512 krócej niż 2 minuty. bo po tych 2 minutach ja zrezygnowałem, nie wiem jak inni.
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
to jest projekt nie komercyjny, więc wiadomo darmowy hosting, ale ja aż takich problemów z połączeniem nie miałem
 

Gondoller

Użytkownik
Dołączył
Luty 21, 2008
Posty
259
A ja chodze i narzekam na moje łącze bo to niby 512 jest a idzie jak modem... inna rzecz, że ludzie traz conajmniej na 1Mb/s jadą i optymalizowac się nie chce... :/ a jak pomyśle o japońskim światłowodzie 1Gb/s za (w przeliczeniu na nasze) 130zł/miech...
<
 

hxv

Były Moderator
Dołączył
Sierpień 9, 2006
Posty
797
Gondoller co tu jest do optymalizowania, stronka ma mniej niż 2KB a czas wykonywana skryptu nie jest zależny od łącza użytkownika...
Mi tam ładnie chodzi.
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
PHPechowiec z php6 wyrzucili żeby programista sam się tym zajął zabezpieczaniami bo istnieją serwery na których magic_guotes są wyłączone(i wtedy rzeczywiście są kredki), a co do tego rzekomego obejścia magic_quotes to proszę bardzo, udowodnij to!
link: rolnik
skrypt logowania:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'><?php
require_once('functions/functions.php');

display_header('Logowanie');

if(!$_POST)
display_form('Logowanie', 'login.php' , array('Login', 'Hasło', ''), array('text', 'password', 'submit'), array('login', 'password', ''), array('', '', 'Zaloguj'));
else
echo login($_POST['login'], $_POST['password']);

display_footer();

function login($login, $password)
{
if(empty($login) || empty($password))
return 'Podaj login i hasło.';

$password = md5($password);

$db = db_connect();
if(!$result = mysqli_query($db, 'select id from players where login="'.$login.'" and password="'.$password.'"'))
return 'Wykonanie zapytania numer 1 nie powiodło się.';

if(mysqli_num_rows($result) != 1)
return 'Błędny login lub/i hasło.';

$data = mysqli_fetch_assoc($result);

$_SESSION['id'] = $data['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['login'] = $login;

display_redirect('s1/overview.php');
}
?></div>
bo to że gdzieś ktoś na jakimś forum coś pisze nic nie pokazuje
 

wik11

Użytkownik
Dołączył
Luty 17, 2007
Posty
17
PHPechowiec ma rację.
Do ochrony zapytań służy funkcja mysql_real_escape_string(), a nie addslashes()!
addslashes() dodaje backslashe tylko przez ' i " (apostrofem i cudzysłowem), a to do ochrony zapytania nie wystarczy!
nowy_me, hxv: Proszę najpierw czytać manual i poczytać o SQL Injection, a dopiero potem pisać głupoty.
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
oczywiście że nie ma, ja to wiem nie z manuala tylko z praktyki, jak potrafisz to się włam link i skrypt są w poście wyżej, a slash przed ' i " wystarczy bo nie wyjdziesz z pola tekstowego w zapytaniu, a jak ci się nie uda to wypadało by mnie i hxv przeprosić bo nie piszemy głupot i przy tym nikogo nie obrażamy
 

hxv

Były Moderator
Dołączył
Sierpień 9, 2006
Posty
797
<div class='quotetop'>CYTAT(wik11 @ 11.10.2008, 14:30) <{POST_SNAPBACK}></div>
addslashes() dodaje backslashe tylko przez ' i " (apostrofem i cudzysłowem), a to do ochrony zapytania nie wystarczy![/b]
Prawie zgadłeś, addslashes dodaje \ przed: ', ", \ i NULL.
mysql_real_escape_string do tego zestawu dokłada: \r, \n i \x1a

Po prostu napisz jak to wykorzystać, ja też umiem podać link do forum/Wikipedii z którego nic nie wynika...
 

PHPechowiec

Użytkownik
Dołączył
Luty 27, 2008
Posty
11
Skoro mi nie wierzycie....
Wejdźcie sobie na IRC połączcie się z serwerem freenode.net (irc.freenode.net) dołączcie się do kanału ##php (/join ##php) i zapytajcie sie tej rzeszy programistów co myślą o magic_quotes_gpc...
Chyba wiecie co to IRC jak nie to odsyam do google.pl
 
Status
Zamknięty.
Do góry Bottom