Remplacer la fonction PHP htmlentities ? (Créer un compte)

  • Statut : non résolu
15 sujets de 16 à 30 (sur un total de 77)
  • Auteur
    Messages
  • #782491
    luciole135
    Participant
    Maître WordPress
    13743 contributions
    xknown wrote:
    Je ne sais pas si vous avez regardé la présentation que je vous avez recommandé ?

    Si, j’ai pris des notes, sur le visuel et j’ai un peu compris, (l’anglais n’est pas mon fort malheureusement), et c’est pour éviter les 3 types d’attaques (injections SQL, XSS et CSRF) que je m’attaque à la sécurisation de ce plugin dérivé de StatPress.

    En effet, sur le StatPress original, un utilisateur à ouvert un billet sur une attaque XSS, donc, celle-ci est aussi possible dans le mien puisque j’ai tout copié sur lui !
    http://wordpress.org/support/topic/plugin-statpress-open-xss-vulnerability?replies=1

    Billet qui est resté lettre morte malheureusement, aucune réaction du concepteur…

    Alors, avant de me lancer dans l’optimisation de la base de données, il me semble URGENT de bien sécuriser cette partie du plugin !

    #782492
    Guy
    Participant
    Maître WordPress
    14828 contributions

    je n’ai jamais dit qu’elles étaient identiques 🙂, c’était pour les comparer et afficher le résultat des deux.

    Pour la fonction insert et update aussi, les caractères ne doivent pas échappés, il faut mettre les données “raw”, c’est la fonction qui s’occupent de faire l’encodage SQL.

    $wpdb->insert( $table, (array) $data )
    $data should be unescaped (the function will escape them for you). Keys are columns, Values are values.

    C’est probablement la cause de l’erreur , si tu peux l’afficher?

    #782493
    luciole135
    Participant
    Maître WordPress
    13743 contributions
    Guy wrote:
    C’est exactement cela si on se fie à la documentation, je n’ai jamais utilisé esc_url_raw, il faudrait peut être que tu affiches le résultat des deux fonctions (esc_url_raw et mysql_real_escape_string) pour pouvoir les comparer.

    Bon, je vais les tester en ligne, merci beaucoup, vous êtes génial !

    Question supplémentaire, si les données ont étés protégées à leur enregistrement dans la base de données, est-il nécessaire lorsque je les trie avec des requêtes SQL (pour les afficher dans la partie administration )de les protéger à nouveau lors de leur lecture dans la base de données ?

    N’est-ce pas redondant ou est-ce nécessaire ?

    #782494
    Guy
    Participant
    Maître WordPress
    14828 contributions

    je n’ai pas mis ma conclusion, pfff, donc si tu te sers de insert, il faut enlever le mysql_real_escape_string des données entrées à la fonction.

    #782495
    luciole135
    Participant
    Maître WordPress
    13743 contributions
    Guy wrote:
    je n’ai jamais dit qu’elles étaient identiques 🙂, c’était pour les comparer et afficher le résultat des deux.

    Pour la fonction insert et update aussi, les caractères ne doivent pas échappés, il faut mettre les données “raw”, c’est la fonction qui s’occupent de faire l’encodage SQL.

    $wpdb->insert( $table, (array) $data )
    $data should be unescaped (the function will escape them for you). Keys are columns, Values are values.

    C’est probablement la cause de l’erreur , si tu peux l’afficher?

    Donc, je supprime les fonctions de protections dans les champs, insert s’occupe de tout !

    #782496
    luciole135
    Participant
    Maître WordPress
    13743 contributions
    Guy wrote:
    je n’ai pas mis ma conclusion, pfff, donc si tu te sers de insert, il faut enlever le mysql_real_escape_string des données entrées à la fonction.

    Ok, j’ai pigé, je teste ça des demain et je vous tiens au courant !

    Merci, vous êtes mon sauveur !

    🙂

    #782497
    Guy
    Participant
    Maître WordPress
    14828 contributions

    Si tu utilises les fonctions insert et update, les données doivent être brutes, sinon si tu utilises query, tu dois formater la chaine avant avec prepare, mais avec prepare aussi, les arguments doivent être bruts.
    $wpdb->query( $wpdb->prepare( “INSERT…..

    #782498
    xknown
    Membre
    Chevalier WordPress
    119 contributions

    Héhé, je pense que l’on écrit trop vite. Guy, mon dernier message était plutôt destiné à luciole
    C’est peut-être ma faute, je ne comprends/écris pas très bien le francais ! 🙂

    #782499
    Guy
    Participant
    Maître WordPress
    14828 contributions

    @xknown non, non, tu comprends et écris super bien, en me relisant j’ai vu que je n’avais pas été clair et que cela laissait supposer que les deux fonctions étaient identiques.
    Au contraire, en fait, c’était pour mettre en évidence qu’une encodait les données au format SQL et que l’autre laissait l’url en raw pour s’en servir dans la fonction insert.

    #782500
    luciole135
    Participant
    Maître WordPress
    13743 contributions

    Bonjour,
    j’ai mis les données en brut et j’ai toujours cette erreur avec le wpdb->show_errors(), malheureusement, cela n’indique rien sur la nature de l’erreur :

    WordPress database error: []
    INSERT INTO `wp_statpress` (`date`,`time`,`ip`,`urlrequested`,`agent`,`referrer`,`search`,`nation`,`os`,`browser`,`searchengine`,`spider`,`feed`,`user`,`timestamp`) VALUES (‘20110719′,’08:46:08′,’127.0.0.1′,’/wordpress/index.php/additifs-autorises-dans-tabac’,’Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0′,’http://localhost/wordpress/index.php/substituts-tabagiques’,”,”,’Windows XP’,’Firefox 5′,”,”,”,”,’1311065168′)

    Voici le code de la fonction d’analyse du plugin StatPress Visitors :

    function luc_StatAppend()
            { global $wpdb;
              $table_name = $wpdb->prefix . “statpress”;
              global $userdata;
              global $_STATPRESS;
              get_currentuserinfo();
              $feed = ”;
              
              // Time
              $timestamp = current_time(‘timestamp’);
              $vdate = gmdate(“Ymd”, $timestamp);
              $vtime = gmdate(“H:i:s”, $timestamp);
              
              // IP
              $ipAddress = $_SERVER[‘REMOTE_ADDR’];
              if (luc_CheckBanIP($ipAddress) === true)
                  return ”;
              
               // URL (requested)
               $urlRequested = luc_StatPress_URL();
              
    		   if (preg_match(“/.ico$/i”, $urlRequested))
                  return ”;
    		   if (preg_match(“/favicon.ico/i”, $urlRequested))
                  return ”;  
    		   if (preg_match(“/.css$/i”, $urlRequested))
                  return ”;  
    		   if (preg_match(“/.js$/i”, $urlRequested))
                  return ”;
               if (stristr($urlRequested, “/wp-content/plugins”) != false)
                  return ”;
               if (stristr($urlRequested, “/wp-content/themes”) != false)
                  return ”;
              
               $referrer = (isset($_SERVER[‘HTTP_REFERER’]) ? htmlentities($_SERVER[‘HTTP_REFERER’]) : ”);
               $userAgent = (isset($_SERVER[‘HTTP_USER_AGENT’]) ? htmlentities($_SERVER[‘HTTP_USER_AGENT’]) : ”);
               $spider = luc_GetSpider($userAgent);
              
               if (($spider != ”) and (get_option(‘statpressV_not_collect_spider’) == ‘checked’))
                  return ”;
              
               if ($spider != ”)
                 { $os = ”;
                   $browser = ”;
                 }
               else
                 {// Trap feeds
                  $prsurl = parse_url(get_bloginfo(‘url’));
                  $feed = luc_StatPress_is_feed($prsurl[‘scheme’] . ‘://’ . $prsurl[‘host’] . $_SERVER[‘REQUEST_URI’]);
                  // Get OS and browser
                  $os = luc_GetOS($userAgent);
                  $browser = luc_GetBrowser($userAgent);
                  list($searchengine, $search_phrase) = explode(“|”, luc_GetSE($referrer));
                 }
               // Auto-delete visits if…
    		   $today = gmdate(‘Ymd’, current_time(‘timestamp’));
    		   if ($today  get_option(‘statpresV_delete_today’)) 
    			 { update_option(‘statpresV_delete_today’, $today);
                   if (get_option(‘statpressV_autodelete_spider’) != ”) 
                     {$t = gmdate(“Ymd”, strtotime(‘-‘ . get_option(‘statpressV_autodelete_spider’)));
                      $results = $wpdb->query(“DELETE FROM ” . $table_name . ” WHERE date < '" . $t . "' AND spider  ””);
    			      $results  = $wpdb->query(‘OPTIMIZE TABLE ‘. $table_name);
                      }
                   if (get_option(‘statpressV_autodelete’) != ”)
                      {$t = gmdate(“Ymd”, strtotime(‘-‘ . get_option(‘statpressV_autodelete’)));
                       $results = $wpdb->query(“DELETE FROM ” . $table_name . ” WHERE date query(‘OPTIMIZE TABLE ‘. $table_name);
                     }
    		      }
               if ((!is_user_logged_in()) or (get_option(‘statpressV_collect_logged_user’) == ‘checked’))
                 { if ($wpdb->get_var(“SHOW TABLES LIKE ‘$table_name'”) != $table_name)
                      luc_StatPress_CreateTable();
    				  $wpdb->show_errors();
                   $result = $wpdb->insert( $table_name, array(date => $vdate, time => $vtime, ip => $ipAddress, urlrequested => $urlRequested, agent => $userAgent , referrer => $referrer, search => $search_phrase, nation => luc_Domain($ipAddress) ,os => $os, browser => $browser, searchengine => $searchengine ,spider => $spider, feed => $feed, user => $userdata->user_login, timestamp => $timestamp),
    			   array(‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ ));
                 	 $wpdb->print_error(); 
                 }		  
            }
    }

    Dois-je essayer alors avec wpdb->query($wpdb->prepare ?

    Quelle galère que les “simples insertions” dans une BD, c’est encore plus difficile que de concevoir des requêtes SQL de tri complexe !

    #782501
    luciole135
    Participant
    Maître WordPress
    13743 contributions

    La fonction luc_domain, (utilisée ici nation => “.luc_Domain($ipAddress).”) n’encapsule pas les données, c’est celle-ci, (en plus je dois changer la fonction ereg par une autre car ereg n’est plus supporté à partir de PHP 5.3, une galère de plus ):

    function luc_Domain($ip)
          {
              $host = gethostbyaddr($ip);
              if (ereg(‘^([0-9]{1,3}.){3}[0-9]{1,3}$’, $host))
                  return “”;
              else
                  return my_substr(strrchr($host, “.”), 1);
          }

    Je viens d’essayer déjà çà, sans résultats, (les données écrites comme cela “.$date.”) même erreur, bon, même si cela met erreur, les données dans tous les cas de figure sont insérées :

    $result = $wpdb->insert( $table_name, array(date => “.$vdate.”, time => “.$vtime.”, ip => “.$ipAddress.”, urlrequested => “.$urlRequested.”, agent => “.$userAgent.” , referrer => “.$referrer.”, search => “.$search_phrase.”, nation => “.luc_Domain($ipAddress).” ,os => “.$os.”, browser => “.$browser.”, searchengine => “.$searchengine.” ,spider => “.$spider.”, feed => “.$feed.”, user => “.$userdata->user_login.”, timestamp => “.$timestamp.”),
    			   array(‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ ));

    ça aussi, (les données entre quote) même erreur :

    $result = $wpdb->insert( $table_name, array(date => ‘$vdate’, time => ‘$vtime’, ip => ‘$ipAddress’, urlrequested => ‘$urlRequested’, agent => ‘$userAgent’ , referrer => ‘$referrer’, search => ‘$search_phrase’, nation => ‘luc_Domain($ipAddress)’ ,os => ‘$os’, browser => ‘$browser’, searchengine => ‘$searchengine’ ,spider => ‘$spider’, feed => ‘$feed’, user => ‘$userdata->user_login’, timestamp => ‘$timestamp’),
    			   array(‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ ));

    Et avec les données brutes ($date), toujours la même erreur :

    $result = $wpdb->insert( $table_name, array(date => $vdate, time => $vtime, ip => $ipAddress, urlrequested => $urlRequested, agent => $userAgent , referrer => $referrer, search => $search_phrase, nation => luc_Domain($ipAddress) ,os => $os, browser => $browser, searchengine => $searchengine ,spider => $spider, feed => $feed, user => $userdata->user_login, timestamp => $timestamp),
    			   array(‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ ));

    Et avec $wpdb->query($wpdb-> prepare, (les données comme “.$date.”) cela me dit “WordPress database error: [Query was empty]” :

    $query = “INSERT INTO ” . $table_name . ” (date, time, ip, urlrequested, agent, referrer, search,nation,os,browser,searchengine,spider,feed,user,timestamp) ” . “VALUES (‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ ),”.$vdate.”,”.$vtime.”,”.$ipAddress.”,”.$urlRequested.”,”.$userAgent.”,”.$referrer.”,”.$search_phrase.”,”.luc_Domain($ipAddress).”,”.$os.” ,”.$browser.”,”.$searchengine.”,”.$spider.”,”.$feed.”,”.$userdata->user_login.”,”.$timestamp.””;
                  
    				$wpdb->query( $wpdb->prepare($query));

    Et de cette façon :

    $wpdb->query($wpdb->prepare(“INSERT INTO $table_name (date,time,ip,urlrequested,agent,referrer,search,nation,os,browser,searchengine,spider,feed,user,timestamp) VALUES (‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’)”,”.$vdate.”,”.$vtime.”,”.$ipAddress.”,”.$urlRequested.”,”.$userAgent.”,”.$referrer.”,”.$search_phrase.”,”.luc_Domain($ipAddress).”,”.$os.”,”.$browser.”,”.$searchengine.”,”.$spider.”,”.$feed.”,”.$userdata->user_login.”,”.$timestamp.”));

    j’ai cette erreur :WordPress database error: []
    INSERT INTO wp_statpress (date, time, ip, urlrequested, agent, referrer, search,nation,os,browser,searchengine,spider,feed,user,timestamp) VALUES (‘.20110719.’,’.09:48:06.’,’.127.0.0.1.’,’./wordpress/index.php/pas-dependance-nicotine-theorie-decouplage.’,’.Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0.’,’.http://localhost/wordpress/index.php/dependance-histoire-individu-contexte-environnement.&#8217;,’..’,’.luc_Domain(127.0.0.1).’,’.Windows XP.’,’.Firefox 5.’,’..’,’..’,’..’,’.Andre.’,’.1311068886.’ )

    Bon le code veut pas se mettre en entier, c’est :

    $wpdb->query($wpdb->prepare(“INSERT INTO $table_name (date,time,ip,urlrequested,agent,referrer,search,nation,os,browser,searchengine,spider,feed,user,timestamp) VALUES (‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’)”,
    “.$vdate.”,”.$vtime.”,”.$ipAddress.”,”.$urlRequested.”,”.$userAgent.”,”.$referrer.”,”.$search_phrase.”,
    “.luc_Domain($ipAddress).”,”.$os.”,”.$browser.”,”.$searchengine.”,”.$spider.”,”.$feed.”,
    “.$userdata->user_login.”,”.$timestamp.”));

    Et de cette façon, (les données brutes) toujours la même erreur :

    $wpdb->query( $wpdb->prepare(“INSERT INTO  $table_name  (date, time, ip, urlrequested, agent, referrer, search,nation,os,browser,searchengine,spider,feed,user,timestamp) VALUES (‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ )”,$vdate,$vtime,$ipAddress,$urlRequested,$userAgent,$referrer,$search_phrase,luc_Domain($ipAddress),$os ,$browser,$searchengine,$spider,$feed,$userdata->user_login,$timestamp));

    Bon, ça veut pas mettre le code en entier non plus, c’est :

    $wpdb->query( $wpdb->prepare(“INSERT INTO $table_name (date, time, ip, urlrequested, agent, referrer, search,nation,os,browser,searchengine,spider,feed,user,timestamp) VALUES (‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ )”,$vdate,$vtime,$ipAddress,$urlRequested,$userAgent,$referrer,$search_phrase,luc_Domain($ipAddress),$os ,$browser,$searchengine,$spider,$feed,$userdata->user_login,$timestamp));

    AU SECOURS !

    Quoique je fasse, il y a une erreur et je ne vois vraiment pas ce que je fais mal ?

    p.s : je pense à tous ceux qui font des plugins avec insert et qui n’affichent pas les erreurs avec $wpdb->show_errors(); ont-ils eux aussi ce problème ?

    #782502
    luciole135
    Participant
    Maître WordPress
    13743 contributions

    Pour simplifier, j’ai modifié pour n’insérer qu’une seule valeur, la date
    (définie ainsi : $vdate = gmdate(“Ymd”, current_time(‘timestamp’)); )
    et toujours la même erreur (les données sont quand même insérées dans la BDD) :

    WordPress database error: []
    INSERT INTO wp_statpress (date) VALUES (‘20110719’ )

    $wpdb->query( $wpdb->prepare(“INSERT INTO  $table_name  (date) VALUES (‘%s’ )”,$vdate));

    Et même avec $wpdb->insert, il y a la même erreur:

    $result = $wpdb->insert( $table_name, array(date => $vdate),array(‘%s’));

    Dois-je revenir au wpdb->query(“INSERT INTO….”);
    en ayant pris soin de protéger les données auparavant comme le conseille xknown :
    $safe_referrer = $wpdb->escape( esc_url_raw( $referrer ) );

    Car si cela fait systématiquement une erreur, est-ce que les insertions sont malgré tout sécurisées ?
    J’ai bien peur que cela se contente d’insérer sans rien protéger du tout !

    Cela m’inquiète énormément, le Staff WordPress insiste énormément – à juste titre – sur la sécurisation des données, et quand je veux faire selon la méthode qu’ils préconisent, il y a une erreur !

    Est-ce que j’ai mal fait quelque chose ou alors y-a-t-il un bug dans les fonctions d’insertions de WordPress ?

    #782503
    Guy
    Participant
    Maître WordPress
    14828 contributions

    euh, je ne crois pas qu’il y ait une erreur, tu affiches print_error, WordPress en bon élève obéissant affiche database error, mais avec rien dedans puisqu’il n’y a pas d’erreur.

    tu devrais tester $result, du genre if ($result == false) $wpdb->print_error();

    #782504
    luciole135
    Participant
    Maître WordPress
    13743 contributions
    Guy wrote:
    euh, je ne crois pas qu’il y ait une erreur, tu affiches print_error, WordPress en bon élève obéissant affiche database error, mais avec rien dedans puisqu’il n’y a pas d’erreur.

    Ah, cela me rassure alors, mais pourquoi quand j’encapsule les données cela me met aussi une erreur avec rien dedans ? cela devrait indiquer une erreur non vide !

    Guy wrote:
    tu devrais tester $result, du genre if ($result == false) $wpdb->print_error();

    Je n’ai pas vu la variable $result dans les fonctions de référence WordPress, je la définie comment ?
    http://codex.wordpress.org/Class_Reference/wpdb

    #782505
    Guy
    Participant
    Maître WordPress
    14828 contributions

    $result, c’est la variable recevant le résultat de la requête

    $result = $wpdb->insert(….

    toujours pour des tests, essaie d’envoyer une requête que tu sauras être fausse et regarde si une erreur est bien générée.

15 sujets de 16 à 30 (sur un total de 77)
  • Vous devez être connecté pour répondre à ce sujet.