IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécuriser echo avec htmlspecialchars semble ne pas être suffisant


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut Sécuriser echo avec htmlspecialchars semble ne pas être suffisant
    Bonjour
    J'utilise RIPS 0.55 pour tester la sécurité de mon code mais j'ai toujours une alerte concernant echo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
     
    /**
     * Function to query information based on 
     * a parameter: in this case, location.
     *
     */
     
    if (isset($_POST['submit'])) 
    {
     
    	try 
    	{
     
    		require "../config.php";
    		require "../common.php";
     
    		$connection = new PDO($dsn, $username, $password, $options);
     
    		$sql = "SELECT * 
    						FROM users
    						WHERE location = :location";
     
    		$location = $_POST['location'];
     
    		$statement = $connection->prepare($sql);
    		$statement->bindParam(':location', $location, PDO::PARAM_STR);
    		$statement->execute();
     
    		$result = $statement->fetchAll();
    	}
     
    	catch(PDOException $error) 
    	{
    		echo $sql . "<br>" . $error->getMessage();
    	}
    }
    ?>
    <?php require "templates/header.php"; ?>
     
    <?php  
    if (isset($_POST['submit'])) 
    {
    	if ($result && $statement->rowCount() > 0) 
    	{ ?>
    		<h2>Results</h2>
     
    		<table>
    			<thead>
    				<tr>
    					<th>#</th>
    					<th>First Name</th>
    					<th>Last Name</th>
    					<th>Email Address</th>
    					<th>Age</th>
    					<th>Location</th>
    					<th>Date</th>
    				</tr>
    			</thead>
    			<tbody>
    	<?php 
    		foreach ($result as $row) 
    		{ ?>
    			<tr>
    				<td><?php echo escape($row["id"]); ?></td>
    				<td><?php echo escape($row["firstname"]); ?></td>
    				<td><?php echo escape($row["lastname"]); ?></td>
    				<td><?php echo escape($row["email"]); ?></td>
    				<td><?php echo escape($row["age"]); ?></td>
    				<td><?php echo escape($row["location"]); ?></td>
    				<td><?php echo escape($row["date"]); ?> </td>
    			</tr>
    		<?php 
    		} ?>
    		</tbody>
    	</table>
    	<?php 
    	} 
    	else 
    	{ ?>
    		<blockquote>No results found for <?php echo escape($_POST['location']); ?>.</blockquote>
    	<?php
    	} 
    }?> 
     
    <h2>Find user based on location</h2>
     
    <form method="post">
    	<label for="location">Location</label>
    	<input type="text" id="location" name="location">
    	<input type="submit" name="submit" value="View Results">
    </form>
     
    <a href="index.php">Back to home</a>
     
    <?php require "templates/footer.php"; ?>
    avec la fonction escape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function escape($html)
    {
    	return htmlspecialchars($html, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");
    }
    Par exemple RIPS me dit qu'il y a potentiellement un risque d'intrusion à la ligne <td><?php echo escape($row["firstname"]); ?></td> alors que je pensais que la fonction escape suffit
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je ne connais pas RIPS mais est-ce qu'il peut vraiment faire le lien entre ta fonction escape() et la fonction htmlspecialchars() derrière ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut
    Merci pour la réponse mais ma fonction escape est elle suffisante pour protéger contre les injection ??

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Comment veux-tu qu'on te réponde sans avoir vu cette fonction "escape" ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    @ABCIWEB
    Tu as besoin de repos,... ou d'une paire de lunettes !


    "C'est au pied du mur qu'on voit mieux....... le mur !"
    J-M. Bigard, philosophe

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Ah oui effectivement

    Bon donc je propose à kite33 d'utiliser directement la fonction htmlspecialchars (au moins le temps de tester) à la place de sa fonction escape. Cela permettra de vérifier l'hypothèse de sabotage car il est possible que l'utilitaire ne fasse pas le lien.

    Après je ne connais pas bien le drapeau ENT_SUBSTITUTE mais sur le principe htmlspecialchars est suffisant pour protéger une chaine utf-8 à l'affichage, même avec les réglages par défaut.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2014
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2014
    Messages : 461
    Par défaut
    ma fonction escape est elle suffisante pour protéger contre les injection ??
    Tu veux protéger l'affichage de ta page ou la base de donnée ?

    htmlspecialchars ne sécurise pas contre les injections SQL. Mais les requêtes préparées (comme tu le fais), oui.

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/11/2008, 09h49
  2. Le manifest du war ne semble pas être pris en compte
    Par jpclavery dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 14/06/2008, 22h22
  3. [SQL] La valeur d'une variable ne semble pas être prise en compte
    Par oroumgolok dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/09/2006, 23h31
  4. probl avec swing, tuto pas tres clair
    Par Marc_3 dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 24/03/2006, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo