Un scanner de ports

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 511 fois - Téléchargée 18 fois

Contenu du snippet

Ce code n'est pas parfait, mais il presente deja quelques fonctionalites interessantes.
On trouve nombre de sources de ce genre sur ce site, et peu sont correctement codes, ici, vous avez une version qui tourne parfaitement sous php5.

dans l'ideal :

on separe html et php
on fait un cache
on ajoute des commentaires, mais bon... faut pas exagerer, c'est pas une source extremement complexe, pour ceux qui ne comprennent pas une fonction, utilisez le manuel php.net

Source / Exemple :


<html>
<head>
<style type="text/css">
.ferme{ color:#0f0; }
.ouvert{ color:#00f; }
.error{ color:#f00; }
.deroule{ border:1px solid #000; }
p{ margin:0px; padding:0px;
}
</style>
</head>
<body>
<?php
function getErrno($i, $ip, $timeout=1){
	$f=@fsockopen($ip, $i, $errno, $errstr,$timeout);
	if ($errno==0){
		fclose($f);
		return true;
	}else if ($errno==111)
		return false;
	else
		throw new Exception('cannot connect : '.$errstr);
}
if (isset($_GET['ip']) && isset($_GET['start']) && isset($_GET['end'])){
	$ip=$_GET['ip'];
	$start=$_GET['start'];
	$end=$_GET['end'];
	$fermes=0;
	if (!long2ip(ip2long($ip))==$ip || !is_numeric($start) || !is_numeric($end))
		echo 'mauvais formats';
	else if ($start >=65536 || $end >=65536 || $start <=0 || $end < $start )
		echo 'La valeur du Port doit etre comprise entre 1 et 65535, le premier doit etre inferieur au second';
	else{
		echo '<div class="deroule">';
		try{
			for ($i=$start; $i<=$end; $i++){
				if (getErrno($i, $ip))
					echo '<p class="ouvert">Port : '.$i.' ouvert </p>';
				else{
					echo '<p class="ferme">Port :'.$i.' Fermé </p>';
					$fermes++;
				}
			}
		}catch (Exception $e){
			echo '<p class="error">'.$e->getMessage().'</p>';
			$end=$i-1;
		}
		echo '</div><p>'.$fermes.' Ports fermés & '.($end-$start-$fermes+1).' Ports ouvert</p>';
	}
}
echo '<form action="?">
	adresse ip : <input type="text" name="ip" value="';
if (isset($_GET['ip']))
	echo $_GET['ip'];
else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
	echo $_SERVER['HTTP_X_FORWARDED_FOR'];
else if (isset($_SERVER['HTTP_CLIENT_IP']))
	echo $_SERVER['HTTP_CLIENT_IP'];
else if (isset($_SERVER['REMOTE_ADDR']))
	echo $_SERVER['REMOTE_ADDR'];
echo '"/>
<br />
PORT de:<input type=text name="start" value="';
if (isset($_GET['start'])) echo $_GET['start'];
echo '"/>
au port :<input type=text name="end" value="';
if (isset($_GET['end'])) echo $_GET['end'];
echo '"/>
<input type=submit value="Scanner">
</form>';
?>
</body>
</head>
</html>

A voir également

Ajouter un commentaire

Commentaires

Messages postés
19
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 janvier 2011

Pour iseult, comme 99% des programmeurs, une tete de con assortie d'un ego surdimentionné, ça change pas
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
ma facon de tester l'ip, c'est kankrelune qui avait demande ici meme de lui expliquer un code en C sur ces fonctions, ca avait fait un peu discuter... la, ca permet si tu veux, de tester vraiment le fait que ton ip ne contienne que des choses entre 0 et 255...


Pour les types de variables, je suis... disons... contre cette facon de coder : ta variable en C, tu la declares au debut avec son type, ensuite, elle garde ce type, et donc si t'as un probleme, tu vas voir en haut de ta fonction, ou la ou ta variable est declaree... la, c'est different en php, t'as pas un typage aussi soutenu, et on s'en fou au fond... si tu fais une fonction de plus de 50 lignes, alors elle devient assez illisible, ou fait trop de choses seule, (neurocyfer, un operateur de #programmation, salon officiel de codes-sources, appelle ca "fonction ou classes divine" car ca fait tout seul, sans rien demander aux autres, et surtout, on ne sait pas comment ca peut bien marcher...), alors pour de petits morceaux de codes, savoir quel type a une variable... au pire, un echo gettype($var); en debug...
Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009

Salut all ;-)
Belle ambiance sur ce thread, sympa ^^

Bon j'avais juste quelques remarques, rien de bien mechant :p

Comme me l'avait fait remarquer un jour Malalam, il serait interessant que tu essayes de prefixer tes variables par leurs types ou au moins que tu leurs donnes des noms plus explicite.
Je ne doute pas que le code soit facile a comprendre mais des var qui s'appellent $start ou $end gagnerait (a mon avis) a s'appeller $iPortStart ou $iStartPort ou un truc du genre. C'est du chipotage, je ne met pas en doute tes qualites de developpeur pour autant ;-)

Par contre, j'aurais vu une petite optimisation lors de tes tests avec ces fameuses variables $start et $end. Plutot que de les tester 2 fois (is_numeric() et ensuite if $start >= 655535 [etc]), pourquoi ne pas raccourcir directement avec intval() ?

if (isset($_GET['ip']) && isset($_GET['start']) && isset($_GET['end']))
{
$ip = intval($_GET['ip']);
$start = intval($_GET['start']);
$end = intval($_GET['end']);
$fermes=0;

if ( !long2ip(ip2long($ip))==$ip || $start >=65536 || $end >=65536 || $start <=0 || $end < $start )
echo 'Il y a eu une erreur : veuillez verifier vos parametres (causes possibles : mauvais formats ou valeurs incorrects)';

// ...
}

C'est sur qu'en reflechissant bien, on perd la gestion complete des erreurs et on doit afficher un message generique mais cela me parait mieux que de tester 2 fois les memes variables. Question de gout j'imagine ^^

Je suis etonne du test que tu effectues pour l'adresse ip. Convertir l'ip en format litterale puis la convertir en format numerique, c'est plutot interessant. J'avais l'habitude de tester avec une regex mais je dois dire que cette facon de faire est marrante, je crois que je vais la garder ;-)

Dernier truc, bravo pour la gestion des exceptions. Pas indispensables si on prend bien en compte chaque retour de fonction mais interesant dans sa mise en oeuvre.

Je te met 8 car tu as un peu triche avec fsockopen(), j'aurais prefere voir une source avec socket() mais l'idee est la et le code est plutot solide.

@++
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Ca c'est très malin, Coucou, très.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
d'ailleur si tu pouvais moderer le mot "conneries" ...
Afficher les 74 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.