2010-05-06 4 views
0

J'ai inséré une entrée cachée dans mon formulaire de commentaire:Accéder à un utilisateur IP via Formulaire de commentaires

$ip = $_SERVER['REMOTE_ADDR']; 
<input type="hidden" name="c-ip" value="<?php echo $ip; ?>"> 

Requête:

$cname = removeXSS(mysql_real_escape_string($_post['c-name'])); 
. 
. 
. 
$sql = "INSERT INTO guestbook (id, date, name, email, comment, ip, status) VALUES (' ', NOW(), '$cname', '$cemail', '$ctext' , '$cip', ' ') "; 

function RemoveXSS($val) { 
// remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed 
// this prevents some character re-spacing such as <java\0script> 
// note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs 
$val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val); 

// straight replacements, the user should never need these since they're normal characters 
// this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A &#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29> 
$search = 'abcdefghijklmnopqrstuvwxyz'; 
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
$search .= '[email protected]#$%^&*()'; 
$search .= '~`";:?+/={}[]-_|\'\\'; 
for ($i = 0; $i < strlen($search); $i++) { 
    // ;? matches the ;, which is optional 
    // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 

    // &#x0040 @ search for the hex values 
    $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; 
    // &#00064 @ 0{0,7} matches '0' zero to seven times 
    $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; 
} 


$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); 
$ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); 
$ra = array_merge($ra1, $ra2); 

$found = true; // keep replacing as long as the previous round replaced something 
while ($found == true) { 
    $val_before = $val; 
    for ($i = 0; $i < sizeof($ra); $i++) { 
    $pattern = '/'; 
    for ($j = 0; $j < strlen($ra[$i]); $j++) { 
     if ($j > 0) { 
      $pattern .= '('; 
      $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 
      $pattern .= '|'; 
      $pattern .= '|(&#0{0,8}([9|10|13]);)'; 
      $pattern .= ')*'; 
     } 
     $pattern .= $ra[$i][$j]; 
    } 
    $pattern .= '/i'; 
    $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag 
    $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags 
    if ($val_before == $val) { 
     // no replacements were made, so exit the loop 
     $found = false; 
    } 
    } 
} 
return $val; 

}

Avec cette entrée, la colonne ip est vide mysql. Quel est le problème en entrée. Merci à l'avance

+0

Veuillez éditer votre question et ajouter le code MySQL; le code que vous avez posté semble bien. –

+3

Vous devrez montrer comment vous importez le champ dans mySQL. Mais stocker l'adresse IP comme ceci est dangereusement stupide: un attaquant pourrait le changer librement. Vous devriez chercher 'REMOTE_ADDR' dans le script dans lequel vous faites la requête SQL. –

+1

Pourquoi devez-vous l'obtenir depuis un champ de saisie? C'est plus hackable que le REMOTE_ADDR. Il suffit de stocker le REMOTE_ADDR lors de la publication. –

Répondre

1

Comment allez-vous relisant, essayez-vous ceci:

echo $_POST['c-ip']; 

et assurez-vous que vous utilisez la variable super globale correcte en fonction de l'attribut method de votre formulaire.

Vous pouvez voir si votre tableau pour vérifier si IP vient bien du champ caché:

var_dump ($_POST); 

OU

var_dump ($_REQUEST); // not a good idea though 

Mise à jour

Vous pouvez simplement essayer cela aussi:

$ip = $_SERVER['REMOTE_ADDR']; 
$sql = "INSERT INTO guestbook (id, date, name, email, comment, ip, status) VALUES (' ', NOW(), '$cname', '$cemail', '$ctext' , '$ip', ' ') "; 

Vous voyez qu'il n'est pas nécessaire de sauvegarder l'IP dans un champ caché et de le stocker plus tard, vous pouvez l'obtenir à tout moment depuis le tableau super global de PHP.

+0

Salut Sarfraz; Avec l'écho $ ip dans la forme, j'ai la valeur correcte de IP ["c-ip"] => string (13) "87.239.19.109" –

+0

@jasmine: comment construisez-vous la variable '$ cip' dans votre sql question? Que attribuez-vous à cette variable? – Sarfraz

+0

@@ jasmine: voir ma réponse mise à jour plz. – Sarfraz

0

L'approche globale est erronée.
Je n'ai aucune idée pourquoi avez-vous mis une adresse IP dans le champ de formulaire.
Et je ne comprends pas pourquoi vous commencez à parler d'insérer un adresse IP dans formulaire HTML et puis continuer à se plaindre il n'a pas été inséré dans Base de données SQL. Ce sont des tâches différentes.
Vous devez d'abord vous décider. Pourquoi ne pas ajouter l'adresse IP juste avant l'exécution de la requête?

+0

Je suis confus =) –

0

Dans le formulaire, vous avez 'c-ip', mais en l'insérant dans la base de données c'est 'cip'. Est-ce que vous le manipulez entre les deux, ou est-ce une faute de frappe.

C'est correct, de quel type est le champ 'ip' dans la table du livre d'or?

Mais comme les autres l'ont dit, mieux vaut ne pas l'avoir sous la forme en premier lieu.

Questions connexes