Vulnerabilități de securitate PHP: deturnarea sesiunii, scripturi între site-uri, injecție SQL și cum să le remediați

Securitate în PHP

Când scrieți cod PHP, este foarte important să țineți cont de următoarele vulnerabilități de securitate pentru a evita scrierea unui cod nesigur.

Tipuri de vulnerabilități

Acestea sunt vulnerabilitățile comune pe care le veți întâlni atunci când scrieți cod PHP. Vom discuta câteva în detaliu mai jos.

  • Cross Site Request Forgery O vulnerabilitate în aplicație cauzată de faptul că programatorul nu verifică de unde a fost trimisă o cerere - acest atac este trimis unui utilizator de nivel privilegiat ridicat pentru a obține acces la nivel superior la aplicație.
  • Cross Site Scripting O vulnerabilitate în aplicație cauzată de faptul că programatorul nu dezinfectează intrarea înainte de a trimite intrarea în browser (de exemplu, un comentariu pe un blog). Este folosit în mod obișnuit pentru a rula javascript rău intenționat în browser pentru a efectua atacuri precum furtul cookie-urilor de sesiune, printre alte acțiuni rău intenționate, pentru a obține privilegii de nivel superior în aplicație.
  • Includere fișier local O vulnerabilitate în aplicație cauzată de programator care necesită o intrare de fișier furnizată de utilizator și care nu dezinfectează intrarea înainte de a accesa fișierul solicitat. Acest lucru duce la includerea unui fișier acolo unde nu ar fi trebuit să fie.
  • Includere de fișiere la distanță O vulnerabilitate în aplicație cauzată de programator care necesită o intrare de fișier furnizată de utilizator și care nu dezinfectează intrarea înainte de a accesa fișierul solicitat. Acest lucru duce la extragerea unui fișier de pe un server la distanță și inclus acolo unde nu ar fi trebuit să fie.
  • Session Hijacking O vulnerabilitate cauzată de accesul unui atacator la identificatorul de sesiune al unui utilizator și posibilitatea de a utiliza contul unui alt utilizator care îl identifica. Aceasta este adesea utilizată pentru a avea acces la contul unui utilizator administrativ.
  • Achiziția identificatorului de sesiune Achiziția identificatorului de sesiune este o vulnerabilitate cauzată de faptul că un atacator poate fie să ghicească identificatorul de sesiune al unui utilizator, fie să exploateze vulnerabilitățile din aplicație sau din browserul utilizatorului pentru a obține un identificator de sesiune.
  • SQL Injection O vulnerabilitate în aplicație cauzată de faptul că programatorul nu dezinfectează intrarea înainte de a o include într-o interogare în baza de date. Acest lucru face ca atacatorul să aibă acces complet la citire și, de cele mai multe ori, la scriere la baza de date. Cu acest tip de acces, un atacator poate face lucruri foarte rele.

Acum să analizăm mai detaliat câteva vulnerabilități comune.

Sechestrarea sesiunii

Session Hijacking este o vulnerabilitate cauzată de accesul unui atacator la identificatorul de sesiune al unui utilizator și de posibilitatea de a utiliza contul unui alt utilizator care îl identifica. Aceasta este adesea utilizată pentru a avea acces la contul unui utilizator administrativ.

Apărarea împotriva atacurilor Session Hijacking în PHP

Pentru a vă apăra împotriva atacurilor Session Hijacking, trebuie să verificați browserul utilizatorului actual și informațiile despre locație împotriva informațiilor stocate despre sesiune. Mai jos este un exemplu de implementare care poate ajuta la atenuarea efectelor unui atac de deturnare a sesiunii. Verifică adresa IP, agentul utilizatorului și dacă sesiunea a expirat eliminând o sesiune înainte de a fi reluată.

 ($_SESSION['lastaccess'] + 3600)) { session_unset(); session_destroy(); } else { $_SESSION['lastaccess'] = time(); }

Cross Site Scripting

Cross Site Scripting este un tip de vulnerabilitate într-o aplicație web cauzată de faptul că programatorul nu dezinfectează intrarea înainte de a trimite intrarea în browserul web (de exemplu, un comentariu pe un blog). Este folosit în mod obișnuit pentru a rula javascript rău intenționat în browserul web pentru a efectua atacuri, cum ar fi furtul cookie-urilor de sesiune, printre alte acțiuni rău intenționate, pentru a obține privilegii de nivel superior în aplicația web.

Exemplu Atac de scriptare pe site-uri încrucișate

Un blog permite utilizatorilor să își modifice comentariile cu etichete HTML, cu toate acestea scriptul care alimentează blogul nu elimină etichetele care permit oricărui utilizator să ruleze javascript pe pagină. Un atacator poate folosi acest lucru în avantajul său pentru a rula javascript rău intenționat în browser. Ar putea infecta utilizatorii cu programe malware, fura cookie-uri de sesiune și multe altele.

 alert('Cross Site Scripting!'); 

Apărarea site-ului dvs. web de atacurile de scripturi cross site în PHP

În PHP există două funcții primare htmlspecialchars()și strip_tags(), încorporate pentru a vă proteja de atacurile de scriptare între site-uri.

htmlspecialchars($string)Functia va preveni un șir de HTML de randare ca HTML și afișa ca text simplu pentru browser - ul web. htmlspecialchars () exemplu de cod


    

The other approach is the strip_tags($string, $allowedtags) function which removes all HTML tags except for the HTML tags that you’ve whitelisted. It’s important to note that with the strip_tags() function you have to be more careful, this function does not prevent the user from including javascript as a link, you’ll have to sanitize that on our own.

strip_tags() code example


     

"; echo strip_tags($usercomment, $allowedtags);

Setarea antetului de protecție X-XSS:

În PHP puteți trimite X-XSS-Protectionantetul, care va spune browserelor să verifice dacă există un atac Cross Site Scripting reflectat și să blocheze pagina de încărcare. Acest lucru nu împiedică toate atacurile de cross site scripting doar cele reflectate și ar trebui să fie utilizate în combinație cu alte metode.


    

Writing your own sanitization function Another option, if you would like more control over how the sanitization works, is to write your own HTML Sanitization function, this is not recommended for PHP Beginners as a mistake would make your website vulnerable.

Defending your website from cross site scripting attacks with a Content Security Policy

An effective approach to preventing cross site scripting attacks, which may require a lot of adjustments to your web application’s design and code base, is to use a content security policy.

Set a Content Security Policy as an HTTP Header

The most common way of setting a Content Security Policy is by setting it directly in the HTTP Header. This can be done by the web server by editing it’s configuration or by sending it through PHP.

Example of a Content Security Policy set in a HTTP Header


     

Set a Content Security Policy as a Meta tags

You can include your Content Security Policy in the page’s HTML and set on a page by page basis. This method requires you to set on every page or you lose the benefit of the policy.

Example of a Content Security Policy set in a HTML Meta Tag


      SQL Injection

SQL injection is a vulnerability in the application caused by the programmer not sanitizing input before including it into a query into the database. This leads to the attacker having full read and more often than not write access to the database. With this type of access an attacker can do very bad things.

Example SQL Injection attack

The below PHP Script runs an SQL Statement to get a user’s email by ID. However the input is not sanitized making it vulnerable to SQL Injection

connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM users WHERE idemail"]; } } else { echo "no results"; } $conn->close();
SELECT email FROM users WHERE id = `$input`;

So with the above the input is not type casted (I.e. casting the input with (int) so only a number is allowed) nor escaped allowing someone to perform an SQL Injection attack - for example the URL getemailbyuserid.php?id=1'; My Query Here-- - would allow you to run arbitrary SQL queries with little effort.

Defending your website from sql injection attacks in PHP

There are a few approaches to defend your website from SQL Injection Attacks. These approaches are Whitelisting, Type Casting, and Character Escaping

Whitelisting: The whitelisting approach is used in cases where only a few inputs are expected. You can list each expected input in a PHP Switch and then have a default for invalid input. You do not have to worry about a type casting issue or a character escape bypass but the allowed input is extreamly limited. It remains an option, see the example below.


        

Type Casting: The type casting approach is commonly used for an application using numeric input. Simply cast the input with (int) $input and only a numeric value will be allowed.

Character Escaping: The character escaping approach will escape characters such as quotes and slashes provided by the user to prevent an attack. If you are using MySQL Server and the MySQLi library to access your database, the mysqli_real_escape_string($conn, $string) function will take two arguments, the MySQLi connection, and the string and will properly escape the user’s input to block an sql injection attack. The exact function you use depends on the database type and php library you are using check the php library’s documentation for more information on escaping user input.

More on PHP:

  • PHP best practices
  • Best PHP code examples
  • How to prevent a slow loris attack on a PHP server
  • How to set up a local debugging environment in PHP