Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] czy to bezpieczne odrazu podać w $_SESSION['user']
Forum PHP.pl > Forum > Przedszkole
hiszpanespaniol
zalogować może się tylko jeden użytkownik i tylko z jednym hasłem. bez możliwości zmiany tych parametrów (ja je ustawiam raz na zawsze). Nie chcę więc tworzyć osobnego pliku z tymi parametrami (szyfrowanymi lub nie).

Pytanie brzmi, czy bezpiecznie jest zrobić taki skrypt?

  1. <?php
  2. if (isset($_SESSION['kim_jestem']) && $_SESSION['kim_jestem'] == jasio) {
  3. echo "
  4.  zalogowany jako " .$_SESSION['kim_jestem']. "<br> <a href=\"wyloguj.php\">wyloguj</a>
  5. ";
  6. }
  7. else
  8. {
  9. header("Location:logowanie.php");
  10. }
  11. ?>
Crozin
Trochę bezpieczniej było by porównywać hashe:
  1. <?
  2. if(md5($_SESSION['kim_jestem']) == '4ea19358f71379f9bd8fe8e1708812fc') //4ea19358f71379f9bd8fe8e1708812fc = md5('jasio')
  3. ?>
hiszpanespaniol
wiem, że "trochę". bo skoro ktoś już się pomęczy i JAKIMŚ CUDEM dostanie ten mój kod PHP w swoje ręce, to bez problemu odkoduje sobie zakodowany nick za pomocą jakiegoś dekodera online albo własnego. Skoro więc to możliwe (zakładając że jakoś dostanie mój PHP), to po co mam sobie utrudniać sprawę jeśli itak nie zwiększa to bezpieczeństwa.

Pytanie z tematu nadal więc pozostaje
Crozin
Bo jeżeli hasło jest bezpieczne (czyt.: długie, zawiera litery (duże i małe), cyfry, znaki) to "złamanie" go brute-forcem może potrwać na tyle długo, że potencialny "włamywacz" zrezygnuje. Ale z drugiej strony - mając dostęp do pliku, będzie mieć prawdopodobnie dostęp do zapisu i sobie poprostu zmieni to hasło winksmiley.jpg
hiszpanespaniol
nadal nie wiem, czy takie rozwiązanie (to z tematu) jest bezpieczne. już nie chodzi mi o to co jest bezpieczniejsze, ale jedynie o to czy to konkretnie jest bezpieczne. Taka sytuacja, ze ktoś dostanie kod php jest dosyć skrajna i właściwie łamie wszelkie możliwości zabezpieczania. Drugą możliwością jaką dla siebie widzę, jest umieszczenie hasła i loginu w osobnym skrypcie o poziom wyżej niż public_html. ale właśnie takiego umieszczania chciałem uniknąć.
.radex
nazwę usera możesz podać bez haszowania, ale pod warunkiem, że masz zahaszowane inne dane w sesji, które udowodnią własność konta.
hiszpanespaniol
z tej rozmowy wnioskuję:

to rozwiązanie JEST bezpieczne, ale z szyfrowaniem (np algorytmem MD5).

Dziękuję i pozdrawiam, problem rozwiązany...
.radex
MD5 nie szyfruje, tylko haszuje.

MD5 nie można odszyfrować.
hiszpanespaniol
no to świetnie smile.gif czyli właściwie mając nawet ten ciąg:

  1. <?php
  2. 4ea19358f71379f9bd8fe8e1708812fc
  3. ?>


który jest zahaszowanym hasłem, ewentualnemu cracker'owi nie uda się szybko odgadnąć że to "jasio". w skrypcie "zalogowaność" sprawdzam więc tak:

  1. <?php
  2. if (isset($_SESSION['kim_jestem']) && md5($_SESSION['kim_jestem']) == '4ea19358f71379f9bd8fe8e1708812fc')
  3. {
  4. echo "<b>Witaj: </b>".$_SESSION['user'];
  5. }
  6. ?>


Niema w moim przypadku potrzeby zapisu danych gdziekolwiek oprócz wnętrza skryptu, a nawet tam "jasio" (czyli hasło) jest haszowany. Jak widać w kodzie powyżej "kim_jestem" nie jest loginem. Jest hasłem. Zrobiłem tak dlatego, ze login wyskakiwał w formularzu logowania po kliknięciu w puste pole (podpowiedź przeglądarki), z hasłem się tak nie dzieje. Teraz już jest bezpiecznie (md5 hasła służy do weryfikacji bycia zalogowanym).
Poprawcie mnie jeśli popełniam jakiś ideologiczny błąd typu "nigdy nie weryfikuj za pomocą hasła"
pyro
Cytat(hiszpanespaniol @ 22.05.2008, 23:58:02 ) *
zalogować może się tylko jeden użytkownik i tylko z jednym hasłem. bez możliwości zmiany tych parametrów (ja je ustawiam raz na zawsze). Nie chcę więc tworzyć osobnego pliku z tymi parametrami (szyfrowanymi lub nie).

Pytanie brzmi, czy bezpiecznie jest zrobić taki skrypt?

  1. <?php
  2. if (isset($_SESSION['kim_jestem']) && $_SESSION['kim_jestem'] == jasio) {
  3. echo &#092;"
  4.  zalogowany jako &#092;" .$_SESSION['kim_jestem']. \"
  5.  <a href=&#092;"wyloguj.php\">wyloguj
  6. &#092;";
  7. }
  8. else
  9. {
  10. header(&#092;"Location:logowanie.php\");
  11. }
  12. ?>



zrobiles male bledy...
</a href=\"wyloguj.php\">
  1. <?php
  2. if (
  3. // {to nie jest potrzebne} isset($_SESSION['kim_jestem']) && 
  4. $_SESSION['kim_jestem'] == 'jasio') { // nie dales cudzyslowow do jasio
  5. // a co z haslem?
  6. echo "
  7.  zalogowany jako " .htmlspecialchars($_SESSION['kim_jestem']). " // dodalem htmlspecialchars, z pwoodu mozliwosci ataku XSS
  8.  wyloguj
  9. ";
  10. }
  11. else
  12. {
  13. header("Location:logowanie.php");
  14. }
  15. ?>
  16. // uzywanie md5 nie jest tu potrzebne, to jest bezpieczne

<a href=\"wyloguj.php\">
</a href=\"wyloguj.php\">
.radex
jest ok. Ja generalnie robię to podobnie:

jedna sesja z nazwą usera
i druga sesja ze specjalnie spreparowanym tekstem, który udowadnia tożsamość. Tym tekstem może być właśnie hasło.
hiszpanespaniol
to ja może podam całość jaką teraz mam, żeby nie było wątpliwości czemu sprawdzam tylko jedną wartość:

to jest formularz logowania HTML (plik index.php):

  1. <?php
  2. if (isset($_SESSION['kim_jestem']) && md5($_SESSION['kim_jestem']) == '4ea19358f71379f9bd8fe8e1708812fc')
  3. {
  4. echo "<b>Witaj człowieku: </b><br>\n<a href=\"logout.php\">Wyloguj się</a><br>\n<a href=\"zalogowany.php\">Twoja strona</a>";
  5. }
  6. else{
  7. echo "
  8. <form method=\"POST\" action=\"sprawdz.php\">
  9. <table>
  10. <tr><th align=\"right\">Login:</th><td align=\"left\"><input type=\"text\" name=\"login\"></td></tr>
  11. <tr><th align=\"right\">Hasło:</th><td align=\"left\"><input type=\"password\" name=\"haslo\"></td></tr>
  12. <tr><td align=\"center\" colspan=\"2\"><input type=\"submit\" value=\"loguj\" name=\"logowanie\"></td></tr>
  13. </table>
  14. </form>
  15. ";
  16. }
  17. ?>


Taki skrypt sprawdza formularz logowania (jest to plik sprawdz.php)

  1. <?php
  2. if($_POST['logowanie']){
  3. $pobrany_login = htmlspecialchars($_POST['login']);
  4. $pobrane_haslo = htmlspecialchars($_POST['haslo']);
  5. if($pobrany_login == 'jasio' && md5($pobrane_haslo) == '4ea19358f71379f9bd8fe8e1708812fc'){
  6. $_SESSION['kim_jestem'] = md5($pobrane_haslo);
  7. header("Location:zalogowany.php");
  8. }
  9. else{
  10. header("Location:index.php");
  11. }
  12. }
  13. else{
  14. header("Location:index.php");
  15. }
  16. ?>


a tak wygląda dowolna strona dostępna tylko po zalogowaniu (startowa to zalogowany.php):

  1. <?php
  2. if (isset($_SESSION['kim_jestem']) && md5($_SESSION['kim_jestem']) == '4ea19358f71379f9bd8fe8e1708812fc') {
  3. echo "
  4. jesteś zalogowany. Tutaj możesz sobie zmieniać swoje wpisy<br> <a href=\"logout.php\">wyloguj</a>
  5. ";
  6. }
  7. else
  8. {
  9. header("Location:index.php");
  10. }
  11. ?>


ostatni plik który wyloguje użytkownika (logout.php):

  1. <?php
  2. if (isset($_SESSION['kim_jestem']))
  3. {
  4. echo "zostałeś wylogowany<br>";
  5. echo "<a href=\"index.php\">Strona Główna</a>";
  6. }
  7. else{
  8. header("Location:index.php");
  9. }
  10. ?>


"a co z hasłem?"
jak widać w pliku zalogowany.php sprawdzam tylko jedną wartośc. a to dlatego, że jest ona tworzona w pliku sprawdz.php jedynie kiedy zgadza się i login i hasło (narazie są jednakowe).
co do tego, że niepotrzenie sprawdzam, czy $_SESSION['kim_jestem'] w ogóle jest zdefiniowana, to czytałem gdzies, ze PHP inaczej zareaguje w przypadku jedynie sprawdzania wartości, a inaczej w przypadku sprawdzania i istnienia i wartości. Nie pamiętam tego, ale coś mi się kojarzy z jakimś E_NOTICE.

teraz już widac całość tej strony mojej. Nigdzie niema hasła odkrytego.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.