PHP - inyeccion de codigo php

 
Vista:
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por zendi (1056 intervenciones) el 12/09/2020 19:48:53
He creado una BBDD con postgresql, el asunto es que he investigado y determinado que esa BBDD esta debil en el sentido de que no le he colocado su proteccion. me han comentado que pueden Hackearla.

Quisiera saber como fortalecer la BBDD. Que sugerencia me darian?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de javier
Val: 1.542
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por javier (546 intervenciones) el 12/09/2020 19:58:57
como lo has determinado? la debilidad?

una BBDD puede ser robusta en cuanto a que no se pierden nunca datos y esta optimizada y normalizada pero no insegura,
inseguras son las contraseñas que deberian ser con letras mayuscula, minusculas numeros y de seis digitos minimo y otra inseguridad es como haces las consultas a la BBDD, como armas tus querys.
Yo te recomiendo usar usar PDO de php de forma correcta, te dejo un enlace:

PDO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por zendi (1056 intervenciones) el 14/09/2020 23:40:39
Esta bien Javier, voy a ponerlo en practica; sus sugerencias. Si presento algun error pido ayuda. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Yoel
Val: 617
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por Yoel (197 intervenciones) el 14/09/2020 04:43:13
Hola Zendi, como bien te dijo Javier es muy recomendable usar PDO para evitar la inyección de contenido en SQL. Si deseas reforzar un poco más esa seguridad puedes usar el método de php htmlentities(), esto es recomendado siempre que envias valores tanto por $_POST o $_GET.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por zendi (1056 intervenciones) el 14/09/2020 23:40:05
Esta bien Yoel, voy a ponerlo en practica; sus sugerencias. Si presento algun error les pido ayuda. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 121
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por Juan Luis ESP (35 intervenciones) el 15/09/2020 10:18:22
Buenas,
no hay bases de datos inseguras por sí mismas. Lo que las hace inseguras es la forma que se tiene de interactuar con ella (exceptuando un usuario y clave débiles o un servidor no actualizado)...

Una mala programación puede hacer que alguien inyecte código en los campos que, posteriormente, se muestran "tal cual" en la web, ejecutando el navegador dicho código y haciendo cosas imprevisibles.

También hay que tener cuidado al utilizar variables de las URL directamente en las consultas porque eso, en la mayoría de las veces, es un agujero de seguridad tremendo.

Por ejemplo:

http://miaplicacion.com/usuarios/perfil/editar.php?id=10

Alguien podría cambiar la url y poner id=1 y el sistema, si no controla si se está autorizado a ver fichas de otros usuarios, podría ver/actualizar el perfil de otra persona.

Es más, ¿qué pasaría si ponen en la URL ?id="1;DELETE * FROM usuarios;" ???
Seguramente, en tu código, si tienes una SQL del tipo:

1
$sqlEdit = "SELECT * FROM usuarios WHERE id=".$_GET['id'];

Si no se asegura de que GET['id'] sea de tipo numérico ANTES de componer la SQL, el sistema ejecutaría todo, incluido el borrado de la tabla usuarios :-/

Como bien te han indicado anteriormente, el uso de PDO para construir las consultas, así como el filtrado de todo lo que llega por POST/GET hace que tu aplicación sea mucho más segura.

Te dejo un par de páginas que hablan del tema:
https://www.xplora.eu/como-proteger-pagina-web/
https://diego.com.es/seguridad-web-en-php

Una última recomendación, si me lo permites. Para que tengas ya mucho ganado con el tema de la seguridad y las buenas prácticas de programación deberías apoyarte, al hacer tus proyectos, en un framework ya sólido y contrastado. Yo te recomiendo que uses Symfony 4.x siempre que puedas. Invertir tu tiempo en aprenderlo no sólo te convertirá en mejor programador, sino que, profesionalmente, estarás más cualificado para acceder a los empleos mejor pagados (dentro del perfil de desarrollador de PHP).

Saludos,
Juan Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por zendi (1056 intervenciones) el 15/09/2020 23:47:00
Hola Juan Luis, Bueno yo desarrollo con POO php puro hasta ahora no se desarrollar con framework, he querido aprender pero no he puesto el empeño en aprender alguno.

estuve mirando un videotutorial donde explican que con este codigo:
1
'OR '1' ='1
, pudieran acceder desde el formulario de logueo de usuario a la base de datos,

por ejemplo en mi formulario tengo esta linea de codigo:
1
<input type="password" size="30" style="border-radius: 50px;" name="pass" placeholder="Contraseña" required />
que es por donde pueden inyectar ese codigo malicioso, trate de colocar un pattern="[]", pero como es una contraseña que la misma aplicacion crea con anterioridad no se puede usar en este caso.


Ahora como desde la interfase de usuario podriamos protegerlo?


Y en este codigo de mi aplicacion :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public function validar()
{
    $nombres=$_POST["nombres"];
 
    $username=$_POST["correo1"];
    $pass=$_POST["pass"];
		$sql="SELECT * FROM usuario WHERE cta_correo='$username' AND usuario_pass='$pass'";
	       $res=pg_query(Conectar::con(),$sql);
       if (pg_num_rows($res)==0)
       {
        echo "<script type='text/javascript'>
        alert('La cuenta de Correo o la Contraseña no son Correctos o no Existen. Debe Registrarse.');
        window.location='solicitud.php';
        </script>";
       }
       else
       {
        if ($reg=pg_fetch_array($res))
         {
            session_start();
            $_SESSION["session_usuario"]=$reg["idusuario"];
            $_SESSION["session_nombres"] = $reg["nombres"];
            $_SESSION["session_username"] = $reg["cta_correo"];
                ?>
                  <script type='text/javascript'>
                      window.location='fichaactual.php';
                  </script>
                <?php
        }
       }
}

Es lo que quisera saber si tiene algo debil. Este codigo lo utilizo para validar si existe o no el usuario.

Y efectivamente en uno de los enlaces que me envias aparece la eplicacion del codigo malvado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Yoel
Val: 617
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por Yoel (197 intervenciones) el 16/09/2020 03:28:15
Hola y buenas noche zendi, según puedo ver en tu código puedes reforzar un poquito más la seguridad de tu inicio de sesión, colocando el siguiente método para proteger más tu query se llama pg_escape_string(). Este los puedes emplear en los valores que estas trayendo $_POST[], tanto para el usuario como para el pasword.

Ejemplo:

1
2
$username=pg_escape_string($_POST["correo1"]);
$pass=pg_escape_string($_POST["pass"]);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por zendi (1056 intervenciones) el 19/09/2020 16:55:55
Hola Yoel, de acuerdo entonces quedaria asi el codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public function validar()
{
    $username=pg_escape_string($_POST["correo1"]);
    $pass=pg_escape_string($_POST["pass"];)
    $sql="SELECT * FROM usuario WHERE cta_correo='$username' AND usuario_pass='$pass'";
    $res=pg_query(Conectar::con(),$sql);
    if (pg_num_rows($res)==0)
    {
        echo "<script type='text/javascript'>
        alert('La cuenta de Correo o la Contraseña no son Correctos o no Existen. Debe Registrarse.');
        window.location='solicitud.php';
        </script>";
    }
    else
    {
        if ($reg=pg_fetch_array($res))
        {
            session_start();
            $_SESSION["session_usuario"]=$reg["idusuario"];
            $_SESSION["session_nombres"] = $reg["nombres"];
            $_SESSION["session_username"] = $reg["cta_correo"];
            ?>
                <script type='text/javascript'>
                    window.location='fichaactual.php';
                </script>
            <?php
        }
    }
}
Seguire mejorandolo y a cualquier duda te escribo, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 121
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por Juan Luis ESP (35 intervenciones) el 16/09/2020 09:35:10
Buenas, zendi,

como ya te ha dicho Yoel, tienes que proteger más las variables que vayas a usar en la SQL.

Jamás, se debe usar en una SQL una variable que no esté filtrada, y menos tomarla directamente de un POST o un GET.

Postgres tiene la instrucción prepare y el bindParam para satinizar las variables y que no puedan inyectar código malicioso.

Por tu código, veo que guardas las claves en bruto, tal cual, en la base de datos. No se puede hacer eso. Siempre debes aplicarle una función de encriptado a la columna de password. Luego, cuando quieras comparar si la clave corresponde a la guardada, le aplicas a la variable GET['clave'] la misma función utilizada para encriptar la columna password y ya está.

Te dejo código de ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$db = getDB();
$st = $db->prepare("SELECT uid FROM users WHERE username=:username OR email=:email");
$st->bindParam("username", $username,PDO::PARAM_STR);
$st->bindParam("email", $email,PDO::PARAM_STR);
$st->execute();
$count=$st->rowCount();
if($count<1)
{
$stmt = $db->prepare("INSERT INTO users(username,password,email,name) VALUES (:username,:hash_password,:email,:name)");
$stmt->bindParam("username", $username,PDO::PARAM_STR) ;
$hash_password= hash('sha256', $password); //Password encryption
$stmt->bindParam("hash_password", $hash_password,PDO::PARAM_STR) ;
$stmt->bindParam("email", $email,PDO::PARAM_STR) ;
$stmt->bindParam("name", $name,PDO::PARAM_STR) ;
$stmt->execute();
$uid=$db->lastInsertId(); // Last inserted row id
$db = null;
$_SESSION['uid']=$uid;
return true;
}
else
{
$db = null;
return false;
}


Y otras consideraciones sobre tu código. No creo que sea lo más apropiado el devolver Javascript desde PHP. Quizás, lo más apropiado es que a la hora de renderizar tu plantilla html le pases desde php un "flag" que indique que ha habido un error.
Para hacer la redirección yo usaría
1
header("Location: fichaactual.php");

Y hablando de fichaactual.php, supongo que en dicha página compruebas que el usuario está perfectamente autenticado, no?


Mírate este artículo porque es exactamente lo que necesitas:
https://programacion.net/articulo/sistema_de_login_php_con_pdo_1467

Un saludo,
Juan Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por zendi (1056 intervenciones) el 19/09/2020 16:58:55
Hola Juan Luis, por lo visto en tu codigo en los INSERT tambien debo mejorarlo.

y tambien ajuste el codigo con
1
header("Location: fichaactual.php");
Dbo hacer esto en cada consulta Query?

Te aviso a cualquier duda. gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 121
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

inyeccion de codigo php

Publicado por Juan Luis ESP (35 intervenciones) el 19/09/2020 18:24:52
Buenas, Yoel

la forma en la que se construyen las SQLs cambia para que no te hagan inyecciones maliciosas. Así te aseguras de que tu código sea más correcto y seguro.

La redirección puedes hacerla una sola vez, al final del proceso, si la autenticación (login) ha sido correcta.

En tu código, la redirección iría en sustitución de este trozo de código:

1
2
3
4
5
?>
<script type='text/javascript'>
     window.location='fichaactual.php';
</script>
<?php

Y tal y como te comenté, en el php de fichaactual.php deberás comprobar que el usuario ya ha sido logueado correctamente, leyendo alguna variable de SESSION que hayas creado en el script de login, tal y como haces.

Un saludo!
Juan Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar