un "notice" à effacer

Mammouth du PHP | 985 Messages

07 mars 2010, 18:28

Bien tu simplifies, ne te fixe pas sur 50 codes différents, base toi sur le tiens, et ajoute simplement de nouvelles vérifications.
(a part les bouts de codes sur php.net qui sont censés être fiable)
Exemple:
Comme tu avais fais plus haut pour la taille du fichier ajouté à la suite du isset().
Au départ, tu as juste a en ajouter d'autres, vérification de l'extension puis ce que tu veux...

C'est bien plus fun de faire son propre code =)

Ensuite quand tout fonctionne, eh bien au fur et à mesure du temps, tu améliores, tu simplifies, tu optimises...
Enfin c'est comme ça que je fais moi, car de toute façon, on apprend tous les jours, et à chaque fois que tu penses que ton code est quasiment parfais, et bien un nouvel élément te prouve le contraire...

Il est donc bien plus simple de modifier son propre code que celui d'un autre car on le maîtrise toujours beaucoup mieux...
Et bien moins frustrant de corriger ses propres erreurs que celles des autres...

PS:
Pour les caractères du nom des fichiers, il y a pleins de possibilités.
Mais je te conseille vivement ce tuto:
http://lumadis.be/regex/tuto_pcre.php
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 453 Messages

07 mars 2010, 19:18

re,
Merci pour le lien
de rien ^^
N'oublie pas de vérifier la taille des images en php, elles ne sont pas censées être lourdes.
exact, mais il manque une chose essentielle pour parer à une attaque de trolls sauvages des steppes arides. Admettons que tu conçois une application web où tu donnes la possibilité à l'utilisateur lambda d'uploader ses belles photos de vacances afin qu'il expose ses œuvres par l'intermédiaire de ton application. À priori, ton script ou le mien est suffisant. À postériori, ce n'est pas du tout bon.

En effet, admettons que ton espace web alloué est de 100 mo et en 24h tu t'aperçois que ton espace est full (+ de 86 mo uploader). Pourquoi ? Parce qu'un alien t'a injecté des gif/jpeg/png de 1 ko (aux noms exotiques tels que : sef35te.gif ou dupcbsy59.png ou ...) toutes les secondes et te bloque ton serveur. Et là, ça devient la cata. Tu ne peux malheureusement pas faire la différence entre les bons fichiers et les mauvais envoyés le jour X de l'attaque du troll.

Il y a pas mal de techniques pour éviter ce genre de problème :

* Le petit Captcha qui va bien (Je préconise un captcha textuel afin de garder une Accessibilité optimale. exemple : combien font 7 + 2 ? 7 + 2 = réponse utilisateur). Cette parade peut s'appliquer dans la plupart des cas.
* « contre attaque brute force » avec retour à l'envoyeur de ses méfaits. À noter qu'une attaque brute force vise plutôt à cracker/hacker le pass d'un site.

Le principe reste le même. Lorsque l'utilisateur arrive sur la page, tu récupères son ip ($_SERVER["REMOTE_ADDR"]) et tu figes la date d'arrivée sur la page (time()). À noter qu'une ip est très volatile. Il va falloir pister le troll potentiel. Par exemple, si ce dernier essaie au bout de trois fois d'envoyer un fichier inférieur à 10 ko dans une période de time + 5, tu lui injectes un cookie avec un nom bien anodin (ex : setcookie("google_session","valeur anodine tel qu'une suite de caractères en sha1", time()+3600*24*30*365, "/")) et une valeur qui lorsque tu testes ce cookie, tu invites le troll à te contacter. Bien sûr, il se peut qu'une personne bien intentionné tombe sur ta contre mesure. Alors tu lui envoies un courriel qui l'invite à ce rendre sur un lien qui détruit le cookie ou qu'il le passe par une valeur différente de ta contre mesure.

Pour finir, un formulaire fichier est à prendre avec beaucoup de vigilance.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.
+100...

Aujourd'hui, je ne suis pas dans la plus grande forme. J'espère que j'ai été assez explicite.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Mammouth du PHP | 985 Messages

07 mars 2010, 19:28

Exact :wink:
Un bon captcha est toujours bien pratique dans un formulaire.

Tu peux aussi enregistrer dans une bd l'ip de la personne qui upload, ensuite tu incrémentes à chaque nouvel upload, puis au dessus d'un certain nombres en un temps déterminé -> tu refuses...

Tu peux aussi vérifier l'espace disponible restant dans le dossier upload...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 453 Messages

07 mars 2010, 19:30

Hello Dr@ke,
Bien tu simplifies, ne te fixe pas sur 50 codes différents, base toi sur le tiens, et ajoute simplement de nouvelles vérifications.
Dans l'absolue, je suis tout à fait de ton avis. Cependant, il est tout à fait intéressant de regarder/lire des techniques adjacentes. Là, dans ce cas là, la curiosité est bon signe, n'est ce pas ?

exemple :
$monTableau = array("orange","citron","banane");

echo implode(" - ",$monTableau);

// ou 
for($i = 0,$nb = count($monTableau) ; $i < $nb ; $i++)
	echo $monTableau[$i]." - ";

// ou etc.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Mammouth du PHP | 985 Messages

07 mars 2010, 20:09

Je suis d'accord aussi :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 250 Messages

07 mars 2010, 20:17

Oui c'est sûr, il faut prévoir plein de protection notamment avec les bots par exemple. Mais avant trop me fixer sur la sécurité faudrait que je sache bien coder avant tout !

Je viens de tomber sur un os :
<?php

if( !empty($_FILES))
{
define('TAILLE_MAX',100000);
if ($_FILES['fich']['size'][0] >= TAILLE_MAX)
{
     echo 'Le fichier est trop gros...';exit();
}    
$extensions = array('txt','png', 'gif', 'jpg', 'jpeg');
$extension = end(explode('.', &$_FILES['fich']['name'][0]));  (ligne 44)
if (in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
    echo 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';exit();
}    
Bon le code n'est pas joli, mais moi j'expérimente, c'est tout ce qui m'intéresse. Le tout c'est que ça marche et que je comprenne, ce qui est moins évident.

j'ai ce message: Strict Standards: Only variables should be passed by reference in C:\UwAmp\www\Php\9formulaires3.php on line 44

"Seulement les variables doivent être passées par référence" #-o I don't understand it :roll:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 985 Messages

07 mars 2010, 20:25

&$_FILES ?
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 250 Messages

07 mars 2010, 20:38

&$_FILES ?
j'avais déjà essayer ça, mais non :

Deprecated: Call-time pass-by-reference has been deprecated in C:\UwAmp\www\Php\9formulaires3.php on line 44
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 985 Messages

07 mars 2010, 20:41

Pas ça que je dis :wink:
Pourquoi tu mets un & avant la variable?

http://www.php.net/manual/fr/language.r ... s.pass.php

Sinon:
if (in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
    echo 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';exit();
} 
Ce n'est pas correct car cela fait l'effet inverse, car tu as oublié de mettre un ! (négatif) avant in_array()
Donc:
if (!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
    echo 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';exit();
} 
in_array() Retourne TRUE si un élément est trouvé dans le tableau, FALSE sinon
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 250 Messages

07 mars 2010, 22:29

Je ne saisie pas très bien ces passages par références ou non :roll:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 985 Messages

07 mars 2010, 22:54

Bien en gros, il faut enlever le caractère & avant ta variable car cela à une signification bien particulière pour php.
c'est tout :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 453 Messages

08 mars 2010, 05:21

Bien en gros, il faut enlever le caractère & avant ta variable car cela à une signification bien particulière pour php.
c'est tout :wink:
exact

pour faire simple :
<?php
    $a = 1;
    $b = &$a;
    
    $a = 3;
    
    echo $b;
    
?>
;)

sinon il y a un autre truc démentielle : la variable variable :shock:
<?php
    $affichage = "cheuveux";
    
    $cheuveux = "blond";
    $aspect = "gros";
    $signeDistinctif = "lunettes";
    
    
    echo ${$affichage}; 
?>
C'est intéressant quand il y a beaucoup de if sur if et elseif et encore des elseif avec 500 données à contrôler. ;)

@ plus
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 250 Messages

08 mars 2010, 11:02

Que ce soit comme écrit en au-dessus ou :
<?php
    $a = 1;
    $b = $a;
   
    $a = 3;
   
    echo $b;
   
?>
C'est égale à 3. Donc je ne vois pas la différence. Ensuite, que je mette une éperluette ou pas à mon erreur, il me dit toujours la même chose. Je comprends pas trop le rapport #-o
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

08 mars 2010, 11:48

le & c'est la référence
http://www.php.net/manual/fr/language.references.php

exemple :
// sans référence

$a = 3;

function test($a)
{
   $a = 5;
   echo $a //5
}

echo $a //3

// avec référence

$a = 3;

function test(&$a)
{
   $a = 5;
   echo $a //5
}

echo $a //5

Eléphant du PHP | 453 Messages

08 mars 2010, 13:41

Et l'eau,
C'est égale à 3. Donc je ne vois pas la différence. Ensuite, que je mette une éperluette ou pas à mon erreur, il me dit toujours la même chose. Je comprends pas trop le rapport #-o
Rooo, tu es arrivée à me faire douter. Pas glop.

fichier1.php
<?php
    $a = 1;
    $b = &$a;
   
    $a = 3;
   
    echo $b;
   
?>
fichier2.php
<?php
    $a = 1;
    $b = $a;
   
    $a = 3;
   
    echo $b; 
   
?>
Tu n'auras pas le même résultat :
fichier 1 : b = 3
fichier 2 : b = 1 puisque B est déclarée à la ligne 1 et est une variable simple non pas une référence.

dans le fichier 1 : si A est égale à une valeur partout dans le script, b aura la même référence (valeur). Ils vont travailler de concert. Tu n'as plus une variable avec une valeur, mais deux variables avec la même valeur !
<?php
	$a = 1;
	$b = &$a;
   
	$a = 3;
	$a = 10;
	$a = 22 + 10; //32
	$a += $a; // 64
   
	echo $b; // 64 puisque B est la référence de a 

?>
<?php
	$a = 1;
	$b = &$a;
   
	$a = 3;
	$a = 10;
	$a = 22 + 10; //32
	$a += $a; // 64
	
	$b++;  
	echo $b; // 65 
	echo $a; // 65

?>
Stealth : avoue que ton code est plutôt chaud à lire aux premiers abords. Enfin pour moi, quand je vois ce genre de chose, j'ai les cheveux qui se dressent à la tokio hotel ou à la Désirelless :lol: (the cure aussi c'est pas mal). Cependant ton exemple est bon aussi. Mais là on peut confondre avec les variables locales d'une fonction. ^^

Au passage, le sujet déborde. Il aurait fallu peut être ouvrir un sujet approprié. Là, on est un peu loin du notice de départ.

bon code ^^
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia