- Statut : non résolu
- Ce sujet contient 76 réponses, 5 participants et a été mis à jour pour la dernière fois par luciole135, le il y a 13 années et 5 mois.
-
AuteurMessages
-
18 juillet 2011 à 20 h 37 min #782491xknown 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=1Billet 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 !
18 juillet 2011 à 20 h 39 min #782492je 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?
18 juillet 2011 à 20 h 41 min #782493Guy 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 ?
18 juillet 2011 à 20 h 41 min #782494je 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.
18 juillet 2011 à 20 h 44 min #782495Guy 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 !
18 juillet 2011 à 20 h 46 min #782496Guy 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 !
🙂
18 juillet 2011 à 20 h 51 min #782497Si 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…..18 juillet 2011 à 20 h 51 min #782498Hé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 ! 🙂18 juillet 2011 à 20 h 56 min #782499@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.19 juillet 2011 à 6 h 49 min #782500Bonjour,
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 !
19 juillet 2011 à 7 h 18 min #782501La 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.’,’..’,’.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 ?
19 juillet 2011 à 8 h 49 min #782502Pour 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 ?
19 juillet 2011 à 9 h 20 min #782503euh, 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();
19 juillet 2011 à 9 h 28 min #782504Guy 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/wpdb19 juillet 2011 à 9 h 39 min #782505$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.
-
AuteurMessages
- Vous devez être connecté pour répondre à ce sujet.