Ayuda Proteger $_GET[''] - PHP

  • Autor Autor deskpro123
  • Fecha de inicio Fecha de inicio
deskpro123

deskpro123

Zeta
Verificación en dos pasos activada
Verificado por Whatsapp
Hola a todos, hasta ahora he usado una tecnica para proteger las variables $_GET[''] que llevo usando desde el 2010 y nunca me han hackeado, pero entiendo que es algo antigua, asi que quisiera saber cual es la mejor tecnica segun ustedes para proteger las variables $_GET[''] contra inyecciones???


La que usaba... Pasaba la variable por una funcion mas o menos asi:

Insertar CODE, HTML o PHP:
function seguridad($s) {
	$s = str_replace('<','',$s);
	$s = str_replace('{','',$s);
	$s = str_replace('}','',$s);
	$s = str_replace('iframe','',$s);
	$s = str_replace('mysql','',$s);
	$s = str_replace('query','',$s);
	$s = str_replace('java','',$s);
	$s = str_replace('php','',$s);
	$s = str_replace('ú','u',$s);
	$s = str_replace('á','a',$s);
	$s = str_replace('é','e',$s);
	$s = str_replace('ñ','n',$s);
	$s = str_replace('Ñ','n',$s);
	$s = str_replace('Ã*','i',$s);
	$s = str_replace('ó','o',$s);
	$s = str_replace('@','a',$s);
	$s = str_replace('$','s',$s);
	$s = str_replace('#','',$s);
	$s = str_replace('(','',$s);
	$s = str_replace(')','',$s);
	$s = str_replace('[','',$s);
	$s = str_replace(']','',$s);
	$s = str_replace('.','',$s);
	$s = str_replace('<','',$s);
	$s = str_replace('>','',$s);
	$s = str_replace('{','',$s);
	$s = str_replace('}','',$s);
	$s = str_replace('?','',$s);
	$s = str_replace('&','y',$s);
	$s = str_replace("'",'',$s);
	$s = str_replace('"','',$s);
	$s = str_ireplace("SELECT","",$s);
	$s = str_ireplace("COPY","",$s);
}


Un saludo, espero su ayuda.
 
PHP:
//si son valores numericos podes usar:
if(is_numeric($_GET['a'])){}
//htmlentities
$get = htmlentities($_GET['a']);
//si solo usas un get con pocos parametros validos:
if($_GET['a'] == 'valor'){}

//Para consultas sql, usa MySQLi o PDO

Depende lo que se haga, podes usar diferentes formas, yo soy de la 3 forma que te presente, como general.
 
PHP:
//si son valores numericos podes usar:
if(is_numeric($_GET['a'])){}
//htmlentities
$get = htmlentities($_GET['a']);
//si solo usas un get con pocos parametros validos:
if($_GET['a'] == 'valor'){}

//Para consultas sql, usa MySQLi o PDO

Depende lo que se haga, podes usar diferentes formas, yo soy de la 3 forma que te presente, como general.

Gracias amigo, solo uso GET para numeros, debo usar el primero verdad?
 
[MENTION=25010]deskpro123[/MENTION] Puedes utilizar tambien: Usando MySQLi

$mysqli->real_escape_string($_GET["usuario"]);

Antes de ingresar a query
 
Gracias amigo, solo uso GET para numeros, debo usar el primero verdad?

Sí.

Suponete, que usas ?seccion=1 para mostrar alguna seccion de tu web, entonces si es numero, usas la primera y luego una comprobación si es tal numero llame a tales posts.

[MENTION=25010]deskpro123[/MENTION] Puedes utilizar tambien: Usando MySQLi

$mysqli->real_escape_string($_GET["usuario"]);

Antes de ingresar a query

Lo mejor es meter utf-8 general en la codificacion de los campos, $mysqli->set_charset("utf8"), y mandas datos sin drama.

Un saludo. :encouragement:
 
Cuando usas solo numeros lo fuerzas... usando (int)$_GET['variable'] y listo... eso hace que sea numero siempre... sino (lo que hace el code es aseguras las GET y POST)

PHP:
<?php
	include('noin.php');
	$SEC = new secure();
	$SEC->secureGlobals();
?>
code noin.php
PHP:
<?php

class secure
{
    function secureSuperGlobalGET(&$value, $key)
    {
        $_GET[$key] = htmlspecialchars(stripslashes($_GET[$key]));
        $_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]);
        $_GET[$key] = mysql_real_escape_string($_GET[$key]);
        return $_GET[$key];
    }
   
    function secureSuperGlobalPOST(&$value, $key)
    {
        $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key]));
        $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]);
        $_POST[$key] = mysql_real_escape_string($_POST[$key]);
        return $_POST[$key];
    }
       
    function secureGlobals()
    {
        array_walk($_GET, array($this, 'secureSuperGlobalGET'));
        array_walk($_POST, array($this, 'secureSuperGlobalPOST'));
    }
}

?>

uso este code en mis sitios de wargames (retos hack para aprender a hackear) y 0 dramas! (desde hace muuuucho tiempo... 2004 tengo el sitio...)
 
Última edición:
Lo mejor es meter utf-8 general en la codificacion de los campos, $mysqli->set_charset("utf8"), y mandas datos sin drama.

Un saludo. :encouragement:

mmm pero esto solo es para codificar caracteres del tipo ñ o á, para posterior guardarlos en la base de datos, pero yo lo decía para las consultas de WHERE SQL, por que utf8 no hace nada si mira esto ' o " ,

Si entonces lo que hace mysql_escape_string($_GET[$key]) que también implementa cicklow en su clase es poner en los caracteres raros con diagonal \\' \\"

si alguien por GET escribe esto ' or '1'='1 olvídate! :fatigue:


También puedes utilizar esta función, solo para permitir ciertos caracteres.

PHP:
function permitidos($textos){

 $permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZñáéúóí.,-1234567890 ";
   for ($i=0; $i<strlen($textos); $i++){
      if (strpos($permitidos, substr($textos,$i,1))===false){
         return true;
      }
   } 
}
 
mmm pero esto solo es para codificar caracteres del tipo ñ o á, para posterior guardarlos en la base de datos, pero yo lo decía para las consultas de WHERE SQL, por que utf8 no hace nada si mira esto ' o " ,

Si entonces lo que hace mysql_escape_string($_GET[$key]) que también implementa cicklow en su clase es poner en los caracteres raros con diagonal \\' \\"

si alguien por GET escribe esto ' or '1'='1 olvídate! :fatigue:


También puedes utilizar esta función, solo para permitir ciertos caracteres.

PHP:
function permitidos($textos){

 $permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZñáéúóí.,-1234567890 ";
   for ($i=0; $i<strlen($textos); $i++){
      if (strpos($permitidos, substr($textos,$i,1))===false){
         return true;
      }
   } 
}



Te recomiendo esto:

PHP:
$Title = preg_replace("/[^a-zA-Z0-9\s-,()]/", "", $_GET['Title']);

Solo vas agregando los simbolos que deseas ocupar.


Saludos
 
Te recomiendo esto:

PHP:
$Title = preg_replace("/[^a-zA-Z0-9\s-,()]/", "", $_GET['Title']);

Solo vas agregando los simbolos que deseas ocupar.


Saludos

Pero si no quiero el 0, 3, 8, a, Z, G, pero quiero incluir los signos @, #, ? no seria más fácil solo quitarlos y agregar a la función que publique antes:

Quedaría algo así:

PHP:
function permitidos($textos){

 $permitidos = "bcdefghijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYñáéúóí.,-1245679 @#?";
   for ($i=0; $i<strlen($textos); $i++){
      if (strpos($permitidos, substr($textos,$i,1))===false){
         return true;
      }
   } 
}

Como vez aplica para cualquier carácter y también la posibilidad de agregar.


Saludos.
 
Última edición:
mmm pero esto solo es para codificar caracteres del tipo ñ o á, para posterior guardarlos en la base de datos, pero yo lo decía para las consultas de WHERE SQL, por que utf8 no hace nada si mira esto ' o " ,

Si entonces lo que hace mysql_escape_string($_GET[$key]) que también implementa cicklow en su clase es poner en los caracteres raros con diagonal \\' \\"

si alguien por GET escribe esto ' or '1'='1 olvídate! :fatigue:


También puedes utilizar esta función, solo para permitir ciertos caracteres.

PHP:
function permitidos($textos){

 $permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZñáéúóí.,-1234567890 ";
   for ($i=0; $i<strlen($textos); $i++){
      if (strpos($permitidos, substr($textos,$i,1))===false){
         return true;
      }
   } 
}

Eh, parece que no me entendiste :topsy_turvy:

En la codificación que vayas a utilizar en el campo de la tabla, en el cual implementes strings, usa la codificación "utf8_general_ci" y declarando, antes de la consulta, $mysqli->set_charset("utf8") no deberías tener problemas con los caracteres.

Hablo de apostrofes, eñes, acentos, etc. :encouragement:

Un saludo.
 
Eh, parece que no me entendiste :topsy_turvy:

En la codificación que vayas a utilizar en el campo de la tabla, en el cual implementes strings, usa la codificación "utf8_general_ci" y declarando, antes de la consulta, $mysqli->set_charset("utf8") no deberías tener problemas con los caracteres.

Hablo de apostrofes, eñes, acentos, etc. :encouragement:

Un saludo.

Son 2 cosas muy distintas, en al entrada se habla de seguridad, entonces deskpro123 busca mejorar la seguridad de su web, entonces creo que con la clase que mostró cicklow y si deskpro123 le agrega otras funciones a su gusto es más que suficiente.

Bueno lo que mencionas es el tipo de codificación que tendrá la base de datos, entonces para evitarte estos líos, cuando se crea la tabla se crea con una codificación utf8_spanish_cl y aquí te olvidas de las ñ, acentos y todo lo que queras en español.

Ya no seria necesario $mysqli->set_charset("utf8") por que ya tenes codificada la base de datos para soportar ñ, acentos, apostrofes y también debes de configurar php para que soporte dichos caracteres, sin necesidad de llamar a mysql.

Pero bueno la función que compartí fue para que se hiciera una idea deskpro123 de como podría admitir solo ciertos caracteres y rechazar otros, ya dejando por un lado lo de remplazar, carácter por carácter.

Saludos. :encouragement:
 
Son 2 cosas muy distintas, en al entrada se habla de seguridad, entonces deskpro123 busca mejorar la seguridad de su web, entonces creo que con la clase que mostró cicklow y si deskpro123 le agrega otras funciones a su gusto es más que suficiente.

Bueno lo que mencionas es el tipo de codificación que tendrá la base de datos, entonces para evitarte estos líos, cuando se crea la tabla se crea con una codificación utf8_spanish_cl y aquí te olvidas de las ñ, acentos y todo lo que queras en español.

Ya no seria necesario $mysqli->set_charset("utf8") por que ya tenes codificada la base de datos para soportar ñ, acentos, apostrofes y también debes de configurar php para que soporte dichos caracteres, sin necesidad de llamar a mysql.

Pero bueno la función que compartí fue para que se hiciera una idea deskpro123 de como podría admitir solo ciertos caracteres y rechazar otros, ya dejando por un lado lo de remplazar, carácter por carácter.

Saludos. :encouragement:

Recién veo que posteo Cicklow, a su vez, no entiendo que tanto lío haces si lo que dije es que si queres meter en la base de datos ñ, acentos y otros caracteres, para evitar tanto rollo.

Además nunca cité a Cicklow, cité tu post donde hablas de insertar datos a una consulta :topsy_turvy: como para agregar mi opinión sobre la forma de insertar un dato a la base de datos.

Un saludo :encouragement:
 
Recién veo que posteo Cicklow, a su vez, no entiendo que tanto lío haces si lo que dije es que si queres meter en la base de datos ñ, acentos y otros caracteres, para evitar tanto rollo.

Además nunca cité a Cicklow, cité tu post donde hablas de insertar datos a una consulta :topsy_turvy: como para agregar mi opinión sobre la forma de insertar un dato a la base de datos.

Un saludo :encouragement:

Lo que sucedió fue una confusión de información ya que no hablamos de insertar datos a base de datos y menos de consultas, pero antes de llegar ahí hay que proteger los datos de las variables, en este caso GET, en ninguna momento se habla de insertar datos a la base de datos, solo como mejorar una función para proteger las variables GET.

Bueno para olvidar el lio, creo que con toda la información que se ha escrito es suficiente para mejorar dicha función para la protección de las variables GET y sobre todo para la codificación de la base de datos.

Saludos. 😛8:
 
Lo que sucedió fue una confusión de información ya que no hablamos de insertar datos a base de datos y menos de consultas, pero antes de llegar ahí hay que proteger los datos de las variables, en este caso GET, en ninguna momento se habla de insertar datos a la base de datos, solo como mejorar una función para proteger las variables GET.

Bueno para olvidar el lio, creo que con toda la información que se ha escrito es suficiente para mejorar dicha función para la protección de las variables GET y sobre todo para la codificación de la base de datos.

Saludos. 😛8:

Sigo sosteniendo, que quién habló de insertar datos a una base de datos fuiste vos. http://forobeta.com/php/365322-ayuda-proteger-_get-php-post2964766.html#post2964766
 
Esta es la solucción 😉 validando algunos datos ya feliz 😉
PHP:
//si son valores numericos podes usar:
if(is_numeric($_GET['a'])){}
//htmlentities
$get = htmlentities($_GET['a']);
//si solo usas un get con pocos parametros validos:
if($_GET['a'] == 'valor'){}

//Para consultas sql, usa MySQLi o PDO

Depende lo que se haga, podes usar diferentes formas, yo soy de la 3 forma que te presente, como general.
 
Sigo sosteniendo, que quién habló de insertar datos a una base de datos fuiste vos. http://forobeta.com/php/365322-ayuda-proteger-_get-php-post2964766.html#post2964766

Mmmm mencione query para buscar datos, mostrar datos, en ningún momento mencione para insertar datos, ya que si buscas datos y te inyectan la vacuna jajaja es posible ver todos los datos de la tabla hasta las contraseñas si estas no están encriptadas, por eso hay que limpiar la consulta SQL antes de meterlas a una consulta query.

Pensé que estábamos ayudando a [MENTION=25010]deskpro123[/MENTION] (Perdón que te mencione, pero ya has resuelto tu consulta o mejorado tu función? para cerrar el tema.)

[MENTION=18661]Lopezito[/MENTION] Si te hace feliz te doy la razón, si yo hable de insertar datos, no de consultas de query y menos de seguridad en PHP. (por favor ya no me cites, ya que se a vuelto algo molesto todo esto)

Saludos amigos.
 
Sigo sin saber cual es el mejor metodo amigos 🙁

- - - Actualizado - - -

mmm pero esto solo es para codificar caracteres del tipo ñ o á, para posterior guardarlos en la base de datos, pero yo lo decía para las consultas de WHERE SQL, por que utf8 no hace nada si mira esto ' o " ,

Si entonces lo que hace mysql_escape_string($_GET[$key]) que también implementa cicklow en su clase es poner en los caracteres raros con diagonal \\' \\"

si alguien por GET escribe esto ' or '1'='1 olvídate! :fatigue:


También puedes utilizar esta función, solo para permitir ciertos caracteres.

PHP:
function permitidos($textos){

 $permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZñáéúóí.,-1234567890 ";
   for ($i=0; $i<strlen($textos); $i++){
      if (strpos($permitidos, substr($textos,$i,1))===false){
         return true;
      }
   } 
}

Amigo, si uso MYSQL ESCAPE STRING

y ' or '1'='1

me sale asi:

\' or \'1\'=\'1


Estoy a salvo de una injection SQL o no?
[MENTION=9679]cicklow[/MENTION] ... amigo, eso me salva???

Muchas gracias.
 
Última edición:
Sigo sin saber cual es el mejor metodo amigos 🙁

- - - Actualizado - - -



Amigo, si uso MYSQL ESCAPE STRING

y ' or '1'='1

me sale asi:

\' or \'1\'=\'1


Estoy a salvo de una injection SQL o no?
[MENTION=9679]cicklow[/MENTION] ... amigo, eso me salva???

Muchas gracias.
testealo... usa sqliHelper 2.7 o sqlmap para testear el acceso por injection sql... yo mi code me funciona muy bien y jamas un hack...
 
testealo... usa sqliHelper 2.7 o sqlmap para testear el acceso por injection sql... yo mi code me funciona muy bien y jamas un hack...

Queria usar tu code pero no lo entiendo bien, osea solo hace falta poner

Insertar CODE, HTML o PHP:
<?php
    include('noin.php');
    $SEC = new secure();
    $SEC->secureGlobals();
?>

En los php que uso GET y POST y automaticamente protege esas variables???

osea si pongo

Insertar CODE, HTML o PHP:
$urls=$_POST["urls"];

Ya es seguro si tiene tu codigo arriba?
 
Queria usar tu code pero no lo entiendo bien, osea solo hace falta poner

Insertar CODE, HTML o PHP:
<?php
    include('noin.php');
    $SEC = new secure();
    $SEC->secureGlobals();
?>

En los php que uso GET y POST y automaticamente protege esas variables???

osea si pongo

Insertar CODE, HTML o PHP:
$urls=$_POST["urls"];

Ya es seguro si tiene tu codigo arriba?

sisis con eso ya esta
 
Atrás
Arriba