Parlons de Sécurité
Fermé
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
-
20 mars 2010 à 03:40
Atropa Messages postés 1935 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 - 23 mars 2010 à 21:19
Atropa Messages postés 1935 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 - 23 mars 2010 à 21:19
14 réponses
slt,
Commences par tester les vulnérabilités réelles et/ou potentielles avec un scanner comme nessus...en jetant un oeil sur les règles et en voyant le nombre pléthoriques de règles qu'il recèle, tu pourras te rendre compte que la sécurité est un domaine très vaste et très complexe qui ne se résume pas aux quelques questions que tu poses.
Commences par tester les vulnérabilités réelles et/ou potentielles avec un scanner comme nessus...en jetant un oeil sur les règles et en voyant le nombre pléthoriques de règles qu'il recèle, tu pourras te rendre compte que la sécurité est un domaine très vaste et très complexe qui ne se résume pas aux quelques questions que tu poses.
avion-f16
Messages postés
19125
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2023
4 468
20 mars 2010 à 12:46
20 mars 2010 à 12:46
Pour éviter la faille XSS, il suffit de remplacer les caractères < et > par leur équivalent en entité HTML ou ASCII. Il y a la fonction html_entities qui le fait très bien. Pour ma part, j'utiliser htmlspecialchars. Je n'utilise cette fonction que quand je fais un echo dans une page Web, pas pour l'insertion dans MySQL puisqu'il n'y a aucun risque de ce côté là. La faille XSS ne permet que l'insertion de scripts côtés clients, ce n'est pas possible de télécharger un virus en arrière-plan sur le poste du client sans confirmation.
Pour éviter les injections SQL, je désactive magic_quotes sur les version de PHP inférieures à 6 et j'applique addslashes() sur les variables que j'utilise dans la requête (sauf que j'utilise une requête préparée avec PDO). Si la données est censée être un nombre, je force le type de la variable à être en INT et je mets le type de champ MySQL sur INT (ou TINYINT, SMALLINT, ...).
Pour l'upload de fichiers, il ne faut pas te fier à l'extension (ne soit pas aussi con que Windows :) ) : vérifie le type MIME.
Pour éviter les injections SQL, je désactive magic_quotes sur les version de PHP inférieures à 6 et j'applique addslashes() sur les variables que j'utilise dans la requête (sauf que j'utilise une requête préparée avec PDO). Si la données est censée être un nombre, je force le type de la variable à être en INT et je mets le type de champ MySQL sur INT (ou TINYINT, SMALLINT, ...).
Pour l'upload de fichiers, il ne faut pas te fier à l'extension (ne soit pas aussi con que Windows :) ) : vérifie le type MIME.
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
Modifié par Atropa le 20/03/2010 à 20:08
Modifié par Atropa le 20/03/2010 à 20:08
Le site de nessus est en maintenance pour l'instant, j'y regarderai plus tard.
pour html_entities je suis d'accord sur le fait qu'elle le fasse très bien, seulement en SQL par exemple ce signe % peut être plus ou moins gênant.
Je n'utilise pas encore la version 6 de PHP n'étant pas celle présentée comme stable. les magic_quotes entrainent quelles failles ? et pourquoi ne plus les désactiver à partir de PHP 6? elles n'existent plus en PHP 6 ?
J'ai pris l'habitude de les désactiver mais je ne me souviens plus exactement pourquoi...
Il faudra que je me mette a PDO je vais voir ça demain. et je vais poster un exemple de code que j'utilise avec mysql.
Pour ce qui est du type MIME je voudrais bien le faire, seulement je me souvient que quand je travaillais sur les fichiers je n'y était pas parvenu à cause d'extensions PHP manquantes. Comment faire pour que ça fonctionne avec la majorité des solutions d'hébergement ?
Pour ce qui est des virus en arrière plan, il y a quelque années, je crois me souvenir que c'était au début de la version 2 de firefox, j'en avais eu de détecté par kaspersky alors que je n'avais rien téléchargé. Je ne suis pas certain a 100 % de ce que j'avance là, ça fait longtemps.
Il faudrait aussi faire une fonction simple a intégrer aux formulaires voir aux requêtes GET pour se prémunir contre les CSRF.
Je vais déjà poster un code contre les injections et pour sécuriser en partis les connexions SQL et les requêtes. Vous me direz ce que vous en pensez et comment les améliorer.
pour html_entities je suis d'accord sur le fait qu'elle le fasse très bien, seulement en SQL par exemple ce signe % peut être plus ou moins gênant.
Je n'utilise pas encore la version 6 de PHP n'étant pas celle présentée comme stable. les magic_quotes entrainent quelles failles ? et pourquoi ne plus les désactiver à partir de PHP 6? elles n'existent plus en PHP 6 ?
J'ai pris l'habitude de les désactiver mais je ne me souviens plus exactement pourquoi...
Il faudra que je me mette a PDO je vais voir ça demain. et je vais poster un exemple de code que j'utilise avec mysql.
Pour ce qui est du type MIME je voudrais bien le faire, seulement je me souvient que quand je travaillais sur les fichiers je n'y était pas parvenu à cause d'extensions PHP manquantes. Comment faire pour que ça fonctionne avec la majorité des solutions d'hébergement ?
Pour ce qui est des virus en arrière plan, il y a quelque années, je crois me souvenir que c'était au début de la version 2 de firefox, j'en avais eu de détecté par kaspersky alors que je n'avais rien téléchargé. Je ne suis pas certain a 100 % de ce que j'avance là, ça fait longtemps.
Il faudrait aussi faire une fonction simple a intégrer aux formulaires voir aux requêtes GET pour se prémunir contre les CSRF.
Je vais déjà poster un code contre les injections et pour sécuriser en partis les connexions SQL et les requêtes. Vous me direz ce que vous en pensez et comment les améliorer.
avion-f16
Messages postés
19125
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2023
4 468
Modifié par avion-f16 le 20/03/2010 à 20:40
Modifié par avion-f16 le 20/03/2010 à 20:40
Les signe "%" est à échapper à l'aide d'un anti-slashe dans certaines requêtes.
PHP6 est encore très peu utilisé. À vrai dire, je ne connais que OVH qui le propose déjà (version compilée depuis les sources).
magic_quotes est une option qui applique automatiquement addslashes sur les variables GPC (GET, POST, Cookies). On pourrait dire "cool" mais le problème est que certains hébergeurs l'activent et pas d'autres : je m'arrange avec un petit script pour retirer son effet si cette option est activée. Cette option est obsolète depuis PHP 5.3 et supprimée dans PHP 6.
Si tu veux apprendre à utiliser PDO, il y a un tutoriel sur le Siteduzero.com. Quand tu auras compris le principe, il y a la doc sur php.net
Le type MIME n'a rien à voir avec l'extension, je ne vois pas pourquoi ça poserai problème. Le type MIME de cette page (qui est un fichier) est "text/html", et pourtant, regarde son url : on voit nul part .html
Pour les virus, si la faille provient du navigateur, tu ne sais rien y faire. Si c'est un autre navigateur qu'IE, la faille sera très vite corrigée.
Pour éviter la faille CSRF, la meilleure des solutions reste les jetons.
Ton ordinateur ne fait pas ce que tu veux ... mais ce que tu lui dis de faire.
PHP6 est encore très peu utilisé. À vrai dire, je ne connais que OVH qui le propose déjà (version compilée depuis les sources).
magic_quotes est une option qui applique automatiquement addslashes sur les variables GPC (GET, POST, Cookies). On pourrait dire "cool" mais le problème est que certains hébergeurs l'activent et pas d'autres : je m'arrange avec un petit script pour retirer son effet si cette option est activée. Cette option est obsolète depuis PHP 5.3 et supprimée dans PHP 6.
Si tu veux apprendre à utiliser PDO, il y a un tutoriel sur le Siteduzero.com. Quand tu auras compris le principe, il y a la doc sur php.net
Le type MIME n'a rien à voir avec l'extension, je ne vois pas pourquoi ça poserai problème. Le type MIME de cette page (qui est un fichier) est "text/html", et pourtant, regarde son url : on voit nul part .html
Pour les virus, si la faille provient du navigateur, tu ne sais rien y faire. Si c'est un autre navigateur qu'IE, la faille sera très vite corrigée.
Pour éviter la faille CSRF, la meilleure des solutions reste les jetons.
Ton ordinateur ne fait pas ce que tu veux ... mais ce que tu lui dis de faire.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
20 mars 2010 à 21:27
20 mars 2010 à 21:27
je sais bien ce qu'est le type MIME, ce que je voulais dire c'est que je ne sais pas comment le vérifier en php, c'est pour ça que je ne vérifie pour l'instant que l'extension.
Pour les virus, je me doute qu'il y faut une faille au niveau du navigateur pour qu'ils "passent", mais ce que je voudrais savoir c'est comment il est envoyé depuis une url http.
Pour les jetons, le but est justement de faire un script qui permet d'en intégrer presque automatiquement dans les formulaire. Et de voir si il n'y a pas moyen de faire une sorte de jeton pour la méthode GET.
Pour les virus, je me doute qu'il y faut une faille au niveau du navigateur pour qu'ils "passent", mais ce que je voudrais savoir c'est comment il est envoyé depuis une url http.
Pour les jetons, le but est justement de faire un script qui permet d'en intégrer presque automatiquement dans les formulaire. Et de voir si il n'y a pas moyen de faire une sorte de jeton pour la méthode GET.
avion-f16
Messages postés
19125
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2023
4 468
20 mars 2010 à 21:31
20 mars 2010 à 21:31
$_FILES['tonfichier']['type'] contient le MIME.
Si tu veux que ce soit une image, vérifie qu'il commence par "image/"
Si tu veux le restreinte au PNG (par exemple) : image/png
Si tu veux que ce soit une image, vérifie qu'il commence par "image/"
Si tu veux le restreinte au PNG (par exemple) : image/png
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
21 mars 2010 à 02:41
21 mars 2010 à 02:41
J'ai préparé une première mouture du code, que j'ai mis dans dans une archive zip à cette adresse : http://benjishkhan.u7n.org/securite.html
c'est composé de 2 classes une classe Secure pour les fonctions relative au injections sur les variables GET POST COOKIES et le changement d'id de session, et leur cryptage, il y a donc une classe Crypt que j'avais déjà plus ou moins préparé.
j'attends vos remarques et contributions
je vais maintenant voir pour faire une ou plusieurs fonction relative a l'upload que je placerai dans une classe File.
pour ce qui est des jetons est-ce qu'un suffit pour tout les formulaire d'une page ou est-ce mieux d'en faire un par formulaire ?
c'est composé de 2 classes une classe Secure pour les fonctions relative au injections sur les variables GET POST COOKIES et le changement d'id de session, et leur cryptage, il y a donc une classe Crypt que j'avais déjà plus ou moins préparé.
j'attends vos remarques et contributions
je vais maintenant voir pour faire une ou plusieurs fonction relative a l'upload que je placerai dans une classe File.
pour ce qui est des jetons est-ce qu'un suffit pour tout les formulaire d'une page ou est-ce mieux d'en faire un par formulaire ?
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
Modifié par Atropa le 21/03/2010 à 10:08
Modifié par Atropa le 21/03/2010 à 10:08
J'ai ajouté une classe File et une classe Regex à l'archive, la classe File contient des fonctions relative à l'upload et au download et la classe Rgex était une classe que j'avais déjà préparé dont je me suis servi pour la classe File
Je passe a PDO
Je passe a PDO
avion-f16
Messages postés
19125
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2023
4 468
21 mars 2010 à 11:58
21 mars 2010 à 11:58
Je mettrais un jeton par balise <form>.
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
22 mars 2010 à 18:18
22 mars 2010 à 18:18
J'ai commencé une classe Sql utilisant PDO mais j'ai un petit problème.
Comment faire des transaction avec des requêtes préparé ?
J'ai également commencé les jetons et je pense qu'ils seront compatibles get et post sans problème apparent...
Comment faire des transaction avec des requêtes préparé ?
J'ai également commencé les jetons et je pense qu'ils seront compatibles get et post sans problème apparent...
avion-f16
Messages postés
19125
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2023
4 468
22 mars 2010 à 18:41
22 mars 2010 à 18:41
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
Modifié par Atropa le 23/03/2010 à 10:41
Modifié par Atropa le 23/03/2010 à 10:41
une idée pour faire une clef de cryptage qui se détruirait si on essaie de la voir ?
Ce serait idéale mais je ne sais pas comment procéder
Que pensez-vous de ce jeton ?
on peut facilement l'intégrer quand n'importe quel variable ,GET par exemple, étant donné qu'il fait toujours 20 caractère le paramètre temporel si on en veut un n'importe est inclut dedans ce qui évite d'avoir à faire 2 variable de session pour chaque jeton.
Ce serait idéale mais je ne sais pas comment procéder
class Jeton {
public static function create($sessionVar) {
/*
Crée un jeton pour eviter les failles CSRF
Pour joindre le jeton a une variable de type String contenant un valeur mettre le jeton
au début de la variable et faire suivre directement la valeur
ex: $var = Jeton::create('jeton1').$valeur;
1 - $sessionVar : String -> Nom de la variable de session à associer au jeton
retourne le jeton (String)
*/
return $_SESSION[$sessionVar] = substr(md5(uniqid(mt_rand())),0,15).substr(time(),-5);
}
public static function verif($jeton,$sessionVar,$delay = false) {
/*
Vérifie le jeton et retourne la valeur de la variable si elle en contient une
1 - $jeton : String -> Variable contenant le jeton
2 - $sessionVar : String -> Nom de la variable de session associée au jeton
3 - $delay : Int -> délai de validité du jeton en seconde (si vaut false ou 0 pas de délai);
retourne false si le jeton est périmé sinon retourne true ou la valeur de la variable si une lui était associé
*/
$value = (strlen($jeton) > 20)? substr($jeton,20) : true;
$jeton = substr($jeton,0,20);
if($jeton != $_SESSION[$sessionVar]) return false;
if($delay) {
$time = (int)substr(time(),-5) - (int)substr($jeton,-5);
if($time < 0) $time += 100000;
if($time > $delay) return false;
}
return $value;
}
}
/*-- EXEMPLE BIDON--*/
session_start();
$j = Jeton::create('ses').'Salut tout le monde';
$v = Jeton::verif($j,'ses');
var_dump($v);
/*-- -- -- -- -- --*/
Que pensez-vous de ce jeton ?
on peut facilement l'intégrer quand n'importe quel variable ,GET par exemple, étant donné qu'il fait toujours 20 caractère le paramètre temporel si on en veut un n'importe est inclut dedans ce qui évite d'avoir à faire 2 variable de session pour chaque jeton.
avion-f16
Messages postés
19125
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2023
4 468
23 mars 2010 à 17:07
23 mars 2010 à 17:07
Atropa
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
272
Modifié par Atropa le 23/03/2010 à 21:24
Modifié par Atropa le 23/03/2010 à 21:24
ok, mais ca ne m'apprend pas grand chose ça.
à part que je n'aime pas ça façon de codé que je trouve illisible...
et surtout ca ne me dit en rien ce que vos mon code !
il le fait un peu comme moi au final sauf que la valeur aléatoire et sur 20 au lieu de 15 et qu'il utilise une seconde variable pour le paramètre temporel. de plus il ne peut mettre qu'un jeton par page et non par requête !
Ça m'a aussi montré une erreur flagrante dans mon code ! si il n'y a pas de jeton dans la session ça plante !
je met le code corrigé sans les commentaires (qui sont les mêmes qu'au dessus) pour gagner de la place
J'aimerai avoir un avis sur la "justesse" de ce code, comment l'optimiser ou autres...
mais c'est dommage j'espérai qu'il y aurait une vrai discussion voir un débat autour de la sécurité et qu'il en sortirai quelque chose de collectif.
à part que je n'aime pas ça façon de codé que je trouve illisible...
et surtout ca ne me dit en rien ce que vos mon code !
il le fait un peu comme moi au final sauf que la valeur aléatoire et sur 20 au lieu de 15 et qu'il utilise une seconde variable pour le paramètre temporel. de plus il ne peut mettre qu'un jeton par page et non par requête !
Ça m'a aussi montré une erreur flagrante dans mon code ! si il n'y a pas de jeton dans la session ça plante !
je met le code corrigé sans les commentaires (qui sont les mêmes qu'au dessus) pour gagner de la place
class Jeton {
public static function create($sessionVar) {
return $_SESSION[$sessionVar] = substr(md5(uniqid(mt_rand())),0,15).substr(time(),-5);
}
public static function verif($jeton,$sessionVar,$delay = false) {
if(empty($jeton) || empty($_SESSION[$sessionVar])) return false;
$value = (strlen($jeton) > 20)? substr($jeton,20) : true;
$jeton = substr($jeton,0,20);
if($jeton != $_SESSION[$sessionVar]) return false;
if($delay) {
$time = (int)substr(time(),-5) - (int)substr($jeton,-5);
if($time < 0) $time += 100000;
if($time > $delay) return false;
}
return $value;
}
}
J'aimerai avoir un avis sur la "justesse" de ce code, comment l'optimiser ou autres...
mais c'est dommage j'espérai qu'il y aurait une vrai discussion voir un débat autour de la sécurité et qu'il en sortirai quelque chose de collectif.