PHP - proteger de inteccion de codigo

 
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

proteger de inteccion de codigo

Publicado por alejandro (1056 intervenciones) el 16/12/2021 22:40:17
necesito por favor una ayuda con respecto a proteger contra la inyeccion de codigo y tengo mi codigo de conexion:


<?php
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
require("PHPMailer-master/class.phpmailer.php");
require("PHPMailer-master/class.smtp.php");
session_start();
class Conectar
{
public static function con()
{
$conexion = "host=localhost port=5432 dbname=administra user=postgres password=RET_¡11";
$connect = pg_connect($conexion);
return $connect;
}
}
class Mantenimiento
{


public function validar()
{
$nombres=$_POST["nombres"];
$username=$_POST["correo1"];
$pass=$_POST["pass"];
$sql="SELECT * FROM propietarios WHERE cta_correo='$username' AND contrasena='$pass'";
$res=pg_query(Conectar::con(),$sql);
if (pg_num_rows($res)==0)
{
echo "<script type='text/javascript'>
alert('La Contraseña no Existe.');
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"];
$_SESSION["session_perfil"]=$reg["idpermiso"];
if ($_SESSION["session_perfil"]==1){
?>
<script type='text/javascript'>
window.location='menu1.php';
</script>
<?php
}
else{
?>
<script type='text/javascript'>
window.location='consulta_propietario.php';
</script>
<?php

}
}
}
}
}
quisiera saber como aplicar la proteccion sobre todo en esta parte del codigo:
$sql="SELECT * FROM propietarios WHERE cta_correo='$username' AND contrasena='$pass'";
mucho les agradezco la ayuda o la sugerencia.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

proteger de inteccion de codigo

Publicado por teayudo (5 intervenciones) el 16/12/2021 23:26:00
Ideal es utilizar procedimientos almacenados, ya que la BD tiene sus propios mecanismos de protección y por lo menos el código queda más aislado y menos propenso a ataques.

De emplear sentencias desde el front, lo ideal es no utilizar sentencias dinámicas, como lo que estás haciendo, eso de select * from propietarios WHERE cta_correo='$username' AND contrasena='$pass'"

Es muy peligroso. Utiliza mejor sentencias preparadas y parametrizadas, algo así:

$v_correo = $_POST["username"];
$v_clave = $_POST["pass"];

$stmt = mysqli_prepare("SELECT * FROM propietarios WHERE cta_correo = ? and contrasena=?");
$stmt->bindParam(1, $v_correo);
$stmt->bindParam(2, $v_clave);
$stmt->execute();

Importantísimo que desinfectes la entrada del usuario con mysql_real_escape_string() que básicamente, lo que hace es eliminar todos los caracteres especiales de una cadena para que pierdan su significado cuando los utilice la base de datos.

La clave es escapar bien lo que ingrese el usuario. Lo ideal es usar contaseñas numéricas de 6 digitos que da para claves muy seguras como las que usa la banca y que al ser numéricas, simplemente se valida que no ingresen caracteres diferentes de número, lo que reduce la posibilidad de que nos "claven" una inyección de este tipo:

SELECT * FROM propietarios WHERE cta_correo='$username' AND contrasena='$pass'"; DROP TABLE propietarios;

La anterior instrucción borra la tabla completa (Fisicamente), yo personalmente empleo como puerta de entrada el documento de identificación del usuario que generalmente es numérico, además de una clave igualmente numérica de 6 dígitos que da para casi un millón de combinaciones, que esto sea infalible no, pero algo de problemas le damos a los hackers.

Sobra decir que esas claves deben estar debidamente encriptadas en mysql con AES_ENCRYPT, nunca se te ocurra almacenar las claves tal cual.
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

proteger de inteccion de codigo

Publicado por alejandro (1056 intervenciones) el 16/12/2021 23:59:43
gracias amigo por responder, fijate yo tengo las consultas con postgresq.asi:
1
$sql="SELECT * FROM propietarios WHERE cta_correo='$username' AND contrasena='$pass'";
y las tuyas asi
1
$stmt = mysqli_prepare("SELECT * FROM propietarios WHERE cta_correo = ? and contrasena=?");
con mysql.

cual seria el equivalente para postgresql?
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

proteger de inteccion de codigo

Publicado por teayudo (5 intervenciones) el 17/12/2021 00:15:02
pg_prepare es la instrucción equivalente a mysqli_prepare para Postgress
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

proteger de inteccion de codigo

Publicado por alejandro (51 intervenciones) el 18/12/2021 18:27:12
Cuando mencionas estas líneas queda claro que se aplica a MySQL:Sobra decir que esas claves deben estar debidamente encriptadas en mysql con AES_ENCRYPT, nunca se te ocurra almacenar las claves tal cual.
Esto se aplica a postgresql también? estuve también investigando que puedo proteger a nivel de codigo con htmlidentities.
Pero dónde es más esencial proteger la BBDD? A NIVEL DE CODIGO? O AES_ENCRYPT SIRVE IGUAL PARA POSTGRESQL? DISCULPA MI DESCONOCIMIENTO.
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

proteger de inyeccion de codigo

Publicado por alejandro (1056 intervenciones) el 19/12/2021 20:55:04
bueno seguí tus sugerencias y he aplicado esta función pg_prepare que me aconsejas ya que tengo postgresql y he colocado htmlentities por supuesto todo eso a nivel de código.
1
$stmt =pg_prepare("SELECT * FROM propietarios WHERE cta_correo = ? and contrasena=?");
ahora yo pregunto: debo aplicar esto a los INSERT?
Por favor ayudenme con este caso.
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

proteger de inyeccion de codigo

Publicado por teayudo (5 intervenciones) el 19/12/2021 22:08:02
Si así es, toda sentencia SQL sea un insert, update, delete y select deben quedar construidas mediante mysqli_prepare, porque toda sentencia es susceptible de SQL Injection.

Ideal siempre será que se haga mediante procedimientos almacenados, por razones obvias, y evitar disparar sentencias SQL desde el front, ya que esto genera lentitud, pues el aplicativo tendrá siempre que verificar que su sintaxis sea correcta, genera más tráfico de red, mientras esa sentencia se procesa y viaja para traer de vuelta los datos, mientras con PA solo envías los parámetros indicados y el se gestiona allá en el servidor y te devuelve las cosas más rápido y eficientemente
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

proteger de inyeccion de codigo

Publicado por teayudo (5 intervenciones) el 19/12/2021 22:32:23
Lo otro que me faltó contestar es lo del AES (Advanced Encryption Standard), que aplica para Mysql

Pero Postgress maneja el pgcrypto que permite encriptar un texto dado y funciona un tanto similar a la que te mencioné de mysql

Las claves se deben proteger tanto en el front como en la BD, imaginate que alguien que tenga acceso al servidor y haga un select a la tabla de usuarios y veas las claves tal cual.

Mirar el enlace:

http://rafinguer.blogspot.com/2019/08/encriptacion-de-columnas-en-postgresql.html
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

proteger de inyeccion de codigo

Publicado por alejandro (1056 intervenciones) el 30/12/2021 17:12:17
Hola, estoy mirando el post el asunto es que lo miro tarde ya que no tengo internet pero muy interesante el enlace que me sugeriste, lo voy a aplicar. 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