Hola colegas, buen día, necesito de su ayuda para este tema, resulta que el proyecto web que estoy desarrollando, el cliente hizo que lo atacaran para poder ver la vulnerabilidad de este, para los resultados me dijeron que mi script ajax_loging.php era vulnerable a inyección de código... Yo nose mucho sobre eso, pero leyendo lo que yo habia hecho era "sanitizar" las variables recibidas en el input en una función y ya devolverlas "limpias" a mi script para que enviara la query a BDD... y tambien tengo una validacion del lado del cliente con JS , pero bueno se que JS es mas facil de burlar que las validaciones a nivel Servidor... les comparto cual es mi script y la funcion que uso para sanitizar las variables.
ajax_login.php
Código PHP:
Ver original//EN ESTE ARCHIVO TENGO MIS FUNCIONES PARA SANITIZAR LAS VARIABLES
include "security.php";
if (isset($_POST['bandera'])){ function verificar_login($username,$password)
{
$consulta= "SELECT id_user,id_profile,username,pass,id_canal,clave_suc,logeado FROM users WHERE username='$username' and pass='$password'";
include "conexion.php";
$idprofile="";
$iduser="";
{
$accion="FALLO INICIO DE SESION";
$origen=$_SERVER['REMOTE_ADDR'];
generaLogs($username,$accion,$origen);
echo "Usuario no Encontrado";
}else{
{
$logeado=$row['logeado'];
if ($logeado=="1"){
//header("Location:yaestalogeado.html"); // rediriges al index
echo "logeado";
$accion="USUARIO YA TENIA UNA SESION ABIERTA";
$origen=$_SERVER['REMOTE_ADDR'];
generaLogs($username,$accion,$origen);
}else {
//Actualizar tabla de users poniendo el estado de logeado en verdadero
$consulta2= "UPDATE users SET logeado=true WHERE username='$username'";
include "conexion.php";
$accion="USUARIO INICIA SESION EN EL SISTEMA";
$origen=$_SERVER['REMOTE_ADDR'];
generaLogs($username,$accion,$origen);
//recupera el usuario
$nameUser=$row['username'];
//RECUPERAr columna id_ perfil
$idprofile=$row['id_profile'];
//GUARDAMOS DATOS NECESARIOS EN VARIABLES DE SESION
//ESTO PARA QUE PUEDAN SER UTILIZADOS EN CUALQUIER MOMENTO DURANTE LA SESION
$_SESSION["id_user"] =$iduser;
$_SESSION["u_name"] =$nameUser;
echo $idprofile;
}//end usuario no logeado
}//end while
}//END else usuario encontrado
//mysql_close();
}//termina function verifica_login
if(trim($_POST["user_name"])!= ""&& trim($_POST["password"])!= "") {
//recibo las variables y las sanitizo con la funcin Securityu
$pass = trim(Security
($_POST["password"])); //$pwd=$_POST['password'];
//$pwd=hash('sha256', $pass);
$pwd=sha1($_POST['password']); //LO QUE HAGO AQUI ES ENVIAR LAS VARIABLES CACHADAS POR POST A MI
//FUNCION QUE "SANITIZA" LAS VARIABLES PARA EVITAR INYECCION DE CODIGO //SQL
verificar_login($user,$pwd);
}else{
echo "no";
}
}else{
header("Location:error.php"); // rediriges al index }
?>
Ahora les comprato la funcion que utilizo para sanitizarlas.
security.php
Código PHP:
Ver original<?php
// Modificamos las variables pasadas por URL
foreach( $_GET as $variable => $valor ){
$_GET [ $variable ] = str_replace ( "'" , "'" , $_GET [ $variable ]); }
// Modificamos las variables de formularios
foreach( $_POST as $variable => $valor ){
$_POST [ $variable ] = str_replace ( "'" , "'" , $_POST [ $variable ]); }
// Modificamos las variables pasadas por URL
function Security($_Cadena) {
//falta agregar * si es necesario
$nopermitidos = array("'",'´','~','¨',' ','/','@','#','&','$','!','¡','?','¿','=','(',')','\\','[',']','{','}','_','-','%','<','>','+','|',';',"\""); //return mysql_real_escape_string($_Cadena);
}
?>
Segun lo que lei con eso se puede evitar la inyección de codigo, aunque como les digo, la verdad no se como lo hacen o por donde lo hacen,yo supongo que es atraves de los inputs del formulario y de la URL... se supone que Security.php sanitiza tanto las variables pasadas por URL(_GET) como las que van por el input (_POST)
Podrian decirme si esto no srive, o cual es la mejor forma de evitar la inyeccion de codigo a nivel servidor??.... Estoy migrando mi API de MYSQL a MySQLI, y ahi incluyho esta instruccion
Código PHP:
Ver original$username = $mysqli->real_escape_string($username);
$password = $mysqli->real_escape_string($password);
Esto apenas lo estoy desarrollando por que estoy aprendiendo MySQLI ( cuando me entere que MYSQL de PHP estaba deprecada

)
Gracias de antemano por sus comentarios. Saludos!