2011-07-28 15 views
11

jestem tring aby mój PHP tak bezpieczne, jak to możliwe, a dwie główne rzeczy, staram się unikać sąfunkcja PHP aby zapobiec SQL injection oraz XSS

  • mySQL Zastrzyki
  • Cross-Side Scripting (XSS)

jest to skrypt mam przeciwko mySQL wstrzykiwań:

function make_safe($variable) { 
$variable = mysql_real_escape_string(trim($variable)); 
return $variable; } 

http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


Przeciwko XSS, znalazłem to:

$username = strip_tags($_POST['username']); 

Teraz chcę zjednoczyć dwa w jednej funkcji. Czy byłby to najlepszy sposób na zrobienie tego? :

function make_safe($variable) { 
$variable = strip_tags(mysql_real_escape_string(trim($variable))); 
return $variable; } 

Albo robi mysql_real_escape_string już zapobiec XSS? I czy jest jeszcze coś, co mógłbym dodać do tej funkcji, aby zapobiec innym formom hakowania?

+3

Nie ma magicznej różdżki, tylko stałą czujność. –

+3

Ty i [PDO] (http://php.net/manual/en/book.pdo.php) powinni zostać przyjaciółmi! – Jacob

+0

Nie bardzo rozumiem, co wy dwaj mówicie;) – LonelyWebCrawler

Odpowiedz

11

mysql_real_escape_string() nie zapobiega XSS. Uniemożliwi to jedynie iniekcje SQL.

Aby walczyć z XSS, musisz użyć htmlspecialchars() lub strip_tags(). Pierwszy przekształci znaki specjalne, takie jak < na &lt;, które będą wyświetlane jako <, ale nie zostaną wykonane. 2. po prostu usuń wszystkie znaczniki.

Nie polecam wykonywania tej funkcji specjalnej, a nawet wykonywania jednej funkcji, aby to zrobić, ale dany przykład zadziała. Zakładam.

+0

Dlaczego nie funkcja? – LonelyWebCrawler

+0

I nie mogę używać tylko strip_tags(), czyniąc htmlspecialchars() nadmiarowe? – LonelyWebCrawler

+0

# 1 pytanie - nic nie pasuje. Pytanie nr 2 - zgadza się. – daGrevis

13

Funkcja:

function make_safe($variable) 
{ 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; 
} 

Nie działa

SQL Injection i XSS są dwie różne bestie. Ponieważ każdy z nich wymaga innego ucieczki, musisz oddzielnie korzystać z każdej funkcji ewakuacji strip_tags i mysql_real_escape_string.
Łącząc je, pokonasz bezpieczeństwo każdego z nich.

Podczas wprowadzania danych do bazy danych należy używać standardu mysql_real_escape_string().
Użyj strip_tags() podczas wypytywania danych z bazy danych przed wyświetleniem ich na ekranie.

Dlaczego połączenie dwóch funkcji jest niebezpieczne
Od ujścia konie: http://php.net/manual/en/function.strip-tags.php

Ponieważ strip_tags() nie faktycznie zweryfikować HTML, częściowe lub połamane znaczniki mogą skutkować usunięciem więcej tekstu/dane niż oczekiwano.

Więc wprowadzając nieprawidłowy kod HTML na pola bazy danych inteligentną atakująca może wykorzystać swoją naiwną implementację w pokonaniu mysql_real_escape_string() w kombi.

+0

Używam więc mysql_real_escape_string() podczas dodawania danych do bazy danych, ale nie podczas porównywania danych wprowadzanych przez użytkownika z wpisami do bazy danych (np. Podczas logowania)? – LonelyWebCrawler

+0

@user, Używasz 'mysql_real_escape_string()' ** zawsze **, przy każdym zapytaniu, czy to wybierz, aktualizuj usuń lub wstaw. – Johan

2

To, na co naprawdę warto zwrócić uwagę, to używanie prepared statements i PDO zarówno do tworzenia warstwy abstrakcji w bazie danych, jak i do całkowitego wyeliminowania ataków typu SQL injection.

Jeśli chodzi o XSS, po prostu upewnij się, że nie masz zaufania do danych wprowadzanych przez użytkownika. Uruchom dane strip_tags lub htmlentities, gdy przechowujesz dane lub kiedy je wypiszesz (nie oba, ponieważ spowoduje to bałagan w wynikach) i wszystko będzie w porządku.

+0

Nigdy nie słyszałem o PDO. Co to jest? – LonelyWebCrawler

+0

PDO to warstwa abstrakcji bazy danych dołączona do PHP. Zapoznaj się tutaj ze wstępem: http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ –

Powiązane problemy