htmlentities, htmlspecialchars, exceptions et PDO [SECURITE]

Eléphant du PHP | 428 Messages

18 déc. 2009, 12:01

Bonjour,

Après recherches sur le web en m'intéressant sur la sécurité, je suis tombé sur ce post qui parle de l'utilisation de htmlentities, htmlspecialchars, les requetes PDO et la gestion d'exeptions.

http://www.developpez.net/forums/d64081 ... ost3779301

J'ai plusieurs questions à vous poser avant d'entamer pour ma part une restructuration complète de mes codes effectués à ce jour...

Dans l'article, on parle d'utiliser htmlentities pour (si j'ai bien compris) filtrer les variables avant de les utiliser
exemple :
$test = $_POST['test'];
// deviens 
$test = htmlentities ($_POST['test'], ENT_QUOTES);
Jusque là, j'ai pigé. Mais ce que je ne comprends pas c'est l'utilisation de htmlspecialchars qui lui est utilisé pour filter également les données avant de les utiliser ... comme ceci :
$noXSS = htmlspecialchars($_GET['xss'], ENT_QUOTES);
echo $noxss;
Si je tente de comprendre, je dois utiliser htmlentities pour les variables récupérées (hors mis $_GET et $_POST) et utiliser htmlspecialchars pour les données $_POST et $_GET ???


Toujours dans cet article, on parle d'utiliser les exceptions pour apparemment éviter les attaques multiples comme : les failles d'appel, les injections sql, le vol de session, les attaques combinées...

Est ce vraiment utile ?? Quel est le rôle réel des exceptions ?
try
{
     $connexion = new PDO ( ... );
     $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $sql = "...";
     foreach ($connexion->query($sql) as $row)
     {
     ...
     }
     $connexion = null;
}
catch (PDOException $e)
{
     echo $e->getMessage();
} 

Bref, que dois-je faire et comment pour sécuriser mon code ?
(je suis déjà en requetes PDO mais cela ne suffit apparemment pas)


Merci pour le maximum de précisions que vous m'apporterez,
Raph
Modifié en dernier par visualight le 18 déc. 2009, 19:15, modifié 2 fois.

Mammouth du PHP | 2937 Messages

18 déc. 2009, 13:28

htmlspecialchars () n'échappe que les caractères susceptibles d'être utilisés dans le codage HTML ou XML, à savoir les chevrons (< et >) et l'esperluette (&), ainsi que les guillemets, éventuellement (par défaut, ce sont les guillemets doubles qui sont échappés ; mais, on peut aussi n'échapper que les guillemets simples, échapper les deux types de guillemets ou ne pas échapper les guillemets du tout).

htmlentities (), en plus des caractères évoqués ci-dessus, échappe tous les caractères spéciaux reconnus par le codage actuellement utilisé (ainsi, le symbole € sera échappé en &euro; en UTF-8 ou en ISO-8859-15, mais pas en ISO-8859-1).

Entre ces deux fonctions, tu peux très bien te contenter de htmlspecialchars ().

Pour te prémunir des attaques par injection SQL, tu peux utiliser la méthode quote () de PDO ou, mieux encore, utiliser des requêtes préparées, où les échappements nécessaires sont effectués automatiquement. Un avantage des requêtes préparées est qu'elles peuvent être exécutées plusieurs fois en ne précisant que les valeurs à placer dans les marqueurs de la requête préparée.

Eléphant du PHP | 428 Messages

18 déc. 2009, 14:58

Bonjour;

Merci pour ta réponse.
Je travaille déjà avec des requêtes préparées PDO.
Je peux me contenter de htmlspecialchars() pour éviter les attaques type XSS si j'ai bien compris (ou est il préférable d'utiliser htmlentities) ?

Toujours en ce qui concerne htmlspecialchar OU htmlentities je suppose que je dois filtrer TOUTES mes variables $_GET, $_POST et celles obtenues par requete FETCH_ASSOC ?

Et en ce qui concerne la gestion d'exceptions dans les requêtes, ça m'apporte quoi ?

Merci pour les précisions,
Raph

ViPHP
AB
ViPHP | 5818 Messages

18 déc. 2009, 15:17

Li bien le manuel
Certains caractères ont des significations spéciales en HTML, et doivent être remplacés par des entités HTML pour être affichés
Et uniquement pour être affichés.

Utilises de préférence htmlspecialchars surtout si tu travailles en utf-8. C'est suffisant et tu n'auras pas besoin de spécifier l'encodage (indispensable de l'indiquer si tu utilises htmlentites et l'utf-8).

Eléphant du PHP | 428 Messages

18 déc. 2009, 19:06

OK, merci

Juste une dernière question au passage : Comment puis-je savoir avec quel jeu de caractères je travaille au niveau de mon hébergement? Y a t'il un petit bout de code qui pourrait me le dire ?
je possède un serveur dédié OVH release 2 Gentoo.

J'ai essayé phpinfo et il me sort plusieurs lignes ayant la même structure dont : HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.7
cela veut il dire que je peux travailler avec les deux type de caractères ? Si oui, lequel est par défaut ?

Merci pour vos réponses,
Raph

ViPHP
AB
ViPHP | 5818 Messages

19 déc. 2009, 06:34

Il me semble que ce n'est qu'avec la version php6 que l'utf-8 sera par défaut.
Pour l'instant le serveur doit encore envoyer par défaut des entêtes au format ISO 88..

Donc le plus simple tant que l'on est en php5 (ou versions inférieures) est l' ISO 88.. puisqu'il n'y a pas d'entêtes à spécifier.

Par contre l'UTF-8 est bien mieux adapté pour un site multilingues car il peut gérer toutes les langues, contrairement à l' ISO 88... C'est donc le format "universel" qui est maintenant le plus souvent adopté pour un développement de site. Pour plus d'infos sur le sujet : tuto sur l'encodage en UTF-8