Lemat, strona prywatna

Bezpieczeństwo pisania skryptów w PHP

Programując w PHP należy zwrócić uwagę nie tylko na kasę, jaka wpłynie od zleceniodawcy ale też na jakość tworzonych przez siebie skryptów. Jednym z aspektów tego jest bezpieczeństwo.


Przykład 1. SQL injection.

Na szczęście w PHP jest to niemożliwe do zrobienia, ale jeżeli ktoś z deweloperów PHP wpadnie na pomysł możliwości uruchamiania wielu kwerend pojedynczym wywołaniem funkcji mysql_query to jest to świetne pole do popisu dla włamywaczy.

Opis:
przypuśćmy, że mamy

index.php?module=pages&pg_id=16 ;)

takie wywołanie powinno wyświetlić stronę numer 16
w kodzie jest:

SELECT * FROM pages WHERE id=$pg_id

zastanówcie się co by było jakby wywołac stronę:

index.php?module=pages&pg_id=16; DELETE FROM pages;

wtedy w kodzie będzie:

SELECT * FROM pages WHERE id=16; DELETE FROM pages;

czyli mamy 2 zapytania do bazy przy czym drugie jest niepożądane.

Na szczęście jak na razie PHP nie wykona takiego zapytania, ale warto dmuchać na zimne i stosować addslashes().

To powyższe to był przykład tego, czego się nie uda zrobić włamywaczowi w PHP, a poniżej kilka przykładów zapytań z zaznaczonym na czerwono kodem włamywacza - zwróćcie dokładnie uwagę na apostrofy:

SELECT * FROM hasla WHERE login='login' OR 1=1 OR 1='1' AND haslo='haslo'
DELETE FROM subskrypcje WHERE email='email' OR 1='1'

Thx. dla asm.


Przykład 2. Uruchamianie zdalnego pliku.

Przypuśćmy, że mamy

index.php?plik=news.php

a w kodzie php:

include($plik);

wtedy istnieje możliwość ataku przez:

index.php?plik=http://mójserwer/skrypt.php

Po takim wywołaniu PHP pobierze z mojego serwera plik i go przetworzy na serwerze ofiary. Skrypt.php może wyciągać hasła, kasowac pliki....

Rozwiązanie jest proste:

switch ($plik) {
case 'news.php': include('news.php');
}


Przykład 3. Upload plików.

Jeżeli mamy stronę, na której możemy dokonać uploadu plików np. emotikony do forum. I nie sprawdzamy rodzaju pliku to atakujący może zuploadować cośtam.php. Co ten skrypt może zrobić z Waszym serwerem to temat na kilka książek...


Przykład 4: HTML injection, XSS Cross Site Scripting

Panująca moda na Web 2.0, czyli portale społecznościowe, blogi i inne takie wymusza od twórców stron wstawianie elementów interaktywnych. Czyli w skrócie umożliwienie wypowiadania się / komentowania / tworzenia własnych stron. Trywialnym przykładem jest link "Skomentuj ten tekst" poniżej. Takie formularze powinny być zabezpieczone przed wprowadzaniem niebezpiecznych treści - kodu HTML. Dla przykładu:

<div style="position:absolute;top:0px;left:0px;width:2000px;height:2000px;" onclick="alert('dupa a nie programista');">h0ck3d</div>

<script type=text/javascript>alert(document.cookie)</script>


Rozsądnym zabezpieczeniem jest tutaj funkcja strip_tags. Przy czym drugi parametr tej funkcji pozwala na umieszczenie listy tagów dozwolonych. Można w ten sposób zostawić możliwość formatowania tekstu typu pogrubianie, kursywa, podkreślenie, kolor, wstawianie linków. W takich tagach należy sprawdzić czy nie ma przypadkiem niedozwolonych atrybutów, stylu. Dla przykładu:

<a href="http://lemat.priv.pl" style="position:absolute;top:0px;left:0px;width:2000px;height:2000px;" onclick="alert('dupa a nie programista'); return false;">niby typowy link do strony</a>

Jak widać powyższy kod zawiera zarówno niedozwolony styl jak i niedozwolony JavaScript. To wszystko należy wycinać.

Data utworzenia : 2003-10-12, data aktualizacji :2007-12-29

Skomentuj ten tekst

Komentarze:

dfsdffsd
2008-02-12 10:23:51
dfggdag
[div style="position:absolute;top:0px;left:0px;width:2000px;height:2000px;" onclick="alert('dupa a nie programista');"]h0ck3d[/div] [script type=text/javascript]alert(document.cookie)[/script] "tu bylem ja, hacker - analfabeta"
e5
2008-02-02 23:26:39
upload i php
Czy jeżeli na moim serwerze istnieje możliwość uploadu, a ktoś mi wysle jakiś plik np z rozszerzeniem .php (serwer obsługuje php) to "coś mi się stanie" od razu czy dopiero po próbie uruchomienia tego pliku? Jaka jet szansa, że ewentualny atakujący będzie wiedział gdzie ten plik sobie poszedł? Pytania nieobowiązkowe ( :D ) : Jakich rozszerzeń najlepiej nie akceptować? Łatwo zrobić automatyczną zmianę nazwy/rozszerzenia w php? a no i jeszcze taki mały P.S. + cytat: " i tak wszyscy widzą, że musi nad nią ostro popracować mój znajomy grafik" byłem tu jakieś iks lat temu (po IP mnie nie znajdziesz bo juz mam chyba 3. providera...) i z tego co pamiętam ten tekst już wtedy tu był :p a logo (img/logo2.gif) nadal się niezmieniło, chociaż ta dwójka przed .gif mnie zastanawia... Pozdrowienia dla admina. Aż dziwne, ze ta strona jeszcze jest i nikt jej nie pokiereszował a pewnie paru próbowało...
Odpowiedź Lemata:
dopiero po próbie uruchomienia chyba, że twoje skrypty odpalają od razu pliki niewiadomego pochodzenia. plik zostanie zapewne przekopiowany tam gdzie wszystkie inne pliki, wystarczy poobserwować trochę sajt.
porutmen
2007-11-05 18:50:48
ogolny
nappisal bys to prostszym jezykiem bo fajnie ze ty to rozumiesz ale mogl bys wapsc na to jak jestes taki modry ze nie kazdy moze to za czaic....
Odpowiedź Lemata:
nie umiem tego napisać jeszcze bardziej prosto.
__Kris
2007-04-03 10:38:49
addslashes
Jak stosować addslashes() i z czym to się jje?
Odpowiedź Lemata:
z dżemem
Kocki
2006-02-12 13:57:57
Bezpieczeństwo
Jedna z pierwszych rzeczy jaką robię przy SQLu to przeniesienie uprawnień również na bazę danych. Jeśli user x służy do pobierania kodów i wyświetlania ich na stronie to ma prawo tylko SELECT i żadne DELETE czy UPDATE mu nie wyjdzie.
wszystkie opinie »
Protected by spf
[Nospam-PL.NET]
Seti@Home
www.php.net
© Lemat 2004 - ∞