Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

16 Stron V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Bezpieczeństwo skryptów PHP, Jak zabezpieczyć się przed włamaniem
dr_bonzo
post 8.07.2005, 14:41:45
Post #21





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


A wystarczy dodac
$tablica = array();
przed jej uzyciem i po klopocie.
A poza tym to bylo tylko
Cytat
to zrób sobie tablicę w skrypcie, coś w stylu
, pisane szybko i bez doglebnego zastanowienia biggrin.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Lars
post 24.07.2005, 13:10:05
Post #22





Grupa: Zarejestrowani
Postów: 279
Pomógł: 15
Dołączył: 29.04.2005
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


Jeżeli już trzeba zrobić coś takiego:

  1. <?include $_GET['id'].'.php';?>


to zawsze lepiej:

  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include $file;
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>


Jest jeszcze coś takiego (działą tylko z rg=on).

Mamy kod:
  1. <?php
  2. <form action='ksiega.php' method='post'>
  3. <input type='text' name='nick' value='twoj nick'>
  4. <textarea name='tekst'>Twoj tekst</textarea>
  5. <input type='submit' value='Wyslij'>
  6. </form>
  7. ?>


i plik ksiega.php:

  1. <?php
  2. $file=fopen('data.txt', a);
  3. $zawartosc='<b>'.$nick.'</b><br>'.$tekst.'<br><br>';
  4. fwrite($file, $zawartosc);
  5. fclose($file);
  6. echo 'OK. <a href=\"javascript:history.back()\">Wróć</a>';
  7. ?>


jest tu bardzo wiele luk, m. in:
  • 1. Możliwość wstawienia dowolnej długości nicka/tekstu
  • 2. Umieszczanie kodu !!html!!
  • 3. wpis danych przez ?nick=nick&tekst=txt
  • 4. możliwość uszkodzenia pliku data.txt przez wpisywanie sie przez 2 osoby w tym samym momencie
  • 5. użycie kodu php
jak je usunąć??

1. Użycie strlen" title="Zobacz w manualu PHP" target="_manual:
  1. <?php
  2. $file=fopen('data.txt', a);
  3. $nick=stripslashes($nick);
  4. $tekst=stripslashes($tekst);
  5. if(strlen($nick>10)) {
  6. die('Za długi nick');
  7. } elseif(strlen($tekst>100)) {
  8. die('Za długi tekst');
  9. }
  10. $zawartosc='<b>'.$nick.'</b><br>'.$tekst.'<br><br>';
  11. fwrite($file, $zawartosc);
  12. fclose($file);
  13. echo 'OK. <a href=\"javascript:history.back()\">Wróć</a>';
  14. ?>


2. Użycie strip_tags" title="Zobacz w manualu PHP" target="_manual:
  1. <?php
  2. $file=fopen('data.txt', a);
  3. $nick=stripslashes($nick);
  4. $tekst=stripslashes($tekst);
  5.  
  6. $nick=strip_tags($nick);
  7. $tekst=strip_tags($tekst);
  8.  
  9. if(strlen($nick>10)) {
  10. die('Za długi nick');
  11. } elseif(strlen($tekst>100)) {
  12. die('Za długi tekst');
  13. }
  14. $zawartosc='<b>'.$nick.'</b><br>'.$tekst.'<br><br>';
  15. fwrite($file, $zawartosc);
  16. fclose($file);
  17. echo 'OK. <a href=\"javascript:history.back()\">Wróć</a>';
  18. ?>


3. Zamiast $tekst/$nick używamy $_GET['tekst']/$_GET['nick']:
  1. <?php
  2. $file=fopen('data.txt', a);
  3. $_GET['nick']=stripslashes($_GET['nick']);
  4. $_GET['tekst']=stripslashes($_GET['tekst']);
  5. $_GET['nick']=strip_tags($_GET['nick']);
  6. $_GET['tekst']=strip_tags($_GET['tekst']);
  7.  
  8. if(strlen($_GET['nick']>10)) {
  9. die('Za długi nick');
  10. } elseif(strlen($_GET['tekst']>100)) {
  11. die('Za długi tekst');
  12. }
  13. $zawartosc='<b>'.$_GET['nick'].'</b><br>'.$_GET['tekst'].'<br><br>';
  14. fwrite($file, $zawartosc);
  15. fclose($file);
  16. echo 'OK. <a href=\"javascript:history.back()\">Wróć</a>';
  17. ?>


4. Użycie flock" title="Zobacz w manualu PHP" target="_manual:
  1. <?php
  2. $file=fopen('data.txt', a);
  3. $_GET['nick']=stripslashes($_GET['nick']);
  4. $_GET['tekst']=stripslashes($_GET['tekst']);
  5. flock($file, 2);
  6. $_GET['nick']=strip_tags($_GET['nick']);
  7. $_GET['tekst']=strip_tags($_GET['tekst']);
  8.  
  9. if(strlen($_GET['nick']>10)) {
  10. die('Za długi nick');
  11. } elseif(strlen($_GET['tekst']>100)) {
  12. die('Za długi tekst');
  13. }
  14. $zawartosc='<b>'.$_GET['nick'].'</b><br>'.$_GET['tekst'].'<br><br>';
  15. fwrite($file, $zawartosc);
  16. flock($file, 3);
  17. fclose($file);
  18. echo 'OK. <a href=\"javascript:history.back()\">Wróć</a>';
  19. ?>


5. To to samo co w punkcie 2 tongue.gif.
Powód edycji: Porządki // Piniek


--------------------
(\.../) This is Bunny. Copy and paste bunny into
(O.o) your signature to help him gain world domination.
(> <) Zanim zapytasz | Też się przyda | Pomogłem ci? Kliknij "Pomógł"
Go to the top of the page
+Quote Post
Vaticinator
post 16.09.2005, 11:21:56
Post #23





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 10.02.2003
Skąd: Magor

Ostrzeżenie: (0%)
-----


A jest jakaś możliwość, żeby wybrane pliki dało się otwierać tylko poprzez include(), a nie bezpośrednio z przeglądarki?


--------------------
"What are we going to do tonight, Brain?"
"Same thing we do every night, Pinky... Try to take over the world!"
Go to the top of the page
+Quote Post
sobstel
post 16.09.2005, 11:40:41
Post #24





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(Vaticinator @ 2005-09-16 11:21:56)
A jest jakaś możliwość, żeby wybrane pliki dało się otwierać tylko poprzez include(), a nie bezpośrednio z przeglądarki?

jest, na szybko przychodzą mi do glowy 2 sposoby :

1. umiescic pliki w jakims katalogu i zabezpieczyc plikiem .htaccess z odpowiednim wpisem (deny from all)
2. umiescic pliki powyzej public_html


--------------------
"If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org
Go to the top of the page
+Quote Post
bregovic
post 28.09.2005, 15:18:54
Post #25





Grupa: Zarejestrowani
Postów: 562
Pomógł: 15
Dołączył: 8.08.2003
Skąd: Denmark/Odense

Ostrzeżenie: (0%)
-----


Cytat(Vaticinator @ 2005-09-16 11:21:56)
A jest jakaś możliwość, żeby wybrane pliki dało się otwierać tylko poprzez include(), a nie bezpośrednio z przeglądarki?

Plik includeujący:
  1. <?php
  2.  
  3. define('x', true);
  4. include 'lol.php';
  5.  
  6. ?>


Plik lol.php:
  1. <?php
  2.  
  3. if(!x) die();
  4. //reszta pliku
  5.  
  6. ?>


--------------------
Prank - for the fun. Mac - for the simplicity. Deviantart - for the kick.
Life is ours, We live it our way -- Metallica
Go to the top of the page
+Quote Post
mike
post 21.11.2005, 00:18:04
Post #26





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----



W związku z ostatnim postem tutaj, który poruszał problem już omówiony postanowiłem trochę oczyścić ten wątek.

Kilka postów zostało usuniętych - zostały te które powinny zostać tongue.gif

Od tej chwili, proszę użytkowników zwłaszcza początkujących o czytanie tego wątku od początku a nie tylko dopisywanie się na końcu bez czytania całości tego wątku.

Czasem (a raczej często) rozwiązanie problemu jaki macie już padło. Warto poświęcić czas na odszukanie rozwiązania.

P.S.
To nie jest kącik lamerskich pytańexclamation.gif!
Go to the top of the page
+Quote Post
huntercs
post 1.03.2006, 10:50:25
Post #27





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 6.02.2005

Ostrzeżenie: (0%)
-----


Ja stosuję w sumie proste rozwiązanie, dodaje tylko strony do których użytkownik może wejść i tyle, jeżeli chce wejść na inną to jest przekierowany na str. główną
  1. <?php
  2. $Section=$_GET['Section'];
  3.  
  4. if($Section!='Main' &&
  5. $Section!='Activate' &&
  6. $Section!='Kolejna_strona' &&
  7. $Section!='Inna_strona' &&
  8. $Section!='Regulamin')
  9. header("Location: ?Section=Main");
  10. else include_once($Section.".php");
  11. ?>


--------------------


Go to the top of the page
+Quote Post
nospor
post 1.03.2006, 10:56:44
Post #28





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No ale poco trzeba pisac nazwe skryptu? Skoro i tak juz to oifowales, to daj identyfikator a nie nazwe. Po co ktoś ma wiedziec jakie masz skrypty?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mike
post 1.03.2006, 10:57:57
Post #29





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


~huntercs możesz to zrobić bardziej elastycznie i elegancko:
  1. <?php
  2.  
  3. $_GET[ 'Section' ] = ( empty( $_GET[ 'Section' ] ) ) ? 'Main' : '';
  4.  
  5. $arrAllowSection = array(
  6. 'Main' => 'Main.php',
  7. 'Activate' => 'Activate.php',
  8. 'Inna_strona' => 'Inna_strona.php',
  9. 'Regulamin'  => 'Regulamin.php'
  10. );
  11.  
  12. if( in_array( $_GET[ 'Section' ], $arrAllowSection ) )
  13. {
  14. include_once( $arrAllowSection[ $_GET[ 'Section' ] ] );
  15. }
  16. else
  17. {
  18. include_once( $arrAllowSection[ 'Main' ] );
  19. }
  20.  
  21. ?>


Masz teraz możliwość prostego i łatwego dodawanie stron i nie musisz ich adresów uzależniać od wartości $_GET[ 'Section' ]. Bo możesz dawać inne nazwy plików.
Go to the top of the page
+Quote Post
vedeney
post 1.03.2006, 18:17:47
Post #30





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 28.02.2006
Skąd: 127.0.0.1 :) => Ukraine

Ostrzeżenie: (0%)
-----


I like php-coding in this way smile.gif
  1. <?php
  2. include_once(((isset($_GET[ 'Section' ]) && !empty($_GET[ 'Section' ])) && is_file(str_replace(array(".","/"),"",$_GET['Section']).".php"))?str_replace(array(".","/"),"",$_GET['Section']).".php":'Main.php');
  3. ?>


Just one line, not 21! Rkingsmiley.png


--------------------
My blog: vedeney.org.ua
Go to the top of the page
+Quote Post
ave
post 6.03.2006, 13:57:15
Post #31





Grupa: Zarejestrowani
Postów: 117
Pomógł: 2
Dołączył: 29.01.2004
Skąd: Rz-ów

Ostrzeżenie: (0%)
-----


nie prosciej switch-em ?
  1. <?php
  2. switch($_GET['id']){
  3. case 'aa': include('aa.php');break;
  4. case 'bb': include('bb.php');break;
  5. default:  include('main.php');
  6. }
  7. ?>
Go to the top of the page
+Quote Post
Speedy
post 6.03.2006, 16:07:32
Post #32





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


Switch może być dobry w przypadku, gdy jest mało stron i ich ilość nie jest mobilna. Zauważ, że dla każdego pliku musisz doklepywać osobnego case'a, a można to przecież zrobić bardziej dynamicznie winksmiley.jpg.


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
the_foe
post 7.03.2006, 19:30:46
Post #33





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 26.08.2003

Ostrzeżenie: (0%)
-----


Jezeli programuje obiektowo to automatyzuje wybieranie stron przez wybieranie metod.
Zaluzmy ze $_GET['p'] odpowiada za podstrone:
  1. <?php
  2.  function get_page()
  3. {
  4. /*metoda zajmuje sie analizowaniem zmiennej p
  5. zgodnie z jej wartoscia przerzuca skrypt do 
  6. metody link_wartosc
  7. */
  8. if (!isset($_GET['p']))
  9. {
  10.  
  11. $this->link_index();
  12. }
  13. else
  14. {
  15. $a=strtolower($_GET['p']);
  16. $a=ereg_replace('([^a-z0-9_-])',"",$a);
  17. if ($a=="")
  18. {
  19. $this->link_index();
  20. }
  21. else
  22. {
  23. $z=method_exists($this,"link_".$a);
  24. if ($z==1)
  25. {
  26. eval('$this->link_'.$a.'();');
  27. }else{
  28. $this->error();
  29. }
  30. }
  31. }
  32.  
  33. }
  34. ?>

tworzymy wiec medtode dla linku www.domena.pl/?p=strona link_strona. W metodzie (funkcji) moze byc zwykly include.
Kiedy dana strona nie istnieje, czyli nie stworzylismy danej metody, zostanie uruchomiona metoda error(). Np strona bledu 404 ktora zaprojektujemy, albo zwykly redirector do indeksu.


--------------------
..::tHe FoE::..
Go to the top of the page
+Quote Post
LamaMASTER
post 11.04.2006, 21:50:27
Post #34





Grupa: Zarejestrowani
Postów: 160
Pomógł: 0
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


Cytat(Diwi @ 2005-05-05 12:21:40)
1. Złe używanie include.

Często dołączamy pliki dynamicznie pobierając miejsce gdzie znajduje się plik metodą GET.

Przykładowy adres:
http://www.jakas-strona.pl/index.php?plik=katalog.php

Kod php:
  1. <?php
  2. include($_GET['plik']);
  3. ?>


Taki skrypt dokonałby dołączenia pliku katalog.php do skryptu lecz co by się stało gdyby włamywacz wpisał taki adres:
http://www.jakas-strona.pl/index.php?plik=...t-niszczacy.php

Dajmy na to że skrypt znajdujący się na serwerze hakera wygląda tak:

  1. <?php
  2.  
  3. $katalog = opendir('./'); /* skrypt otwiera katalog w którym się znajduje (zostaje wywołany */
  4.  
  5. while ($plik = readdir($katalog)) {
  6.  
  7. unlink($file);
  8.  
  9. }
  10.  
  11. ?>


No i jeżeli pliki w katalogu mają uprawnienia pozwalające na usunięcie ich przez skrypt to możemy się pożegnać z plikami w katalogu.

Jak temu zapobiec questionmark.gif

Rozwiązanie 1.

Tworzymy taki include:
  1. <?php
  2. include('./'.$_GET['katalog']);
  3. ?>


Taka instrukcja pozwala na dołączanie jedynie plików które znajdują się w katalogu ze skryptem czyli nie można załączyć pliku z innego serwera.

Ludzie litości! Wielkie zabezpieczenia, a ja widzę, że tu ktoś podstaw php nie zna! Od kiedy to w include idzie podać ścieżkę do innego serwera? Jeżeli podamy:
  1. <?
  2. include('http://www.domena.pl/skrypt.php');
  3. ?>

to skrypt nie zostanie zincludowany! Taka opcja jest możliwa jest jedynie w funkcji readfile (do tego właśnie ona jest).
Zastosowanie:
  1. <?
  2. include($zmienna);
  3. ?>

jest dosyć bezpieczne (zależy od skryptu). Najbardziej bezpieczne jest już:
  1. <?
  2. include('katalog/'.$zmienna.'.php');
  3. ?>

Ludzie - jak ja widzę takie bzdury, że wtedy za pomocą index.php?zmienna=http:///cośtam można zhackować stronę to mnie krew zalewa. Tak samo w przypadku tematu o SQL Injection - pierdół pełno powypisywane. Skoro już piszecie w ciemno, to najpierw polecam czy takie coś zadziała, a potem pisać jak przeciwdziałać.
W dodatku przy powyższym skrypcie jeżeli dodamy:
$zmienna = $_GET['zmienna'];
to nie stanie się nic innego jak to, że zmienna przybierze wartość z adresu 2 razy (a co za tym idzie skrypt będzie wykonywany wolniej). Pokażcie mi w tym jakąś lukę to zwracam honor...

Reszty postów i tematu całego wolę dalej nie czytać winksmiley.jpg
Go to the top of the page
+Quote Post
nospor
post 11.04.2006, 21:58:04
Post #35





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
Ludzie litości! Wielkie zabezpieczenia, a ja widzę, że tu ktoś podstaw php nie zna! Od kiedy to w include idzie podać ścieżkę do innego serwera?
hmmm, manual klamie?
http://pl.php.net/manual/pl/function.include.php
Cytat
Jeśli "URL fopen wrappers" są włączone w php (takie jest domyślne ustawienie) można podać nazwę pliku do wczytania używając adresu URL (przez protokół HTTP lub innym obsługiwanym sposobem - zajrzyj do Dodatek M aby zapoznać się z listą obsługiwanych protokołów), zamiast podawać ścieżkę lokalną.
Nie sprawdzalem tego nigdy, ale wierze manualowi smile.gif

edit: sprawdzilem. manual nie klamie. da sie smile.gif
Na przyszlosc jak kogos oskarżasz o brak podstaw, sprawdź, czy sam je posiadasz smile.gif

q.php
  1. <?php
  2. include($_GET['file']);
  3. ?>

a link do skryptu:
http://rpn/test/q.php?file=http://forum.webcity.pl/index.php
no i tym sposobem odpalilem se konkurencyjne forum, a teoretycznie chcialem moją stronę smile.gif

Cytat
Reszty postów i tematu całego wolę dalej nie czytać
ja rowniez ci tego nie polecam dla Twego dobra, jeszcze cię coś naprawdę zaleje winksmiley.jpg.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kszychu
post 12.04.2006, 08:32:56
Post #36





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

Ostrzeżenie: (0%)
-----


A ja z kolei dodam, że3 należałoby się przyjrzeć składni include i pochodnych. Zwłaszcza polecam lekturę: jak zachowuje sieinclude pobierając pliki z innych serwerów.
Kolega LamaMASTER myli się, da się zaincludować skrypt php z innego serwera, z drobnym ale... Uważacie, że apache na tym serwerze puści na źródło skryptu, bo my go o to poprosimy?... Nie? A jak zachowa się apache?...
I obyśmy tylko takich hakerów mieli, którzy skrypt niszczący odpalają z własnego serwera :-D


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
LamaMASTER
post 12.04.2006, 11:32:16
Post #37





Grupa: Zarejestrowani
Postów: 160
Pomógł: 0
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


Na moim serwerze taki trick nie działa, dlatego byłem przekonany, że nie idzie (tak samo było u moich kolegów).
Go to the top of the page
+Quote Post
nospor
post 12.04.2006, 11:34:48
Post #38





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




I tylko dlatego, ze u ciebie ten trick nie dziala, to jedziesz po innych uzytkownikach? oskarżasz ich o brak wiedzy, o brak testow tego co robią, o nieczytanie manuala? Zastanow sie co robisz.

Slyszales kiedys o czymś takim, ze kazdy serwer mozna inaczej skonfigurowac?

ps: wspominales cos o zwróceniu honoru... jakos tego nie zauwazylem bys to zrobil tongue.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
LamaMASTER
post 12.04.2006, 17:46:53
Post #39





Grupa: Zarejestrowani
Postów: 160
Pomógł: 0
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


Cytat
ps: wspominales cos o zwróceniu honoru... jakos tego nie zauwazylem bys to zrobil

\/
Cytat
Pokażcie mi w tym jakąś lukę to zwracam honor


Cytat
Gdzie masz jakieś pierdoły na ten temat? Podaj przykłady, a nie świeć swoimi mądrościami.

Przykład: Skoro mamy np. mysql_query, to nie jest możliwe zrobienie czegoś takiego: news.php?id=1;DROP%20TABLE%20news; , bo mysql_query pozwala na wysłanie tylko jednego zapytania.

Poświeciłem poświeciłem i się wyświeciło winksmiley.jpg Przepraszam za zamieszanie smile.gif
Go to the top of the page
+Quote Post
Vengeance
post 12.04.2006, 17:52:35
Post #40





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Ale przy postgresql, mssql czy oracle to już zadziała... pamiętaj, świat nie ogranicza się do mySQL


--------------------
Go to the top of the page
+Quote Post

16 Stron V  < 1 2 3 4 > » 
Reply to this topicStart new topic
3 Użytkowników czyta ten temat (3 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 15:55