Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczeństwo skryptów PHP
Forum PHP.pl > Forum > PHP
Stron: 1, 2, 3, 4, 5, 6, 7
potreb
Poruszacie tutaj temat łączenia stron, a jak sie ma bezpieczeństwo co do wykonywania jakich zapytań lub wysyłania formularzy. Albo ochrona przed spam botami.

Jak pewnego razu boty zaatakowały moją stronę to, nie mogłem się od nich odpędzić. Tak więc dodałem tokena, ale i to nie pomogło w końcu pomyślałem że dodają skrypty przez jakiegoś exploita napisanego specjalnie dla mojej strony. No i w shoutboxie i katalogu stron zastosowałem funkcje eregi. Jeżeli w tekscie wystepuje słowo "url", lub "http" to wtedy odrzuca formularz. Myślę że to jest dobre rozwiązanie, bo wiele spambotów działa podobnie, zapełniają pola text podobnymi tekstami.
consto
Witam wszystkich ...

Temat bezpiecznego podpinania pików jest dość ciekawy i chyba rozwiązań jest tyle ile programistów.

Ja stosuję takie rozwiązanie i chyba całkiem dobre, które jednocześnie spełnia rolę maskowania adresu (dobre jeśli jakiś serwer nie obsługuje mod-rewrite).

adresy wyglądają tak:

http://domena.pl/index.php?podstronka,1,jakieś_dane,kolejne,...

oczywiście zamiast "," można dać dowolny inny znak




Kod

<?php



1.     $katalog=array(1=>"nazwa_katalogu_jeden", "następna_nazwa_katalogu", ........);
2.   if(eregi("^[a-zA-Z0-9,]+$",$_SERVER["QUERY_STRING"])) {            
3.     $adres = explode(',',$_SERVER["QUERY_STRING"]);          
4.       $plik_name         = $adres[0];                                          
5.       $katalog_name   =  $adres[1];                                        
6.       $adres_name     = $katalog_name.'/'.$plik_name.'.php';
7.  if ($plik_name<>''){                                                                  
8.  if (file_exists( $adres_name)){                                                
9.       require(" $adres_name'");}                                                
10.   else {require("strona_error.php");}                                            
11. }
12. else {require("strona_error.php");}
13. }
14. else {require("strona_głowna.php");}                                      

?>



Na początek sprawdzam czy w url-u (po znaku"?") nie ma "zakazanych" znaków ... url może zawierać tylko małe i duże litery alfabetu bez polskich znaków, liczby 0-9 oraz "," ... pozostałe znaki są uznawane jako próba "włamania" smile.gif
Kolejny etap to tworzenie z " ?podstronka,1, jakieś_dane ,kolejne,... " tablicy o nazwie $adres.
Przypisanie zmiennym $plik_name = $adres[0]; (nazwa pliku do podpięcia), $katalog_name = $adres[1]; (id katalogu z tablicy $katalog) i $adres_name (czyli gotowy adres do pliku). Teraz sprawdzam, czy zmienna z nazwą pliku zawiera jakieś dane(można to zrobić wcześniej ... rzecz gustu). W końcu sprawdzam, czy plik o takiej nazwie istnieje w danym katalogu. Jeśli tak to podpinam plik, a jeśli nie to podpinam podstronę z komunikatem błędu (z możliwością dopisania IP i nazwy przeglądarki usera do bazy i po np. 5 próbach wpisania błędnego adresu zablokowanie IP na określony czas)

Kolejne numery, czyli: $adres[2], $adres[3], ... , $adres[X], to poprostu zmienne, które już są przefiltrowane i można bezpiecznie użyć ich w skryptach bez stosowania metody $_GET['zmienna'].

Można jeszcze dodać sprawdzanie domeny, czy przypadkiem podstrona nie jest wywoływana z pod innego adresu niż adres naszego serwera.

Jeśli ktoś ma pomysły na ulepszenie mojej wersji to bardzo proszę ... może wspólnie uda się stworzyć coś naprawdę dobrego smile.gif
marcio
czytalem juz ten temat kilka razy i teraz przeczytalem na nowo na php nie znam sie dobze bo robie duzo bledow ale duzo ludzi pisze ze taki kod jest bezpieczny
  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include $file;
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>

lecz wedlug mnie nie jest on bezpieczny poniewaz
1)nie sprawdzamy czy sa to cufry w przypadku id artu czy user'a lub czy sa tylko litery
2)jesli na servie magic_quotes = off to jest null byte poinson i w zaleznosci co sie uzylo czy include czy fopen
3)tu jest LFI. RFI nie ma bo sprawdzamy czy dany plik isnieje na serverze lecz juz cos takiego
  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include basename($file);
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>

jest bezpieczne jesli plik ktory includujemy jest przynajmniej 2 katalogi wyzej dobrze mowie czy nie??Ja i tak jestem zwolennikiem uzuwania switch'a lub if'ow :D
gladiror
  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include $file;
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>


Pewnie, że to jest niebezpieczne. Wystarczy za zmienna id wstawić:
  1. <?php
  2. $_GET['id'] = 'http://niebezpiecznastrona.pl/niebezpieczny_skrypt';
  3. ?>


i już masz ciekawą sytuację winksmiley.jpg
bełdzio
@marcio check this http://www.beldzio.com/bezpieczenstwo-dost...do-plikow.freez
Brick
Chciałbym zwrócić uwagę na jedną rzecz związaną z zapisywaniem identyfikatora i praw dostępu użytkownika do sesji.
Często robi się tak, że po zalogowaniu użytkownika, dane takie jak jego ID oraz jego uprawnienia są zapisywane do sesji. Widziałem wiele razy takie rozwiązania.
Przykładowo:
Zalogowany user: "Kazek", ID=50, ma uprawnienia "administrator serwisu"

Wszystko jest dobrze, tylko gdy np. szef firmy dowie się że Kazek właśnie siedzi w domu przy komputerze i chce ukraść wszystkie dane to nic nie może z tym zrobić. Gdy zmieni mu uprawnienia, zablokuje lub usunie konto, to dopóki Kazek jest zalogowany może robić co chce.

Rozwiązanie jest oczywiście proste, tj zanim skrypty php cokolwiek zrobią, jakiś skrypt sprawdzający pobiera z bazy danych informacje o zalogowanym użytkowniku. Sprawdza czy taki user istnieje, czy nie ma zablokowanego konta oraz jaki ma poziom. W wypadku gdy coś się nie zgadza, blokuje dostęp do wszystkiego i kasuje sesje.

W tym wypadku jedyne co trzeba zapisać do sesji to ID usera bo reszta jest i tak pobierana z bazy.

Poprawcie mnie jeżeli się mylę.
Kocurro
Na tym polega odpowiednie zaprogramowanie autentykacji (uwierzytelniania) i autoryzacji.

Chociaż wiele osób o tym zapomina smile.gif

Do tego dobrze jest zawsze sesje mieć przechowywane w bazie danych - dzięki temu zawsze można wymusić akcję na zalogowanej osobie winksmiley.jpg

pozdr.
mike
Wrzucenie uprawnień do sesji ma na celu dwie rzeczy:
1. Możliwość wyświetlania opcji zależnych od uprawnień wymaga informacji o wszystkich uprawnieniach użytkownika;
2. Pobieranie drzewa uprawnień podczas każdego żądania byłoby bez sensu.

Jeśli chodzi natomiast o reakcję na zmianę uprawnień dla użytkownika, którego sesja właśnie trwa to nie ma żadnego problemu.
Kwestią jest to że przed każdą operację powinno sprawdzać się szczegółową funkcję, która właśnie jest używana.

Przykładowo: Jeśli komuś wyświetlił się przycisk usuń to nie znaczy, że coś się usunie po kliknięciu weń.
Kocurro
Rozwijając moją poprzednią wypowiedź:

Sesje trzymam w bazie, oprócz standardowych kolumn: SID, Dane, Czas ... mam kolumny: Uzytkownik_ID, Odswiez ...

Gdy użytkownik traci dostęp zmieniam Uzytkownik_ID na wartosc 0 ... a gdy tylko zmieniam uprawnienia to Odswiez przyjmuje wartosc true ... i przy następnym przejściu odświeżam wszystkie dane typu tego gdzie Odśwież jest na true winksmiley.jpg

Jak do tej pory nie miałem problemów z tym, że kogoś wyciąłem a on dalej grzebał mi smile.gif

pozdr.
Sedziwoj
Cytat(mike @ 26.02.2008, 12:33:51 ) *
2. Pobieranie drzewa uprawnień podczas każdego żądania byłoby bez sensu.


Dlatego przy każdym otworzeniu strony można by było sprawdzić datę ostatniej modyfikacji i porównać z sesją. Czas działania skryptu jest na tyle mały, że nie ma sensu przy wywoływaniu każdej czynności sprawdzać.
Oczywiście można też zrzucić na bazę logowanie, a wtedy przy zmianie danych automatycznie by się odnowiły dane o poziomie dostępu, tylko byśmy pobierali te już raz "sklejone" dane.

Mimo wszystko duża część stron nie wymaga takiego zabezpieczenia, bo jak z praw dostępu korzysta jedna osoba, to nie ma sensu sprawdzanie ich po zalogowaniu, nikt ich nie odbierze.
Jarod
Ja uprawnienia pobieram tylko podczas logowania, natomiast przed każdym wywołaniem akcji, kontroler (wykorzystuje do tego napisaną klasę ACL) sprawdza czy użytkownik może daną akcję wywołać. Automatycznie też sprawdzane jest, czy maksymalny czas nieaktywności nie został przekroczony (za to odpowiada handler sesji) - jeśli tak, user zostaje przekierowany na stronę logowania.


Pozdrawiam
MajareQ
Może wrócę do bezpieczeństwa bezpośredniego...
Oto kod zebezpieczający przed wieloma atakami...
nalezy go umieścić przed wszystkimi innymi skryptami...

  1. <?php
  2. {
  3. function gpc_value($value)
  4. {
  5. if (is_array($value))
  6. {
  7. $value = array_map('gpc_value', $value);
  8. }
  9. else
  10. {
  11. $value = addslashes($value);
  12. }
  13. return $value;
  14. }
  15.  
  16. if (!empty($_GET))
  17. {
  18. $_GET = gpc_value($_GET);
  19. }
  20.  
  21. if (!empty($_POST))
  22. {
  23. $_POST = gpc_value($_POST);
  24. }
  25.  
  26. if (!empty($_COOKIE))
  27. {
  28. $_COOKIE = gpc_value($_COOKIE);
  29. }
  30. }
  31. ?>
bełdzio
Cytat(MajareQ @ 20.03.2008, 11:31:19 ) *
Oto kod zebezpieczający przed wieloma atakami...

np jakimi?
MajareQ
Wszystkimi dotyczącymi formularzy, ciastek, SQL icjection etc.

a ten zabezpiecza przed Session Fixation i Session Hijacking

Kod
if (!isset($_SESSION['inicjuj']))
        {
                session_regenerate_id();
                $_SESSION['inicjuj'] = true;
                $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
        }
        
        
        if($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR'])
        {
                die('Proba przejecia sesji udaremniona!');      
        }
sobstel
@MajareQ, poczytaj trochę więcej o bezpieczeństwie, a potem dopiero nas uraczaj cudownymi uniwersalnymi skryptami zabezpieczającymi, ok?questionmark.gif

co do drugiego skryptu, wyobraź sobie sytuacje, w której jesteśmy w tej samej sieci lokalnej (na zewnątrz mamy to samo IP), rozpoczyam sesję i daję ci linka. zapobiegłeś session fixation? (nie mówiąc o tym, że ograniczyłeś dostęp ludziom, których ip może się zmieniać w czasie połączenia).
kszychu
Cytat(Jarod @ 20.03.2008, 16:16:24 ) *
W tym temacie wszystko zostało już powiedziane.

W kwestiach bezpieczeństwa taka sytuacja nie istnieje. Co jakiś czas pojawiają się nowe ataki i nowe metody zapobiegania im.
Cytat(Jarod @ 20.03.2008, 16:16:24 ) *
Mam propozycje dla moderatora aby usunął te kilka ostatnich postów aby nie robił się burdel w tym topicu.
pzdr

Mam propozycję dla osób z zacięciem moderatorskim; powstrzymajcie się od takich postów. Zamiast tego używajcie odpowiedniego przycisku, w celu zgłoszenia moderatorom jakiegoś nadużycia.
Adwersarzy proszę o jedynie wypowiedzi merytoryczne, bez osobistych "przytyczek".
Jarod
Cytat(kszychu @ 20.03.2008, 16:29:23 ) *
W kwestiach bezpieczeństwa taka sytuacja nie istnieje. Co jakiś czas pojawiają się nowe ataki i nowe metody zapobiegania im.

Zgadza się, ale kolega nie napisał nic co ni byłoby już poruszane na tym forum. Poza tym odbieram jego posta jako próbę wymuszenia oceny jego "rozwiązania", a w tym celu mógł napisać nowego posta z prośbą o ocenę a nie klepać w przyklejonym temacie. Teaty przyklejone powinny zawierać konkretne informacje a nie dyskusje ciągnące się na x-stron (chyba że są to ciekawe i przydatne informacje).

Cytat(kszychu @ 20.03.2008, 16:29:23 ) *
Mam propozycję dla osób z zacięciem moderatorskim; powstrzymajcie się od takich postów. Zamiast tego używajcie odpowiedniego przycisku, w celu zgłoszenia moderatorom jakiegoś nadużycia.

Oprócz tego użyłem przycisku "Raportuj", prosiłem o usunięcie kliku ostatnich postów - w tym także mojego.

pzdr
cool_solar
Cytat(Wave @ 21.05.2005, 11:06:00 ) *
strip_tags();
htmlspecialchars();


zaobserwowałem, że zastosowanie funkcji striptags powoduje nieprawidłowe działanie dla plików zawierających na przykład jakieś matematyczne wyliczenia i znaki mniejszości i większkości, wywalane są nie tylko znaczniki HTML ale również tekst; nie wiem tylko czy jest to błąd konkretnej wersji php czy też ogólnie złe działanie funkcji
Sedziwoj
@cool_solar
Raczej brak zrozumienia działania funkcji. Pomyśl poczytaj, a znajdziesz odpowiedź.
MajareQ
Cytat(sopel @ 20.03.2008, 14:33:59 ) *
@MajareQ, poczytaj trochę więcej o bezpieczeństwie, a potem dopiero nas uraczaj cudownymi uniwersalnymi skryptami zabezpieczającymi, ok?questionmark.gif

co do drugiego skryptu, wyobraź sobie sytuacje, w której jesteśmy w tej samej sieci lokalnej (na zewnątrz mamy to samo IP), rozpoczyam sesję i daję ci linka. zapobiegłeś session fixation? (nie mówiąc o tym, że ograniczyłeś dostęp ludziom, których ip może się zmieniać w czasie połączenia).


Czy ja powiedziałem, że to jest uniwersalny kod? Nie rozumiesz kodu co podałem?
---
Bardziej widzą problem w dynamicznych IP.

A tak BTW to zabezpieczeniem przed atakami GET jest m.in:

  1. <?php
  2. $id = $_GET['id'];
  3. if (is_numeric($id)) {
  4. // kod dalszy
  5. } else {
  6. echo'Nie kombinuj!';
  7. }
  8. ?>
Xniver
Znowu Ameryki nie odkryłeś tongue.gif. Poza tym lepiej już użyć is_int(po co przy ID float?), rzutowania(int) lub napisać jakąś klase do tego, np. w swoim frameworku mam tak:
  1. <?php
  2. $id = XF::getRequest()->getInteger('id', 0, Request::POST); // Klucz, wartosć domyślna, typ(POST, cookie, server)
  3. ?>
bełdzio
Cytat(MajareQ @ 20.03.2008, 13:55:00 ) *
Wszystkimi dotyczącymi formularzy, ciastek, SQL icjection etc.

nie wydaje mi się :-) a dlaczego nie zostało juz powiedziane pare stron wcześniej
MajareQ
ten kod zamienia znaki
Kod
'

i
Kod
"

na
Kod
\'

i
Kod
\"


Zatem zabezpiecza, bo blokuje np. zapytania SQL z GEt.
bełdzio
Cytat(MajareQ @ 22.03.2008, 16:27:33 ) *
ten kod zamienia znaki

Zatem zabezpiecza, bo blokuje np. zapytania SQL z GEt.

1. Twój światopogląd ogranicza się do mySQL, nie w każdym systemie db znak "\" jest znakiem ucieczki
2. skoro addslaashes broni przed SQLi to po co powstała funkcja mysql_real_escape_string ? dla fazy?
MajareQ
Czy ja napisałem ze to zabezpieczy przed wszystkim?

W PHP można to zrobić, poprzez wykonanie na każdym tekstowym parametrze wykorzystywanym do budowy zapytania wbudowanej funkcji addslashes(), która dodaje backslash przed znakami, takimi jak ', " czy \, dzięki czemu znaki te nie są traktowane jak znaki specjalne. Dostępne są również funkcje specyficzne dla poszczególnych silników, takie jak np. oferowana przez serwer MySQL mysql_real_escape_string().
To robi moja funkcja.
Sedziwoj
@MajareQ

Kombinujesz, a nic nowego nie piszesz. Po co zabezpieczać ciągi znaków i zamieniać " na \", gdy to ma trafić do pliku. Zabezpiecza się i kontroluje tak jak to tego wymaga.
Do budowy zapytań używa się specjalnych funkcji, bo jak MySQL ma \' to PgSQL czy MSSQL (jeśli dobrze pamiętam) ma '' (podwójny) a tamto \' rozwali kwerendę.
Do sprawdzania integer lepiej użyć takiego sprawdzenia, czy jest dany parametr, czy nie jest pusty, a potem ctype_digit() bo w ciągu nie może być nic oprócz cyfr. Bo jak rzutujemy to będzie nie to co chcemy, nie wykryjemy błędnego parametru, tylko wyświetlimy dla np. id = 0.

Ale to wszystko było, przeczytaj i dopisz jak czegoś będzie brakować, a nie powtarzaj to co już jest.
kiamil
Cytat(NuLL @ 5.06.2006, 02:40:06 ) *
Podziele sie z Wami moim pomyslem jak ja zalatwiam prawie wszystko roboty tego typu w swoich projektach.

Jest formularz
  1. <input type='text' name='a3ol5m3in5klnw_name'>

To takie smieszne w nazwie to losowy string - generowany md5 na bazie czasu. Zapisuje sie go w sesji. User wysyla i sie wyciaga z POST wszystkie pola porownujac z tym co jest w sesji zapisane - cos ala token doklejony do nazwy pola. I tyle biggrin.gif

Roboty wysylajace spam np. na blogi dzialaja na bazie znajomosci nazw pol formularza oraz adresow - bo tak dziala np. CURL - taki prosty patch rozwala wiekszosc na lopatki biggrin.gif Jesli nie ma sesji tzn ze ktos cos majstruje winksmiley.jpg


A jednak.. Nie jestem w 100% pewny ale wysylajac mozna ustawic nazwe tego pola na "a_name" i zmienna sesyjna tez na "a_name" - a wtedy już to zabezpieczenie nei działa..
Lejto
Znalazłem w sieci ciekawą stroną z materiałami video związanymi z atakami na strony internetowe

http://www.uw-team.org/index.php?id=videoarty

Na filmach między innymi:

Wstęp do ataków typu SQL Injection
Atak SQL Injection z użyciem Union Select
SQL Injection - union select + komentowanie kodu
SQL Injection - wykrywanie struktury bazy danych
Blind SQL Injection - odgadywanie haseł po znaku
Błędy w użyciu funkcji include()
Includowanie kodu PHP z innego serwera
Session Poisoning - zatruwanie sesji PHP
XSS - Cross Site Scripting
SQL Injection - dopisywanie danych do bazy
XSS - metody zaawansowane
PHP - Register Globals
PHP - baza userów w pliku TXT

i pare innych...
renderman
Witam wszystkich,

Po przeczytaniu całego tematu wzdłuż i w szerz mam wrażenie że już nic nie wiem. Wiele sposobów cała masa kodu który dla każdego kto to czyta chyba wprawia w zawrót głowy. Czy znalazło by się chociaż kilka osób które w prosty i nie zagmatwany, możliwie dobrze skomentowany sposób przedstawiłyby jak poprawnie stworzyc prosty i za razem "bezpieczny' szkielet strony i może umiescilyby to jako przypięty temat... tylko prosiłbym by wypowiedział się ktoś naprawde dobrze obeznany z tematem.

Zakładam schemat w którym za pomocą wywołania o postaci:

  1. http://moja_strona.pl/index.php?m2=grafika2d


powoduje wygenerowanie strony według: ( tak to obecnie działa na mojej stronie )

  1. <?php if(empty($_GET['m2']) or $_GET['m2']=="portfolio_menu_0"){include("portfolio_menu_0.php");}
  2. if($_GET['m2']=="grafika2d")   {include("portfolio_menu_1.php"); }
  3. if($_GET['m2']=="grafika3d")   {include("portfolio_menu_2.php"); }
  4. if($_GET['m2']=="cv")            {include("portfolio_menu_3.php"); }
  5. if($_GET['m2']=="blog")          {include("portfolio_menu_4.php"); }
  6. ?>


Może na bazie tego ktoś przedstawilby warianty zabezpieczenia ( + ) i ( - ) danego rozwiązania ? To dośc proste ale myśle ze wielu początkujacych z pewnoscią będzie szukac wlasnie tego.
bełdzio
jeśli chodzi o inkludowanie plików zerknij tu -> http://www.beldzio.com/bezpieczenstwo-dostepu-do-plikow
renderman
Szczerze mimo że widze jakies sensowne rozwiązania dla mnie jako poczatkujacego nawet implementacja tego w wlasnym kodzie jest trudna. Zapewne 100 podobnych do mnie osob przegladajac rozne rozwiaznia dojdzie do tego samego wniosku. Można odbic piłeczke i powiedziec... - ucz się dalej, ale z bezpieczeństwem nie ma żartów. Nie chcialbym osobiscie by jakis haker z mlekiem pod nosem rozwalił cała strone a nie daj boże serwer tylko dla tego że moj kod nie był do końca bezpieczny. To co zamieściłem w poprzednim poscie jest juz tak oklepanym tematem na wszystkich forach a mimo to nikt nie zebrał sie ( mowie tu o tych co znaja to na wylot i wiedzą co z tym zrobic ) by pokazac reszcie jak to powinno byc poprawnie krok po kroku.
gladiror
Ogólnie mówiąc niby zasada jest prosta: "To co podaje lub może w jakiś sposób zmodyfikować użytkownik trzeba przefiltrować"... Dochodzą do tego elementy jakości napisanego kodu (czytaj: dużo doświadczenia). Nie liczcie, że od razu będziecie super administratorami swoich serwisów, ale warto pamiętać o tej zasadzie, którą napisałem powyżej. Chodzi tutaj w szczeególności o tablice POST, GET, COOKIES, SESSION, REQUEST czy SERVER. Cookolwiek jest wyświetlane na stronie lub pakowane do jakiejś bazy i te informacje są podane lub mogą być w jakiś sposób podane przez użytkownika trzeba do przefiltrować.
renderman
Gdzies obiło mi się o uszy... lepiej iśc w frameworka niż tworzyc wszystko od podstaw. Zakładam jednak że nie chce frameworka dlatego że:

1: strone czesto da się zrobic duzo prosciej i nie konieczny jest do tego cały silnik jak joomla tylko po to by uzyc jednej funkcji.
2. cała masa komplikacji, zmian, aktualizacji.

Chcialbym znaleźc proste rozwiaznie dla prostej strony bez udziwnień, byle by bylo bezpiecznie przy pomocy np w.w. includów . Jak to będę w stanie ogarnac to wtedy mozna myslec o dalszej nauce i rozwijaniu takiej strony.. Wole zrobic mniej niż zrobic źle..
Może ktos zaproponuje inne lepsze rozwiazanie od mojego?
mlattari
Ja piszę przeważnie wszystko w edytorze nano :-) Ale jeżeli mam kilka tysięcy linijek to przechodzę na Notepada ++ :-)) Po zapisaniu w Notepadzie ++ takie duże pliki wyglądają później chaotycznie w nano czy pico :-)

Ale pozostając bardziej w temacie to mam pytanie dotyczące zmiennych $_SESSION. Czy użytkownik serwisu www może w jakiś prosty sposób dostać się do zawartości tych zmiennych a jeżeli tak to czy może je w jakiś sposób zmienić zakładając, że używamy np. standardowych ciasteczek.

np. jeżeli mamy $_SESSION[uprawnienia_admina]='NIE' to czy ktoś mógłby się do tego dostać i ustawić na 'TAK' questionmark.gif
erix
Jeśli masz babola w skrypcie, to tak.

Można również edytować plik sesji, jeśli serwer jest "zabezpieczony" (dane sesji, to domyślnie zserializowana tablica zapisywana w pliku znajdującym się we współdzielonym folderze).
bełdzio
Cytat(mlattari @ 1.03.2009, 17:24:14 ) *
Czy użytkownik serwisu www może w jakiś prosty sposób dostać się do zawartości tych zmiennych

http://www.beldzio.com/bezpieczenstwo-mechanizmu-sesji
mlattari
Witam!

Pisałem już w innym wątku o mojej "metodzie" zabezpieczenia się przed eksperymentami polegającymi na wpisywaniu przez userów wartości lub znaków do paska url na danej stronie serwisu www. Moja metoda okazała się nieskuteczna i beznadziejna... :-( Może dobra na szarych, nieznających się na hakowaniu eksperymentatorów... :-)
Czy jest jakiś sposób (skuteczny) na to, żeby jak np. jesteśmy na stronce http://www.xxxx.pl/index.php?test=1&test2=2, to żeby nie można było RĘCZNIE WPISYWAĆ żadnych zmiennych do paska url. Nie chodzi mi o to, żeby sprawdzać pojedyńczo wpisane przez użytkownika wartości, tylko o to, żeby a priori była taka możliwość wykluczona :-)
dr_bonzo
Cytat
Czy jest jakiś sposób (skuteczny) na to, żeby jak np. jesteśmy na stronce http://www.xxxx.pl/index.php?test=1&test2=2, to żeby nie można było RĘCZNIE WPISYWAĆ żadnych zmiennych do paska url. Nie chodzi mi o to, żeby sprawdzać pojedyńczo wpisane przez użytkownika wartości, tylko o to, żeby a priori była taka możliwość wykluczona :-)


Usun stronke z serwera, wylacz serwer dzieki czemu skutecznie zabezpieczysz sie przed danymi przesylanymi przez usera.

Zawsze tez mozesz powiedziec userom zeby nie wchodzili na twoja stronke, pokasowali przegladarki - przez co nie beda mogli modyfikowac tego URLa.


Po prostu: twoj pomysl jest idiotyczny, i twoim zadaniem jest zabezpieczyc skrypt tak zeby nie poniszczyl sie, danych, dla dowolnych zmiennych wpisanych przez usera w URL.
mlattari
hmmm a dlaczego pomysł jest idiotyczny? Może coś niejasno się wyraziłem :-) Po kiego ma ktoś mi wpisywać jakieś zmienne ręcznie w pasku jak wejdzie na serwis? Czy np. na tym forum też trzeba to robić? Po co? Wiadomo co ma to na celu :-) Swoją drogą skrypt też musi mieć zabezpieczenia ale chciałem w ten sposób osiągnąć dodatkowy poziom zabezpieczenia właśnie przed idiotami i eksperymentatorami :-) Można czy nie?
nospor
a niby w jaki sposob chcesz zablokowac uzytkownikowi jego pasek w przegladarce? jak ci sie uda to zablokuj mu jeszcze mozliwosc wyłączenia komputera winksmiley.jpg

A juz na powaznie: nie, nie mozna. Nawet jakby mozna bylo, to pamietaj ze do twojej stronki mozna wejść nie tylko z przegladarki...
erix
Cytat
Swoją drogą skrypt też musi mieć zabezpieczenia ale chciałem w ten sposób osiągnąć dodatkowy poziom zabezpieczenia właśnie przed idiotami i eksperymentatorami :-)

Po to stosuje się sprawdzanie danych od użytkownika, aby ten poziom osiągnąć.

Sprawdzaj lepiej dane z formularzy, zmień miejsce przechowywania sesji, a nie tracisz czas na pierdoły. tongue.gif
mlattari
chyba się nie rozumiemy.... nie mam zamiaru nikomu blokować paska url tylko chciałbym osiągną coś ala
if(!$_SERVER['HTTP_REFERER']) die() ale czego nie można w prosty sposób przeskoczyć....

chodzi o to żeby użytkownik ręcznie nie podmieniał mi zmiennych przekazywanych przez $_GET

zapewniam was, że sprawdzam i filtruje wszystko co użytkownik wpisze ale chciałbym to mieć dodatkowo
erix
Cytat
chodzi o to żeby użytkownik ręcznie nie podmieniał mi zmiennych przekazywanych przez $_GET

Tak nie zrobisz. Nie da się, rozumiesz?

Jedyne wyjście - skoro już tak bardzo jesteś przewrażliwiony - to koduj adresy do postaci:
Kod
skrypt.php?OIUYDF987234987HIDFGH4J6H2J5H456H435H

i zapisuj tabelę linków odpowiadających tokenowi w sesji.
mlattari
hehe no i o takie rozwiązanie mi chodziło i chyba coś takiego zastosuje :-)
bełdzio
Cytat(mlattari @ 2.03.2009, 19:17:40 ) *
chyba się nie rozumiemy.... nie mam zamiaru nikomu blokować paska url tylko chciałbym osiągną coś ala
if(!$_SERVER['HTTP_REFERER']) die() ale czego nie można w prosty sposób przeskoczyć....

chodzi o to żeby użytkownik ręcznie nie podmieniał mi zmiennych przekazywanych przez $_GET

zapewniam was, że sprawdzam i filtruje wszystko co użytkownik wpisze ale chciałbym to mieć dodatkowo

spr referera nic Ci nie da

1. mozna go latwo zmanipulowac
2. niektore firewalle usuwaja referera z naglowkow
3. wchodzac na Twoja strone poprzez bezposrednie wpisanie jej adresu w pasku przegladarki skutkuje tym ze referer bedzie pusty tak wiec dostep do Twojej strony zostanie zablokowany
rzymek01
Cytat(mlattari @ 2.03.2009, 19:23:12 ) *
hehe no i o takie rozwiązanie mi chodziło i chyba coś takiego zastosuje :-)


a nie uważasz, że to tylko dodatkowe obciążanie bazy danych ?

jak już przefiltrowałeś to cię buja co jest w get, post, session, czy cookie (:-smile.gif
erix
Cytat
że to tylko dodatkowe obciążanie bazy danych ?

W sesji? tongue.gif na 90% ma w plikach, a w większości przypadków i tak w sesjach trzymane są tylko podstawowe informacje typu czas, SID, itp.

Poza tym, podobne rozwiązanie widziałem w panelu pewnego hostingu.
mlattari
Cytat(bełdzio @ 2.03.2009, 19:36:19 ) *
spr referera nic Ci nie da

1. mozna go latwo zmanipulowac
2. niektore firewalle usuwaja referera z naglowkow
3. wchodzac na Twoja strone poprzez bezposrednie wpisanie jej adresu w pasku przegladarki skutkuje tym ze referer bedzie pusty tak wiec dostep do Twojej strony zostanie zablokowany


To chodzi o to, że mam pewne funkcje oparte na refererach i sprawdzające skąd ktoś gdzieś ląduje, i jak ktoś wejdzie na stronkę index.php, gdzie oczywiście nie ma kontroli referera bo to juz byłby absurd, to jak np. z tamtąd ląduje na stronce kasujcostam.php, to sprawdzam, czy ten ktoś tam wylądował z odpowiedniej podstrony a nie przez kombinacje, no i wywala go także jak coś próbuje zmienić w zmiennych z $_GET.
bełdzio
kombinujesz smile.gif jak chcesz sie zabezpieczyc przed wywolywaniem url kasujacych dane z niewiadomego miejsca to poczytaj o CSRF np na http://www.beldzio.com/bezpieczenstwo-mechanizmu-sesji i generalnie o tokenach, doklejasz sobie do url kasujacego losowe znaki przez co otrzymujesz np usun_podstrone.php?id=4&token=fsd65fsd753, a następnie w usun_podstrone spr czy token z url == token z sesji smile.gif oczywiscie token jest zmieniany co odswiezenie skryptu
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.