Antislash récurrent...Au secours

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 : Antislash récurrent...Au secours

par martial » 20 oct. 2007, 12:34

J'ai trouvé la solution...
il faut mettre le stripsalshes aprés avoir récupéré la variable dans la page qui retourne les resultats
$reg=stripslashes($_GET['nom_region']);

$sSql= "SELECT Nom_clients, Adr_client FROM france WHERE '$reg' ; ";  
ce qui donne

Code : Tout sélectionner

SELECT Nom_clients, Adr_client FROM france WHERE region='ile de france' OR region='Picardie' ;
Je vais maintenant cibler mes pages PHP sur la sécurité ....Vu qu'il y a du monde pour répondre (je plaisante)

Merci à tous!!!

par Truc » 19 oct. 2007, 20:56

C'est comme si tu repassais la requête générée dans un formulaire après coup :-k

par Tracker » 19 oct. 2007, 19:14

Salut,

File nous le code qui te génère cà:

Code : Tout sélectionner

SELECT Nom_clients, Adr_client FROM france WHERE region=\'ile de france\' OR region=\'Picardie\' ;

Tracker.

par martial » 19 oct. 2007, 18:45

J'ai enlevé les champs cachés
<table> 
<td>Région</td> 
<td >=</td> 
        <td > 
<?php 
$regionList = "<select id='nom_region' name='nom_region[]' multiple>"; 
$sSql= "SELECT DISTINCT `region` FROM `france` 
 ORDER BY `region` Asc"; 
$res = mysql_query($sSql,$conn) or die("Echec lors de l'exécution de la requête à la ligne " . __LINE__ . ": " . error($conn) . '<br>SQL:' . $sSql); 
if ($res) { 
    $row = 0; 
    while ($row = mysql_fetch_array($res)) { 
        $rowregion= explode(",",$region); 
        $regionList .= "<option value=\"" . htmlspecialchars($row[0]) . "\""; 
        foreach ($rowregion as $cntregion) { 
            if ($row["region"] == trim($cntregion)) { 
                $regionList .= " selected"; 
                break; 
            } 
        } 
        $regionList .= ">" . $row["region"] . "</option>"; 
        $row++; 
    } 
} 
mysql_free_result($row); 
$regionList .= "</select>"; 
echo $regionList; 
?></td> 
</tr> 
</table> 
Et j'ai suivi ton conseil
 $region = (isset($_POST["nom_region"])) ? $_POST["nom_region"] : array();  
    $region2 = stripslashes("='".implode("' OR region = '",$region) ."'") ; 
    $cherch = ""; 
    if ($region <> "") { 
        $cherch .= "region=" . urlencode($region2); 
            } 
    if ($cherch <> "") { 
        if ($URL <> "") $URL .= "&"; 
        $URL .= $cherch; 
    } 
J'obtiens la requête suivante qui evidemment plante!

Code : Tout sélectionner

SELECT Nom_clients, Adr_client FROM france WHERE region=\'ile de france\' OR region=\'Picardie\' ;
avec le message suivant
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'Picardie\' )' at line 1"

par Sékiltoyai » 19 oct. 2007, 18:26

C'est du débuggage, fais toi un :
var_dump(get_magic_quotes_gpc());
var_dump(stripslashes($_POST["more"]));
var_dump($_POST["more"]);

par Truc » 19 oct. 2007, 18:25

Justement avec ma proposition tu n'a plus besoin de ces champs cachés (dangereux).

Montre nous ce que tu as testé

par Invité » 19 oct. 2007, 17:00

Truc, Je viens de découvrir ton post au milieu des avis sur la sécurité des réseaux.
J"ai essayé et j'obtiens le même résultat c'est à dire des antisalshes au mileu de ma requête WHERE.
Je pense que le probléme est tout simple ....mais encore faut-il le trouver! moi en tous les cas je ne maitrise pas assez le PHP pour éviter ce genre de désagremment.
quant aux champs cachés, le 1er sert à mettre des guillemets simples entre signe "=" et le dernier champ selectionné
Le deuxiéme sert à rajouter la clause " 'OR region=' " si il y a plusieurs régions .

par martial » 19 oct. 2007, 15:58

Est-il possible de revenir à mon probléme d'antislashes?

une fois que j'aurais la solution,je serais tout disposé à disuter de sécurité sur un réseau intranet.

Mais peut être que personne n'a la solution et préfére discuter encore de sécurité?

par Sékiltoyai » 19 oct. 2007, 15:43

merci Berzemus pour la leçon sur la sécurité. Mais il s'agit d'un intranet et je ne vois pas l'intêret de l'utilisateur d'effacer quelquechose! ce qu'il veut savoir c'est la liste des clients par rapport à telles ou telles régions.
Un rootkit, un trojan sur un pc, un acte de malveillance d'un employé, une attaque par social engeneering, un mec qui passe par là lors de journées portes ouvertes, je peux te trouver des centaines de méthodes pour accéder à un intranet, et une fois que tu as réussi sans trop de problèmes à avoir l'accès, si en plus, on t'offre sur un plateau toutes les données de l'entreprise, ainsi que leur contrôle, c'est vraiment trop chou, fallait pas en faire tant.

Tu sais que l'intégrité d'un système de données ou d'un réseau ne se base pas sur une grosse vulnérabilité, mais sur une bonne liste de facteurs concourrants, c'est le produit d'un mec qui a les compétences et l'envie pour attaquer le système, d'un système insuffisament protégé (Une faille technique ou sociale), du contrôle qui est donné à cette personne une fois entrée sur le réseau (C'est là que tu interviens, un site mal sécurisé est un contrôle total sur les données), et à l'impact d'une attaque sur le système (En l'occurence, ici c'est la base de clients de l'entreprise, et pour peu que comme dans énormément de boites, il n'y ai pas de politique de sauvegarde de données, l'impact est total). Donc si on résume, dans un tel état des choses, si une personne attaquait le réseau (et j'ai déjà montré que c'était loin d'être le plus dur), l'entreprise pourraît mettre la clé sous la porte, à cause d'une petite vulnérabilité, parce qu'on a cru que comme l'on était sur un intranet, on a le droit de se permettre de faire un site complètement non sécurisé et ouvert au premier amateur.

Bref, modifier ta structure pour éviter les problèmes, ça ne te coûte rien, et c'est le responsable informatique de l'entreprise qui te remerciera…

par martial » 19 oct. 2007, 14:57

merci Berzemus pour la leçon sur la sécurité. Mais il s'agit d'un intranet et je ne vois pas l'intêret de l'utilisateur d'effacer quelquechose! ce qu'il veut savoir c'est la liste des clients par rapport à telles ou telles régions.

par Truc » 19 oct. 2007, 13:59

A quoi servent les champs cachés ?

tu peux récupérer la liste des régions pour construire un requête dynamique :
$region = (isset($_POST["nom_region"])) ? $_POST["nom_region"] : array(); 

if(!empty($region))
    $sql = "SELECT Nom_clients, Adr_client FROM france WHERE region = '".implode("' OR region = '",$region) ."'";

par Berzemus » 19 oct. 2007, 13:55

Salut..

tu n'est pas du genre à avoir froid aux yeux hein ? courageux, témeraire, certains diraient même fou furieux. Enfin, toujours est-il, c'est pas mal ce que tu fais la.

C'est quoi ça ?

Code : Tout sélectionner

<input type="hidden" name="more" value="' OR region='"></span></td>
D'habitude on dit que c'est dangereux de ne pas sécuriser des variables modifiables par l'utilisateur, puisque c'est dangereux (cqfd).

Mais la, laisser carément la requête SQL au petits soins de l'utilisateur, c'est vraiment très très gentil. S'il veut, il peut tout effacer, poum ! Ceci sans même se fatiguer, puisque il à un accès grand comme une autoroute à ta base.

Je te conseillerais de d'abord changer cette façon de faire, et d'éviter de laisser trainer les requêtes à effectuer dans la page html.

Et c'est simplement pour ça que ta requête foire, puisque tu échappes ta propre requête, et que donc elle est censée être une simple donnée à insérer, a moins que ce soit le but.

Antislash récurrent...Au secours

par martial » 19 oct. 2007, 13:24

Bonjour à toutes et à tous!
Ayant fait une base de données "clients", je peux y faire des requêtes par une page de recherche avancée.
Dans le champ région, il est possible de selectionner plusieurs régions (boite de selection multiple)
Quand je ne choisis qu'une région le code fonctionne parfaitement avec la clause WHERE du select
Voici la requête générée

Code : Tout sélectionner

SELECT Nom_clients, Adr_client FROM france WHERE region='ile de france';
mais quand je selectionne plusieurs régions je me retrouve avec des antislash entre les guillemets générées par le champ caché "more" et pas d'antislash dans l'expression générée par le champ caché "parent_region"

Code : Tout sélectionner

SELECT Nom_clients, Adr_client FROM france WHERE region='ile de france\' OR region=\'Picardie' ;
Pourtant les deux variables "$parent_region" et "$more" subissent le même traitement!

Voici une partie du formulaire
<table>
<td>Région</td>
<td >=<input type="hidden" name="parent_region" value="=,','">
		<input type="hidden" name="more" value="' OR region='"></span></td>
		<td >
<?php
$regionList = "<select id='nom_region' name='nom_region[]' multiple>";
$sSql= "SELECT DISTINCT `region` FROM `france`
 ORDER BY `region` Asc";
$res = mysql_query($sSql,$conn) or die("Echec lors de l'exécution de la requête à la ligne " . __LINE__ . ": " . error($conn) . '<br>SQL:' . $sSql);
if ($res) {
	$row = 0;
	while ($row = mysql_fetch_array($res)) {
		$rowregion= explode(",",$region);
		$x_regionList .= "<option value=\"" . htmlspecialchars($row[0]) . "\"";
		foreach ($rowregion as $cntregion) {
			if ($row["region"] == trim($cntregion)) {
				$regionList .= " selected";
				break;
			}
		}
		$regionList .= ">" . $row["region"] . "</option>";
		$row++;
	}
}
mysql_free_result($row);
$regionList .= "</select>";
echo $regionList;
?></td>
</tr>
</table>
Et voici l'exécution aprés appui sur le bouton recherche
<?php
	$more = (get_magic_quotes_gpc()) ? stripslashes(@$_POST["more"]) : @$_POST["more"];
	$region = @implode($more,@$_POST["nom_region"]);
	$parent_region = (get_magic_quotes_gpc()) ? stripslashes(@$_POST["parent_region"]) : @$_POST["parent_region"]; 
	$cherch = "";
	if ($region <> "") {
		$cherch .= "nom_region=" . urlencode($region);
		$cherch .= "&parent_region=" . urlencode($parent_region);
	}
	if ($cherch <> "") {
		if ($URL <> "") $URL .= "&";
		$URL .= $cherch;
	}
	?>
Si quelqu'un a la solution...