akurczyk
10.09.2008, 12:37:39
Napisałem prosty system logowania.
Formularz logowania przesyła dane do tego pliku:
<?php
if(isset($_POST['zaloguj_sie']) && isset($_POST['login']) && !empty($_POST['login']) && isset($_POST['haslo']) && !empty($_POST['haslo'])) { $_SESSION['zalogowany'] = "tak";
$_SESSION['administrator'] = $wynik['administrator'];
$_SESSION['id'] = $wiersz['id'];
}
}
if(isset($_GET['przekierowanie']) && !empty($_GET['przekierowanie'])) { header("Locatio: ".$_GET['przekierowanie']); } else {
}
?>
Następnie następuje przekierowaniu (do pliku index.php):
<?php
if(isset($_SESSION['zalogowany']) && $_SESSION['zalogowany'] == "tak") { } else {
}
?>
Proszę o pomoc w zabezpieczeniu tego skryptu!!!
Exek
10.09.2008, 12:42:59
zamiast addslashes używaj mysql_escape_string
header("Locatio: index.php");
powinno być:
header("Location: index.php");
pyro
10.09.2008, 12:49:49
$_SESSION['administrator'] = $wynik['administrator'];
skad sie wziela tablica $wynik?
po header(); dawaj exit;
kazag
10.09.2008, 12:59:38
Pewnie zamiast $wynik, miało być $wiersz.
vokiel
10.09.2008, 12:59:43
Hasło w bazie przechowuj zhashowane (SHA1 albo MD5).
<?php
// wyzej masz $wiersz a na dole $wynik -> tak to nie zadziala :)
$_SESSION['zalogowany'] = "tak";
$_SESSION['administrator'] = $wynik['administrator'];
$_SESSION['id'] = $wiersz['id'];
?>
Zrób funkcję czyszczącą i przez nią filtruj wprowadzone przez usr dane
<?php
function cleanOneData($input){
$input = trim($input); // funkcja ta usuwa z napisu wiodące i końcowe białe znak: $input = str_replace("[ ]+", " ", $input); // zmiana wielokrotnych spacji na pojedyncze $input = ereg_replace("[\nr\t ]+", " ", $input); // zmiana bialych znaków na pojedyncze spacje }
return $input;
}// end of cleanOneData
?>
Poza tym jeśli w bazie będziesz trzymał hasło zhashowane nie musisz go filtrować bo i tak będziesz robił coś w stylu:
<?php
$wykonaj_zapytanie = mysql_query("SELECT * FROM uzytkownicy WHERE login='".cleanOneData
($_POST['login'])."' AND haslo='".sha1
($_POST['haslo'])."'"); ?>
akurczyk
10.09.2008, 13:35:22
a coś na wypadek edycji cookie?
pyro
10.09.2008, 13:35:50
jakiej edycji?
akurczyk
10.09.2008, 13:44:40
gdyby ktoś zmienił sobię $_SESSION['administrator'] z "" na "tak".
PS: COOKIE EDITOREM
Exek
10.09.2008, 13:45:21
sesja jest trzymana po stronie serwera, w cookie to masz tylko session id
pyro
10.09.2008, 13:47:16
Cytat(akurczyk @ 10.09.2008, 14:44:40 )

gdyby ktoś zmienił sobię $_SESSION['administrator'] z "" na "tak".
PS: COOKIE EDITOREM
zacznij odrozniac sesje od ciasteczek
akurczyk
10.09.2008, 13:57:36
myślałem że sesja to takie ciasteczko
pyro
10.09.2008, 14:04:03
sesja i ciasteczko to zupelnie odrebne rzeczy, jest jedynie wysylane jedno ciasteczko ktore jest identyfikatorem sesji
akurczyk
10.09.2008, 14:05:47
skoro hasła będą kodowane w md5 lub sha1 to jak je pużniej odkodować (Przypomnienie hasła)
a ja dam ci małą radę. Daj jedną zmienną sesji z ip używanym przy zalogowaniu. Pozwoli ci to na trochę bezpieczniejsze logowanie i brak możliwości przejęcia sesji jeśli 'żezimieszek' ma inne ip niż osoby zalogowanej
Exek
10.09.2008, 14:24:07
@MWL
Zły pomysł. Miałem kiedyś neta z kablówki i miałem zmieniane ip co parę minut.
@akurczyk
przypominanie hasła działa wtedy na zasadzie generowania nowego hasła. User podaje w formularzu swojego maila. Dla tego maila tworzysz authkey (klucz weryfikacyjny) który wysyłasz na podany mail ( i zapisujesz w bazie danych). Potem user wchodzi na linka z maila i ustala nowe hasło i kodujesz je od nowa.
akurczyk
10.09.2008, 14:46:55
a jak wygenerować ten authkey (i jak zrobić żeby był on usuwany po 24 godzinach)

?
Exek
10.09.2008, 14:54:27
zrób np md5(time().rand().'mail@uzytkownika.pl') i zapisuj do bazy danych.
Szczerze mówiąc, osobiście nie usuwam tych authkeyów z bazy danych, ale jak chcesz to dorób kolumnę w bazie danych z wpisem kiedy wygenerowano klucz, a potem np. za pomocą cron'a odpalaj skrypt.php ktory czysci baze danych ze starych authkeyow.
bllitz
10.09.2008, 15:08:40
Cytat(akurczyk @ 10.09.2008, 11:37:39 )

<?php
if(isset($_POST['zaloguj_sie']) && isset($_POST['login']) && !empty($_POST['login']) && isset($_POST['haslo']) && !empty($_POST['haslo'])) {
if(isset($_GET['przekierowanie']) && !empty($_GET['przekierowanie'])) {
?>
taki zapis jest zbędny jeśli stosujesz isset to nie ma potrzeby żeby używać też !empty, isset w zupełności wystarczy.
Exek
10.09.2008, 15:19:48
@blitz
isset sprawdza czy coś takiego zostało wysłane z formularza, nie oznacza to wcale że ma jakąś zawartość.
Sprawdzenie isset a potem !empty jest IMHO bardzo dobre.
SHiP
10.09.2008, 16:06:01
Cytat(Exek @ 10.09.2008, 14:19:48 )

@blitz
isset sprawdza czy coś takiego zostało wysłane z formularza, nie oznacza to wcale że ma jakąś zawartość.
Sprawdzenie isset a potem !empty jest IMHO bardzo dobre.
bllitz ma rację tyko chyba mu się kolejność pomieszała. !empty() zawiera w sobie isset() ;] wiec sprawdzanie najpierw isset() a potem !empty() jest zbędne. Po prostu od razu dajemy !empty()
<?php
if(isset($_POST['zaloguj_sie']) && !empty($_POST['login']) && !empty($_POST['haslo'])) {
if(!empty($_GET['przekierowanie'])) {
?>
akurczyk
10.09.2008, 16:23:41
i jeszcze jedno dawać addslashes czy to mysql_escape_string czy jakoś tak?
Exek
10.09.2008, 16:24:09
@SHiP
Ooo, masz rację, nie wiedziałem o tym, dzięki

@akurczyk
mysql_escape_string jest bezpieczniejsze bo czyści ze wszystkich 'złych' znaków. Tylko używaj tego jeśli masz wyłączone magic_quotes. Domyślnie w php5 jest wyłączone, ale administratorzy wszędzie to włączają, zresztą nie dziwię się im

.
Cytat(Exek @ 10.09.2008, 15:24:07 )

@MWL
Zły pomysł. Miałem kiedyś neta z kablówki i miałem zmieniane ip co parę minut.
Nie może zmieniać ci się ip podczas zmieniania strony tylko podczas kolejnego połączenia!!
Nie inaczej!
pyro
10.09.2008, 18:17:07
Cytat(MWL @ 10.09.2008, 19:08:18 )

Nie może zmieniać ci się ip podczas zmieniania strony tylko podczas kolejnego połączenia!!
Nie inaczej!
teoretycznie moze, ale jednoczescnie polaczenia (np. sciaganie) by sie przerwalo
Exek
10.09.2008, 18:26:45
@MWL
heh nie może? Dobrze wiedzieć, szkoda tylko że trafiłem na jedną stronę z zabezpieczeniem o którym mówisz i wywalało mnie. Potem sprawdziłem i czasami mi się nawet wydawało że co request miałem jedno ip z puli, tak na oko, 1 z 8 ip.
@pyro
nie rozumiem? ściąganie pliku to 1 request i 1 response? Tak mi się przynajmniej wydaje, więc głowy nie dam. W jaki sposób miałoby to przerwać proces ściągania? Mógłbyś napisać?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.