Foros del Web » Programando para Internet » PHP »

Haker rellena formulario de comentarios en mi web, como eviarlo ???

Estas en el tema de Haker rellena formulario de comentarios en mi web, como eviarlo ??? en el foro de PHP en Foros del Web. Hola,Tengo una web, donde hay un apartado de comentarios, el cual no es necesario registrarse, pues hay un Hacker maldito que envia mensajer en HTML ...
  #1 (permalink)  
Antiguo 03/03/2009, 16:27
 
Fecha de Ingreso: octubre-2007
Mensajes: 724
Antigüedad: 16 años, 6 meses
Puntos: 4
Haker rellena formulario de comentarios en mi web, como eviarlo ???

Hola,Tengo una web, donde hay un apartado de comentarios, el cual no es necesario registrarse, pues hay un Hacker maldito que envia mensajer en HTML con el fin de bloquear la pagina, el pone esto, anque lo va modificando casi cada dia:

1º Mensaje:
<h2>hackeane</h2>

2º Mensaje:
<script>window.location=’http://hackero.webcindario.com/index2.htm’;</script>

3º Mensaje:
<META HTTP-EQUIV="Refresh" CONTENT="1; URL=http://hackero.webcindario.com/index2.htm">

Que puedo hacer para evitar esto ???

Lo que hago yo para que funcione bien, es ir a mi Base de DATOS MySQL que es donde guarda todos los registros de los comentarios de los visitantes de mi web y borrarlo manualmente, pero es un poco poco profesional y engorroso, como puedo evitarlo ???

Una de las cosas que no quiero hacer es obligar a registrarse pera poner un comentario, se me ha acurrido lo siguiente, aunque no se si es possible:

El codigo html se constituie con los signos "< >" ¿¿¿ es possible de bloquear la escritura de un campo cuando el usuario introduce el signo"<" ???? o que permitir la escritura de la palabra "script" ???

o hay alguna otra opción....?? por cierto... quiero mencionar que no soy experto...

Gracias...

Última edición por jonysi_d; 03/03/2009 a las 16:34
  #2 (permalink)  
Antiguo 03/03/2009, 16:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

Hola jonysi_d,

Debes de usar un CAPTCHA para evitar eso, posteriormente filtra tu input usando strip_tags y expresiónes regulares para evitar eso.

Saludos
  #3 (permalink)  
Antiguo 03/03/2009, 18:55
 
Fecha de Ingreso: diciembre-2008
Ubicación: Ayacucho and Lima
Mensajes: 10
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

o tambien puedes usar esta funcion

htmlspecialchars

Código PHP:
<?php
$nuevo 
htmlspecialchars("<a href='test'>Test</a>"ENT_QUOTES);
echo 
$nuevo// resultado: &lt;a href='test'&gt;Test&lt;/a&gt;
?>
  #4 (permalink)  
Antiguo 03/03/2009, 19:31
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 5 meses
Puntos: 18
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

tienes problemas en el filtrado de los datos ingresados por el usuario, básicamente te están haciendo una injección javascript, viendo esto estás propenso a sufrir todo tipo de ataques.

para reducir estos ataques es necesario que utilices funciones de filtrado como te comentaron anteriormente, además antes de insertar el registro en tu tabla, utiliza mysql_real_scape_string, hay muchas formas, de que puedas prevenir estos ataques.

usa captcha como te comentó Gatorv para poder disminuir mensajes de spam.

suerte
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #5 (permalink)  
Antiguo 03/03/2009, 21:45
 
Fecha de Ingreso: marzo-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

La solucion mas idonea y rapida es que uses CAPTCHA, como por ejemplo el usado por forosdelweb, tambien relacionado a ello puedes hacer que pidas la suma de dos numeros, y que el usuario ingrese la respuesta, claro los numeros deberan ser generados aleatoriamente.

Espero le implementes rapido....

Última edición por tunait; 04/03/2009 a las 08:39 Razón: remover firma
  #6 (permalink)  
Antiguo 04/03/2009, 15:35
 
Fecha de Ingreso: octubre-2007
Mensajes: 724
Antigüedad: 16 años, 6 meses
Puntos: 4
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

Cita:
Iniciado por grunst3r Ver Mensaje
o tambien puedes usar esta funcion

htmlspecialchars

Código PHP:
<?php
$nuevo 
htmlspecialchars("<a href='test'>Test</a>"ENT_QUOTES);
echo 
$nuevo// resultado: &lt;a href='test'&gt;Test&lt;/a&gt;
?>

Donde instalo este codigo ??? esque no interpreto ien el codigo y no se la funcion que genera
  #7 (permalink)  
Antiguo 05/03/2009, 03:41
 
Fecha de Ingreso: octubre-2007
Mensajes: 724
Antigüedad: 16 años, 6 meses
Puntos: 4
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

He probado con este codigo pero me sale un error en la session_start()

Este codigo es de un CATCHA que he encontyrado por internet,


podriais ayudarme , en saber el porque ???

Gracias:
<?php
session_start();

$html.='
<img src="imagen.php">
<form action="comprueba.php" method="post">
Texto: <input type="text" name="texto" />
<input type="hidden" name="enviar" value="true" /><br />
<input type="submit" value="Ok" />
</form>';

echo $html;
?>
  #8 (permalink)  
Antiguo 05/03/2009, 05:17
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 7 meses
Puntos: 18
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

session_start tiene que ir antes que cualquier salida que se genere al navegador.

ponlo en la primera línea del archivo.
  #9 (permalink)  
Antiguo 05/03/2009, 09:29
 
Fecha de Ingreso: octubre-2007
Mensajes: 724
Antigüedad: 16 años, 6 meses
Puntos: 4
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

gracias,
He provado con otro codigo, y me funciona bien, pero el problema esque lo que hace es bolver a cargar la misma pagina de captcha, como puedo hacer para que si el codigo es correcto, se diriga a una pagina determinada ??, el codigo del captcha es el siguiente:

archibo captcha.php
<form action="" method="post">
<?php

require_once('recaptchalib.php');
$publickey = "....";
$privatekey = "....";

# the response from reCAPTCHA
$resp = null;
# the error code from reCAPTCHA, if any
$error = null;

# are we submitting the page?
if ($_POST["submit"]) {
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);

if ($resp->is_valid) {
echo "Codigo correcto !!!";
# in a real application, you should send an email, create an account, etc
} else {
# set the error code so that we can display it. You could also use
# die ("reCAPTCHA failed"), but using the error message is
# more user friendly
$error = $resp->error;
}
}
echo recaptcha_get_html($publickey, $error);
?>
<br/>
<input type="submit" name="submit" value="submit" />
</form>



archibo recaptchalib.php
<?php
* The reCAPTCHA server URL's
*/
define("RECAPTCHA_API_SERVER", "http://api.recaptcha.net");
define("RECAPTCHA_API_SECURE_SERVER", "https://api-secure.recaptcha.net");
define("RECAPTCHA_VERIFY_SERVER", "api-verify.recaptcha.net");

/**
* Encodes the given data into a query string format
* @param $data - array of string elements to be encoded
* @return string - encoded request
*/
function _recaptcha_qsencode ($data) {
$req = "";
foreach ( $data as $key => $value )
$req .= $key . '=' . urlencode( stripslashes($value) ) . '&';

// Cut the last '&'
$req=substr($req,0,strlen($req)-1);
return $req;
}



/**
* Submits an HTTP POST to a reCAPTCHA server
* @param string $host
* @param string $path
* @param array $data
* @param int port
* @return array response
*/
function _recaptcha_http_post($host, $path, $data, $port = 80) {

$req = _recaptcha_qsencode ($data);

$http_request = "POST $path HTTP/1.0\r\n";
$http_request .= "Host: $host\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
$http_request .= "Content-Length: " . strlen($req) . "\r\n";
$http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
$http_request .= "\r\n";
$http_request .= $req;

$response = '';
if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
die ('Could not open socket');
}

fwrite($fs, $http_request);

while ( !feof($fs) )
$response .= fgets($fs, 1160); // One TCP-IP packet
fclose($fs);
$response = explode("\r\n\r\n", $response, 2);

return $response;
}



/**
* Gets the challenge HTML (javascript and non-javascript version).
* This is called from the browser, and the resulting reCAPTCHA HTML widget
* is embedded within the HTML form it was called from.
* @param string $pubkey A public key for reCAPTCHA
* @param string $error The error given by reCAPTCHA (optional, default is null)
* @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)

* @return string - The HTML to be embedded in the user's form.
*/
function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
{
if ($pubkey == null || $pubkey == '') {
die ("To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>");
}

if ($use_ssl) {
$server = RECAPTCHA_API_SECURE_SERVER;
} else {
$server = RECAPTCHA_API_SERVER;
}

$errorpart = "";
if ($error) {
$errorpart = "&amp;error=" . $error;
}
return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>

<noscript>
<iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
</noscript>';
}




/**
* A ReCaptchaResponse is returned from recaptcha_check_answer()
*/
class ReCaptchaResponse {
var $is_valid;
var $error;
}


/**
* Calls an HTTP POST function to verify if the user's guess was correct
* @param string $privkey
* @param string $remoteip
* @param string $challenge
* @param string $response
* @param array $extra_params an array of extra variables to post to the server
* @return ReCaptchaResponse
*/
function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
{
if ($privkey == null || $privkey == '') {
die ("To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>");
}

if ($remoteip == null || $remoteip == '') {
die ("For security reasons, you must pass the remote ip to reCAPTCHA");
}



//discard spam submissions
if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
$recaptcha_response = new ReCaptchaResponse();
$recaptcha_response->is_valid = false;
$recaptcha_response->error = 'incorrect-captcha-sol';
return $recaptcha_response;
}

$response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify",
array (
'privatekey' => $privkey,
'remoteip' => $remoteip,
'challenge' => $challenge,
'response' => $response
) + $extra_params
);

$answers = explode ("\n", $response [1]);
$recaptcha_response = new ReCaptchaResponse();

if (trim ($answers [0]) == 'true') {
$recaptcha_response->is_valid = true;
}
else {
$recaptcha_response->is_valid = false;
$recaptcha_response->error = $answers [1];
}
return $recaptcha_response;

}

/**
* gets a URL where the user can sign up for reCAPTCHA. If your application
* has a configuration page where you enter a key, you should provide a link
* using this function.
* @param string $domain The domain where the page is hosted
* @param string $appname The name of your application
*/
function recaptcha_get_signup_url ($domain = null, $appname = null) {
return "http://recaptcha.net/api/getkey?" . _recaptcha_qsencode (array ('domain' => $domain, 'app' => $appname));
}

function _recaptcha_aes_pad($val) {
$block_size = 16;
$numpad = $block_size - (strlen ($val) % $block_size);
return str_pad($val, strlen ($val) + $numpad, chr($numpad));
}

/* Mailhide related code */

function _recaptcha_aes_encrypt($val,$ky) {
if (! function_exists ("mcrypt_encrypt")) {
die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
}
$mode=MCRYPT_MODE_CBC;
$enc=MCRYPT_RIJNDAEL_128;
$val=_recaptcha_aes_pad($val);
return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
}


function _recaptcha_mailhide_urlbase64 ($x) {
return strtr(base64_encode ($x), '+/', '-_');
}

/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
function recaptcha_mailhide_url($pubkey, $privkey, $email) {
if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
"you can do so at <a href='http://mailhide.recaptcha.net/apikey'>http://mailhide.recaptcha.net/apikey</a>");
}


$ky = pack('H*', $privkey);
$cryptmail = _recaptcha_aes_encrypt ($email, $ky);

return "http://mailhide.recaptcha.net/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail);
}

/**
* gets the parts of the email to expose to the user.
* eg, given johndoe@example,com return ["john", "example.com"].
* the email is then displayed as [email protected]
*/
function _recaptcha_mailhide_email_parts ($email) {
$arr = preg_split("/@/", $email );

if (strlen ($arr[0]) <= 4) {
$arr[0] = substr ($arr[0], 0, 1);
} else if (strlen ($arr[0]) <= 6) {
$arr[0] = substr ($arr[0], 0, 3);
} else {
$arr[0] = substr ($arr[0], 0, 4);
}
return $arr;
}

/**
* Gets html to display an email address given a public an private key.
* to get a key, go to:
*
* http://mailhide.recaptcha.net/apikey
*/
function recaptcha_mailhide_html($pubkey, $privkey, $email) {
$emailparts = _recaptcha_mailhide_email_parts ($email);
$url = recaptcha_mailhide_url ($pubkey, $privkey, $email);

return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) .
"' onclick=\"window.open('" . htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,men ubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ($emailparts [1]);

}


?>
  #10 (permalink)  
Antiguo 06/03/2009, 06:37
 
Fecha de Ingreso: octubre-2007
Mensajes: 724
Antigüedad: 16 años, 6 meses
Puntos: 4
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

Cita:
Iniciado por grunst3r Ver Mensaje
o tambien puedes usar esta funcion

htmlspecialchars

Código PHP:
<?php
$nuevo 
htmlspecialchars("<a href='test'>Test</a>"ENT_QUOTES);
echo 
$nuevo// resultado: &lt;a href='test'&gt;Test&lt;/a&gt;
?>
LO HE INTENTADO APLICAR, PERO ME SALE COMO RESULTADO ESTO:

<a href='test'>Test</a>

He leido que este codigo es para evitar que un usuario introduzca codigo html, pero mi pregunta es , donde coloco el codigo ??? dentro del form ?? despues del submit ??? despues del form ???

Ya que he provado de todas maneras y siempre me sale la misma respuesta:
<a href='test'>Test</a>

Última edición por jonysi_d; 06/03/2009 a las 06:47
  #11 (permalink)  
Antiguo 13/03/2009, 15:29
 
Fecha de Ingreso: diciembre-2008
Ubicación: Ayacucho and Lima
Mensajes: 10
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

cuando envias el post de tu from

aplicar el htmlspecialchars

en la parte de la consulta de php que estas haciendo por decir lo mas comun

Código PHP:
mysql_query("INSERT INTO table_name (column1) VALUES ('".htmlspecialchars($_POST['contenido'])."')"); 
de esa forma puedes usarlo bueno simple cosa no xD no soy experto pero lo ago de esa manera ...!
  #12 (permalink)  
Antiguo 13/03/2009, 16:45
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

muy interesante.... con el mysql_real_scape_string puedo proteger los querys de forma sencilla, pero el htmlspecialchars me protegera del xss?
__________________
Quitenme la vida pero no la bebida.
  #13 (permalink)  
Antiguo 13/03/2009, 16:51
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

En gran parte, sí. Aunque, claro, hay otros lados por donde se puede hacer un ataque XSS, pero usando htmlspecialchars() evitas muchos de esos problemas.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #14 (permalink)  
Antiguo 13/03/2009, 16:57
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Haker rellena formulario de comentarios en mi web, como eviarlo ???

excelente, lo comenzare a aplicar a mis formularios de contacto (ya que van a una bd y luego se ven en intranet), gracias
__________________
Quitenme la vida pero no la bebida.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:00.