Aller au contenu

Sécurité page php


super_baloo8

Sujets conseillés

Bonjour à tous, je viens soumettre cette page php à vos avis d'expert concernant la sécurité de cette page, je voudrais savoir si quelqu'un pourrais accédé au donnée presente dans cette page.

Je vous soumet cette page en test, pour l'instant il n'y a rien d'important, mais par la suite il risque d'y avoir des pseudo et mot de passe pour gérer plusieurs partie du site ainsi que l'hebergement.

Lien de la page à violer

Merci pour vos réponses,

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Pardon mais si dans ta source, tu as "If $mot_de_passe = "123344"", je ne pense pas qu'il soit possible d'y arriver.

Par contre, tu ne pourras pas tout faire sur une seule page.... La plus part des hacks ne sont pas dû au 'franchiment' du login mais à l'attaque des pages annexes ;)

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Nikel donc la page à accéder étant donc compris dans cette même page il est donc impossible à franchir. Ce que j'entend pour la partie administration du site auquel est destinée cette page, est juste une page ou figure login, et mot de passe sur plusieurs site. Merci pour tes commentaires Portekoi.

Je considère donc ce post fermer, à part si quelqu'un arrive à forcer cette méthode de protection.

_AT_bientôt

Lien vers le commentaire
Partager sur d’autres sites

Tu devrais définir la zone de saisie comme <input type="password"> et non comme <input type="text"> parce que cela masquerait le mot de passe su quelqu'un regarde la page lors du login.

Sinon, tant que Php est interprété, pas de risque de passer à travers si le mot de passe n'est pas trivial à trouver.

Dan

Lien vers le commentaire
Partager sur d’autres sites

Salut,

méfie-toi comme de la peste des mots de passe stocké dans un code php accessible depuis l'exterieur du serveur.

Comme la dit Dan (que je salut au passage), si PHP n'interprete plus les scripts (pour une raison ou pour une autre), ton mot de passe serait visible en clair;

Il existe cependant plusieurs solutions :

- interdite l'accès à ce fichier depuis l'exterieur du serveur (deny from all)

- mettre le fichier hors de la racine du site

- crypter le contenu du fichier (et/ou du mot de passe)

- encoder ton document.

- ...

C'est un détail de "parano", mais un détail de trop...

@+ ^_^

Lien vers le commentaire
Partager sur d’autres sites

Site tu es vraiment parano, vérifie que les mots de passe que tu utilises ne sont pas facilement cassables avec des attaques par dico.

Pour la phase d'identification, prévois un système qui bloque le compte ou l'ip après X tentatives infructueuses d'identification... (evite les attaques par dico ou brut force.)

De toute facon, il est toujours possible avec un minimum de volonté de récuperer un mot de passe d'un site qui n'utilise pas un protocole sécurisé (ex: https) car le mot de passe navigue en clair sur le réseau... Donc si tu veux avoir un minimum de sécurité, essaye d'avoir l'identification avec un protocole sécurisé. Mais là nous sommes dans l'univers des paranos et des données sensibles...

Lien vers le commentaire
Partager sur d’autres sites

Pour la phase d'identification, prévois un système qui bloque le compte ou l'ip après X tentatives infructueuses d'identification... (evite les attaques par dico ou brut force.)

<{POST_SNAPBACK}>

Oui c'est relatif...je ne compte plus le nombre d'outils utilisant une rotation de proxy pour effectuer les attaques brute force ou par dico ... mais bon il ne faut pas virer à la paranoia...si le système n'est pas destiné à être utilisé par d'autre que toi, tu peux empêcher les tentatives pendant un certain temps...ou même jusqu'à que tu déverouille le système toi même...

Une chose primordiale est de ne passer par les cookies que si c'est vraiement nécessaire et toujours redemander le mot de passe pour les action à risque (changement de mot de passe, ...). Bien sûr pas de mot de passe en claire ni en md5() dans un cookie, à la rigeur un md5() avec du sel ..mais je préféerais un chaîne aléatoire qui change à chaque login realisé avec succès...

Si ça devient du charabia ne t'inquiète pas...ce sont des mesures de sécurité qui sont efficaces mais pas indispensable si tu ne tiens pas à avoir quelque chose de quasiment inviolable (cookie stealing, ...). J'ai lontemps utilisé des cookie avec un mot de passe chiffré en MD5 uniquement dans un cookie et je n'ai jamais eu de problème, malgré que le domaine du site se prêtait au petit plaisantains... :P Mais j'ai peut-être eu du bol...

Concernant ton formulaire je ne tenterais pas une attaque brute force ou par dico car je n'ai aucune idée de la longueur de ton mot de passe ni de sa nature (lettres, chiffres, casse, ...) mais avec du temps et beaucoup de patience si tu n'a pas plus de sécurité que j'en ai vu c'est faisable et loin d'être "incassable" (d'ailleur rien ne l'est à ma connaissance, c'est toujours une question de temps, motivation et argent...)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour toutes vos aides !

Je comprend bien que rien n'est incassable, mais bon vu ce qu'il y aura de stocker dessus qui n'est pas d'un super hyper méga importance, je pense que ce code PHP suffira, le mot de passe pour la page de test que je vous ai soumise étais :

06#80.40#80.89#titou

donc je pense pas évident à trouver mais pas le plus dur. Pour le vrai mot de passe je pense a quelque chose comme 0#lKe8_I#J##75jiL pourrais bloquer pas mal de "robot". Corriger moi si je me trompe.

Par contre une chose m'inquiete un peu. Quand vous disez que par exemple il y est un probleme de serveur, et que la page ne sois pas interprété. Rassurez moi (je deviens aussi parano lol) d'un ca ne doit pas arriver souvent, et de deux, il faut être sur cette page à ce moment la.

De plus je pense que je n'ais pas besoin de HTTPS ou autre systeme de codage puisque les "données" à protéger ne sont pas d'énorme importance, ce sont juste des pseudo et pass pour le serveur, et le livre d'or. De plus qui voudrais (pardon pour l'expression) s'emmerder à trouver ce qui se trouve derriere vu que ce n'est qu'un petit site de rien en fait lol.

Comment faire pour coder en php =>

Pour la phase d'identification, prévois un système qui bloque le compte ou l'ip après X tentatives infructueuses d'identification... (evite les attaques par dico ou brut force.)
??

Merci de vos réponse, déja un énorme merci d'avoir passé du temps a me répondre.

Lien vers le commentaire
Partager sur d’autres sites

Il faut récupérer l'adresse IP de ton visiteurs ... j'utilise ceci :

 /**
* Determin if an IP address is valid or not
*
* @date 2005-04-02
* @param string $ip IP address to test
* @return bool true = valid, false= not valid
*/
function is_ip_address($ip) {
if(is_string($ip) && ereg('^([0-9]{1,3})\.([0-9]{1,3})\.' .
'([0-9]{1,3})\.([0-9]{1,3})$',
$ip, $part)) {
if($part[1] <= 255 && $part[2] <= 255 &&
$part[3] <= 255 && $part[4] <= 255)
return true;
}
return false;
}

/**
* Determin if an IP address is valid on INTERNET or not
*
* @date 2005-04-02
* @param string $ip IP address to test
* @return bool true = valid, false= not valid
*/
function valid_internet_ip($ip) {
if(!empty($ip) && ip2long($ip)!=-1)
{
$reserved_ip = array (
array('0.0.0.0','2.255.255.255'),
array('10.0.0.0','10.255.255.255'),
array('127.0.0.0','127.255.255.255'),
array('169.254.0.0','169.254.255.255'),
array('172.16.0.0','172.31.255.255'),
array('192.0.2.0','192.0.2.255'),
array('192.168.0.0','192.168.255.255'),
array('255.255.255.0','255.255.255.255')
);

foreach ($reserved_ip as $r)
{
$min = ip2long($r[0]);
$max = ip2long($r[1]);
if((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
}
return true;
}
else return false;
}

/**
* Determin if an IP address is banned in the database
*
* @date 2005-04-02
* @param string $ip IP address to test
* @return bool true = banned, false= not banned
*/
function is_ip_banned($ip) {
$longip = ip2long($ip);
if($longip != -1) {
$result = mysql_query("SELECT * FROM failedauth WHERE (".$longip." BETWEEN First_IP AND Last_IP) AND banned");
return mysql_num_rows($result) != 0;
} else {
return true;
}
}
/**
* Find the IP address of the user
*
* @date 2005-04-02
* @return string IP address
*/
function get_ip() {
if(valid_internet_ip($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} elseif($_SERVER['HTTP_X_FORWARDED_FOR']!="") {
$forwarded=str_replace(",","",$_SERVER['HTTP_X_FORWARDED_FOR']);
$forwarded_array=split(" ",$forwarded);
foreach($forwarded_array as $value) {
if(valid_internet_ip($value)) {
return $value;
}
}
}
return $_SERVER['REMOTE_ADDR'];
}

/**
* Determin if a string is a FQDN
*
* @date 2005-04-02
* @param string $host Host to test
* bool $force_dot Force do in the address
* @return bool true = valid, false= not valid
*/
function check_fqdn($host, $force_dot=false) {
if(!ereg("^\[?[0-9\.]+\]?$", $host)) { // Check if domain is IP
$fqdn = explode(".", $host);
if(count($fqdn) < 2) {
return false;
}
for ($i = 0; $i < count($domain_array); $i++) {
if(!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $fqdn[$i])) {
return false;
}
}
return true;
}
return false;
}

/**
* Find the hostname of the user from his IP address
*
* @date 2005-04-02
* @param string $ip The IP address to lookup
* @return string Hostname of the user or IP if failed to get it
*/
function get_host($ip) {
if(preg_match("|win|i",PHP_OS)) {
$runext = exec("nslookup -timeout=2 -retry=1 $ip", $output, $error); // Now works on windows
if(!$error){
$resolved = split(":",$output[3]);
if(check_fqdn($resolved[1])) {
return trim($resolved[1]);
}
}
} else {
$output = `host -W 2 $ip`;
if(ereg(".*pointer ([A-Za-z0-9.-]+)\..*",$output,$regs)) {
return $regs[1];
}
}
return $ip;
}

Note que la fonction "is_ip_banned", correspond à une implémentation particulière et que tu devra la canger pour ton cas. Dans mon cas la table "failedauth" contient deux champs afin de pouvoir spécifier une plage (range) d'adresse IP. Je te conceille de garder cette implémentation, elle peut te servir si par exemple tu veux vérouiller une plage d'addresse manuellement...

Note également que les adresses IP sont converties en entier long avec la fonction ip2long(), c'est la méthode la plus logique pour ce cas... mais de tout façon je me voyais mal stocker les adresse IP sous forme de chaîne de caractères ce n'est pas cohérent...

Le principe est le suivant, tu stockes une ligne dès la première tentative ayant échoué, avec un compteur de tentative pour cette IP et un champ "banned". A chaque tentative erronée, tu vérifies avant d'ajouter cette enregistrement qu'il n'y en ait pas déjà un pour l'adresse IP de l'utilisateur. Si c'est le cas tu incérmentes son compteur, ce pour chaque tentative erronnée jusqu'à ce que la limite que tu fixe soit atteinte ou que l'adresse IP en question ait réussit une tentative. Une fois la limite atteinte tu définit le champ "banned" à "TRUE" (par défaut il doit être à false).

Ensuite lors de l'acès au formulaire d'identification, il faut vérifier l'adresse IP de l'utilisateur avant d'afficher le formulaire.

Voilà...à toi de coder un peu ;)

Toutefois soit conscient du fait que n'importe quel pirate un tant soit peu "compétant" se munit d'une liste rotative de proxy pour attaquer un site, non seulement pour se protéger (généralement des proxy non_transparents) et également pour ne pas déclancher ce genre de système de sécurité... (moi aussi je m'habillerais en noir pour faire un cambriolage de nuit :rolleyes: )

Modifié par TheRec
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...