Sikkerhedsproblemer i PHP: kapring af sessioner, scripting på tværs af websteder, SQL-injektion og hvordan man løser dem

Sikkerhed i PHP

Når du skriver PHP-kode, er det meget vigtigt at huske følgende sikkerhedssårbarheder for at undgå at skrive usikker kode.

Typer af sårbarheder

Dette er de almindelige sårbarheder, du støder på, når du skriver PHP-kode. Vi diskuterer et par i yderligere dybde nedenfor.

  • Forfalskning på tværs af websteder En sårbarhed i applikationen forårsaget af, at programmøren ikke kontrollerer, hvor en anmodning blev sendt fra - dette angreb sendes til en bruger med højt privilegium for at få adgang til applikationen på højere niveau.
  • Cross Site Scripting En sårbarhed i applikationen forårsaget af, at programmøren ikke renser input, før han udsender input til browseren (for eksempel en kommentar på en blog). Det bruges almindeligvis til at køre ondsindet javascript i browseren for at udføre angreb såsom stjæling af sessioncookies blandt andre ondsindede handlinger for at få privilegier på højere niveau i applikationen.
  • Lokal filinddragelse En sårbarhed i applikationen forårsaget af programmøren, der kræver et filinput, der leveres af brugeren, og som ikke renser inputet, før der åbnes den ønskede fil. Dette resulterer i, at en fil medtages, hvor den ikke skulle have været.
  • Fjernfilinddragelse En sårbarhed i applikationen forårsaget af programmøren, der kræver et filinput, der leveres af brugeren, og ikke renser indgangen, før den får adgang til den anmodede fil. Dette resulterer i, at en fil trækkes fra en ekstern server og medtages, hvor den ikke skulle have været.
  • Session Hijacking En sårbarhed forårsaget af en angriber, der får adgang til en brugers session-id og er i stand til at bruge en anden brugers konto, der efterligner dem. Dette bruges ofte til at få adgang til en administrativ brugers konto.
  • Session Identifier Acquirement Session Identifier Acquirement er en sårbarhed, der skyldes, at en hacker kan enten gætte en brugers sessionsidentifikator eller udnytte sårbarheder i selve applikationen eller brugerens browser for at få en sessionsidentifikator.
  • SQL Injection En sårbarhed i applikationen forårsaget af, at programmøren ikke renser input, før den er inkluderet i en forespørgsel i databasen. Dette fører til, at angriberen har fuld læsning og oftere end ikke skriveradgang til databasen. Med denne type adgang kan en angriber gøre meget dårlige ting.

Lad os nu se på nogle almindelige sårbarheder mere detaljeret.

Sessionskapring

Session Hijacking er en sårbarhed forårsaget af en angriber, der får adgang til en brugers session-id og er i stand til at bruge en anden brugers konto, der efterligner dem. Dette bruges ofte til at få adgang til en administrativ brugers konto.

Forsvar mod Session Hijacking-angreb i PHP

For at forsvare dig mod Session Hijacking-angreb skal du kontrollere den aktuelle brugers browser- og placeringsoplysninger mod oplysninger gemt om sessionen. Nedenfor er et eksempel på implementering, der kan hjælpe med at afbøde virkningerne af et sessionkapringangreb. Det kontrollerer IP-adressen, brugeragenten, og hvis sessionen er udløbet, fjernes en session, før den genoptages.

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

Cross Site Scripting

Cross Site Scripting er en type sårbarhed i en webapplikation forårsaget af, at programmøren ikke renser input, før han udsender input til webbrowseren (for eksempel en kommentar på en blog). Det bruges ofte til at køre ondsindet javascript i webbrowseren for at udføre angreb som stjæling af sessioncookies blandt andre ondsindede handlinger for at få højere rettigheder i webapplikationen.

Eksempel på cross site scripting angreb

En blog giver brugerne mulighed for at style deres kommentarer med HTML-tags, men scriptet, der driver bloggen, fjerner ikke tags, der tillader enhver bruger at køre javascript på siden. En hacker kan bruge dette til deres fordel for at køre ondsindet javascript i browseren. De kunne inficere brugere med malware, stjæle sessionscookies og mere.

 alert('Cross Site Scripting!'); 

Forsvare dit websted mod scriptingangreb på tværs af websteder i PHP

I PHP er der to primære funktioner, htmlspecialchars()og strip_tags()indbygget for at beskytte dig mod cross site scripting-angreb.

Den htmlspecialchars($string)funktion forhindrer en HTML snor ved afsmeltning som HTML og vise den som almindelig tekst til webbrowseren. htmlspecialchars () kodeeksempel


    

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);

Indstilling af X-XSS-beskyttelseshoved:

I PHP kan du sende X-XSS-Protectionoverskriften, som vil bede browsere om at kontrollere, om der er et reflekteret Cross Site Scripting-angreb og blokere siden for indlæsning. Dette forhindrer ikke alle cross-site-scriptingangreb kun reflekterede og bør bruges i kombination med andre metoder.


    

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