Voici un script anti-hack pour site

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Voici un script anti-hack pour site

par floriant » 04 nov. 2007, 20:40

Merci naholyr pour ta contribution ! :wink:

par naholyr » 04 nov. 2007, 18:10

Je vais zapper le débat, mais je tenais quand-même à dire que perso je ne connais pas la doc par cœur. Je sais pas vous mais à chaque fois que j'utilise in_array(), array_walk(), array_map(), strpos(), etc… je vais vérifier l'ordre des paramètres (merci l'homogénéité de PHP…).

Cela dit, et j'espère que ça ne fera pas débat parce que ça c'est vraiment la base de la sécurité (comprendre l'ultra-minimum) si vous n'utilisez pas PDO et aucun système d'abstraction, il faut toujours au moins passer par un système permettant de protéger vos requêtes.

Voici la fonction que je file à mes collègues qui travaillent un peu à l'arrache (php4, pas d'abstraction, bref du site jetable) histoire de sécuriser un minimum les sites. C'est un peu merdique mais ça a le mérite de marcher et de ne pas nécessiter un manuel d'utilisation de 12 pages.
/**
 * @var mixed $var
 * @return string Conversion de $var en expression utilisable dans une requête
 **/
function var2sql($var) {
  if (is_string($var)) {
    return '"' . mysql_real_escape_string($var) . '"';
  } elseif (is_numeric($var)) {
    return $var;
  } elseif (is_array($var)) {
    return '(' . implode(',', array_map('var2sql', $var)) . ')';
  } else {
    return strval($var);
  }
}

/**
 * Retourne le résultat d'une requête
 * @var string $sql Requête
 * @var array $params Tableau de paramètres à insérer dans la requête, les mots-clé
 * #{clé} seront remplacé par $params[clé] protégé.
 * @var boolean $expand_select Si la requête est un SELECT et que ce paramètre
 * est à true, alors la fonction renverra le tableau des résultats (tableaux associatifs)
 * @return resource|array Résultat de la requête
 **/
function query($sql, $params, $expand_select = true) {
  foreach ($params as $key => $param) {
    $sql = str_replace('#{' . $key '}', var2sql($param)
  }
  $result = mysql_query($sql);
  if ($expand_select && strtoupper(substr(ltrim($sql), 0, 6)) == 'SELECT') {
    $items = array();
    while ($item = mysql_fetch_assoc($result)) {
      $items[] = $item;
    }
    return $items;
  } else {
    return $result;
  }
}
Cela permet non seulement d'avoir un peu de sérénité (tout ce qui est passé dans $params est automatiquement échappé au besoin) et aussi de simplifier grandement l'écriture des requêtes (les tableaux sont automatiquement transformés, les chaines ont leurs guillemets ajoutés).

Exemple :
// Trouver un utilisateur sur certains critères
$params = array(
  'ids' => array(1, 2, 3), // Son ID est parmi ceux-là
  'nom' => 'Bob%', // Nom d'utilisateur commence par Bob
  'age_min' = 13, // Age minimum
);

$result = query('SELECT * FROM users WHERE nom LIKE #{nom} AND id IN #{ids} AND age >= #{age_min}', $params);

par zeus » 04 nov. 2007, 12:48

Mais de rien.

Sauf que tu as cru voir une montagne là où il n'y avait qu'une bosse puisque le terme de "PDO" a été cité à plusieurs reprise ;)

par floriant » 04 nov. 2007, 12:41

Je demandais de la documentation pertinente choisie par un connaisseur d'où ma question car c'est bien de taper sur google mais il te sort 3 000 000 de pages.

Merci zeus. :wink:

par Hywan » 04 nov. 2007, 12:14

Tu as raison Zeus :). Je ne voulais pas être méchant, même si ça a été le ressenti de mon message.

Edit pour Fab : hehe oui je sais, c'était juste pour rire. Même si PDO reste très agréable, j'aurais du mal à m'en passer dans mes travaux :).

par fab » 04 nov. 2007, 12:13

Tout le monde devrait utiliser PDO (moi, créer une polémique ? :o).
PDO est vraiment plus sympa quand on travaille sur différentes bases. Après, pour de petits sites, ce n'est pas très important je pense. C'est plus utiliser un bazooka pour tuer une mouche dans un pot de confiture.
Chacun ses besoins et ses spécifications on n'a pas forcément le choix d'utiliser PDO hein :p

par @rthur » 04 nov. 2007, 02:34

on commence TOUJOURS par lire la documentation. Comment tu crois que font toutes les personnes qui vous aident sur ce forum ?
Ma signature résume assez bien ce que je pense ;-)
Bah même pas vrai d'abord :-*

On sait tout on connait tout on est "tout" :mrgreen:
Tout est dit! 8-)

par Truc » 04 nov. 2007, 01:54

Comment tu crois que font toutes les personnes qui vous aident sur ce forum ? Bien sûr, on connaît la documentation par coeur ;-)
Bah même pas vrai d'abord :-*

On sait tout on connait tout on est "tout" :mrgreen:

par zeus » 04 nov. 2007, 01:35

Je pense que j'ai indiqué la bonne marche à suivre à Floriant, ce n'est pas la peine d'en remettre une couche.
Nous ne sommes pas là pour démonter du débutant. J'ai moi même hésité avant de poster mon message parce qu'il était plus que taquin, j'attends donc des autres membres (j'entend non-modérateur) qu'il n'en rajoutent pas une couche. Merci ;)

par Hywan » 04 nov. 2007, 01:25

@Floriant : je serais toi, je me cacherais là. Quand on programme — et c'est valable pour n'importe quel langage — on commence TOUJOURS par lire la documentation. Comment tu crois que font toutes les personnes qui vous aident sur ce forum ? Bien sûr, on connaît la documentation par coeur ;-) (j'ai cassé un mythe là ?).
Je trouve que Zeus est bien gentil de t'apprendre à utiliser Google, nan ?
Enfin bref, fais gaffe avant d'écrire des bêtises comme ça :P.

par zeus » 03 nov. 2007, 20:15

par floriant » 03 nov. 2007, 20:06

C'est bien beau de dire qu'il faut utiliser PDO pour bloquer les injections SQL mais tout le monde ne connait pas PDO et comment l'utiliser alors si vous avez un lien pour expliquer comment l'installer ça serait bien pour les débutants. :wink:

par Hywan » 03 nov. 2007, 19:46

Tout le monde devrait utiliser PDO (moi, créer une polémique ? :o).
PDO est vraiment plus sympa quand on travaille sur différentes bases. Après, pour de petits sites, ce n'est pas très important je pense. C'est plus utiliser un bazooka pour tuer une mouche dans un pot de confiture.

par fab » 03 nov. 2007, 17:35

Tout le monde n'utilise pa PDO hein :p
L'injection SQL est un vrai problème pour ceux que ça intéressent : http://www.phpsecure.info/v2/article/InjSql.php

par Victor BRITO » 03 nov. 2007, 16:52

Donc je vois pas comment il peut bloquer les injections SQL ....
D'autant qu'il est facile de s'en prémunir, grâce à mysql_real_escape_string() ou aux requêtes préparées de PDO. :wink:

Bref, le premier système de protection reste le développeur. :roll: