Changeset 81443 in spip-zone


Ignore:
Timestamp:
Mar 18, 2014, 5:40:20 AM (5 years ago)
Author:
erational@…
Message:

experimental: on tente de tenir comptes des X-Forwarded-For, ... pour determiner l'IP du client et gérer les cas CDN & proxies. On se base sur le script suivant.
http://stackoverflow.com/questions/1634782/what-is-the-most-accurate-way-to-retrieve-a-users-correct-ip-address-in-php?rq=1
Cela ne protège pas pour l'IP spoofing mais permet d'élargir le vote à plus de personnes.

suppression de quickvote_resultat (on passe maintenant par le modèle spip)

Location:
_plugins_/quickvote/branches/2_1_0
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/quickvote/branches/2_1_0/formulaires/quickvote.html

    r81421 r81443  
    1313[(#HASARD|oui)   [(#SET{reponse, #GET{reponse}|quickvote_shuffle})]  ] 
    1414
    15 <div class="formulaire_spip formulaire_quickvote quickvote-#ENV{id} ajax">
     15<div class="formulaire_spip formulaire_quickvote [(quickvote-#ENV{id})] ajax">
    1616        [(#ENV{masquer_question}|non)<div class="quickvote-question">#TITRE</div>]
    1717        [<div class="quickvotebilan">(#ENV*{message_ok})</div>]
  • _plugins_/quickvote/branches/2_1_0/formulaires/quickvote.php

    r81420 r81443  
    66include_spip('inc/editer');
    77include_spip('base/abstract_sql');
    8 
    9 
    10 // générer les résultats du vote sous forme d'un tableau HTML
    11 // alternative: // modele/quickvote
    12 function quickvote_resultat($id_quickvote) {
    13      include_spip('base/abstract_sql');
    14      include_spip('inc/texte'); // pour typo
    15 
    16      $nb_vote = 0;
    17      $vote = array();
    18 
    19      // boucle sur les reponses disponibles du formulaires = non vide
    20      if ($res = sql_select("b.reponse AS pos, COUNT(b.reponse) AS nbr, CASE b.reponse WHEN 'reponse1' THEN a.reponse1
    21                                                                                       WHEN 'reponse2' THEN a.reponse2
    22                                                                                       WHEN 'reponse3' THEN a.reponse3
    23                                                                                       WHEN 'reponse4' THEN a.reponse4
    24                                                                                       WHEN 'reponse5' THEN a.reponse5
    25                                                                                       WHEN 'reponse6' THEN a.reponse6
    26                                                                                       WHEN 'reponse7' THEN a.reponse7
    27                                                                                       WHEN 'reponse8' THEN a.reponse8
    28                                                                                       WHEN 'reponse9' THEN a.reponse9
    29                                                                                       WHEN 'reponse10' THEN a.reponse10 END AS rep", 'spip_quickvotes a INNER JOIN spip_quickvotes_votes b ON a.id_quickvote = b.id_quickvote', "id_quickvote =".intval($id_quickvote), 'reponse', 'nbr') ) {
    30           // cherchons le nb de votes  pour chaque reponse
    31           while ($row = sql_fetch($res)) {
    32               $vote[$row['pos']] = array($row['rep'], $row['nbr']);
    33               $nb_vote += $row['nbr'];
    34           }
    35      }
    36 
    37      if ($nb_vote==0)
    38           $str_resultat = "<div class='nb_vote'>"._T("quickvote:resultat_0_vote")."</div>";
    39      else {
    40           $str_resultat = '<table class="spip">';
    41           $str_resultat .= '<caption>'. _T("quickvote:resultat_titre") .'</caption>';
    42           // bilan - calcul des pourcentages
    43           $i = 0;
    44           foreach ($vote as $k=>$val) {
    45                $str_resultat .= '<tr id="'.$k.'" class="row_'. ($i%2?'odd':'even') .'">';
    46                $i++;
    47                $str_resultat .= '<td>'.$val[0].'</td>';
    48                $str_resultat .= '<td>'.$val[1].'&times; : '. round(($val[1]/$nb_vote)*100) .'%</td>';
    49                $str_resultat .= '</tr>';
    50           }
    51           $str_resultat .= '<tr id="reponse0" class="row_first"><td colspan="2" class="nb_vote">';
    52           if ($nb_vote==1)
    53                $str_resultat .= _T('quickvote:resultat_nb_vote');
    54           else
    55                $str_resultat .= _T('quickvote:resultat_nb_votes', array('nb'=>$nb_vote));
    56           $str_resultat .= '</td></tr>';
    57           $str_resultat .= '</table>';
    58      }
    59 
    60      return $str_resultat;
    61 }
    628
    639
     
    8531     if (($row = sql_fetsel("actif", "spip_quickvotes", "id_quickvote = $id_quickvote AND actif = 0")) || ($skip_vote=='oui')) {
    8632          $valeurs['editable'] = false;
    87 //          $valeurs['message_ok'] = quickvote_resultat($id_quickvote);
    8833          $valeurs['message_ok'] = recuperer_fond('modeles/quickvote', array('id'=>$id_quickvote) );
    8934     }
     
    9136     else if ($row = sql_fetsel("ip", "spip_quickvotes_votes", "id_quickvote = $id_quickvote AND ip='$ip'")){
    9237          $valeurs['editable'] = false;
    93 //          $valeurs['message_ok'] = quickvote_resultat($id_quickvote);
    9438          $valeurs['message_ok'] = recuperer_fond('modeles/quickvote', array('id'=>$id_quickvote) );
    9539     }
     
    12468
    12569     // SQL
    126      $ip = $GLOBALS['ip'];
     70     //$ip = $GLOBALS['ip'];
     71     $ip = quickvote_get_ip_address();
     72     if ($ip=="")
     73               $ip = $GLOBALS['ip'];
     74     
    12775     // sécurité le formulaire peut etre chargé à plusieurs endroits à la fois: on n'enregistre que le 1er vote de cette IP, les autres votes sont ignorés
    12876     if (!$row = sql_fetsel("ip", "spip_quickvotes_votes", "id_quickvote = $id_quickvote AND ip='$ip'"))  {
     
    13684     // Valeurs de retours
    13785     return array(
    138 //          'message_ok' => quickvote_resultat($id_quickvote),
    13986          'message_ok' => recuperer_fond('modeles/quickvote', array('id'=>$id_quickvote) ),
    14087          'editable' => false
     
    14289}
    14390
     91// (experimental) essayer de recuperer la bonne IP notamment via les CDN, Proxy, ...
     92// What is the most accurate way to retrieve a user's correct IP address in PHP?
     93// http://stackoverflow.com/questions/1634782/what-is-the-most-accurate-way-to-retrieve-a-users-correct-ip-address-in-php?rq=1
     94 
     95 /**
     96  * Retrieves the best guess of the client's actual IP address.
     97  * Takes into account numerous HTTP proxy headers due to variations
     98  * in how different ISPs handle IP addresses in headers between hops.
     99  */
     100function quickvote_get_ip_address() {
     101  // check for shared internet/ISP IP
     102  if (!empty($_SERVER['HTTP_CLIENT_IP']) && quickvote_validate_ip($_SERVER['HTTP_CLIENT_IP']))
     103   return $_SERVER['HTTP_CLIENT_IP'];
     104
     105  // check for IPs passing through proxies
     106  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
     107   // check if multiple ips exist in var
     108    $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
     109    foreach ($iplist as $ip) {
     110     if (quickvote_validate_ip($ip))
     111      return $ip;
     112    }   
     113  }
     114   
     115  if (!empty($_SERVER['HTTP_X_FORWARDED']) && quickvote_validate_ip($_SERVER['HTTP_X_FORWARDED']))
     116   return $_SERVER['HTTP_X_FORWARDED'];
     117  if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && quickvote_validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
     118   return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
     119  if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && quickvote_validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
     120   return $_SERVER['HTTP_FORWARDED_FOR'];
     121  if (!empty($_SERVER['HTTP_FORWARDED']) && quickvote_validate_ip($_SERVER['HTTP_FORWARDED']))
     122   return $_SERVER['HTTP_FORWARDED'];
     123
     124  // return unreliable ip since all else failed
     125  return $_SERVER['REMOTE_ADDR'];
     126}
     127
     128 /**
     129  * Ensures an ip address is both a valid IP and does not fall within
     130  * a private network range.
     131  *
     132  * @access public
     133  * @param string $ip
     134  */
     135function quickvote_validate_ip($ip) {
     136     if (filter_var($ip, FILTER_VALIDATE_IP,
     137                         FILTER_FLAG_IPV4 |
     138                         FILTER_FLAG_IPV6 |
     139                         FILTER_FLAG_NO_PRIV_RANGE |
     140                         FILTER_FLAG_NO_RES_RANGE) === false)
     141         return false;
     142     
     143     return true;
     144}
     145
     146
    144147
    145148?>
  • _plugins_/quickvote/branches/2_1_0/plugin.xml

    r81421 r81443  
    33        <slogan>Mini-sondages avec jeu de questions fermé</slogan>
    44        <auteur>[erational->http://www.erational.org],Art-Logic</auteur> 
    5         <version>0.2.1</version>
     5        <version>0.3.0</version>
    66        <version_base>0.1.0</version_base>
    77        <etat>test</etat>
Note: See TracChangeset for help on using the changeset viewer.