Foros del Web » Programando para Internet » PHP »

Panel Login Anti-SQl Inyection

Estas en el tema de Panel Login Anti-SQl Inyection en el foro de PHP en Foros del Web. Estoy con un panel el cual funciona, pero la idea es restringir los caracteres para evitar un Ataque SQL, la idea es realizarlo tanto en ...
  #1 (permalink)  
Antiguo 03/10/2012, 14:59
 
Fecha de Ingreso: octubre-2011
Ubicación: CABA
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 1
Panel Login Anti-SQl Inyection

Estoy con un panel el cual funciona, pero la idea es restringir los caracteres para evitar un Ataque SQL, la idea es realizarlo tanto en el Registro como en el Login, me dan una mano? Acá dejo los php.

Código PHP:
<?php
session_start
();
//datos para establecer la conexion con la base de mysql.
mysql_connect('localhost','xx','xx')or die ('Ha fallado la conexión: '.mysql_error());
mysql_select_db('xx')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
function 
quitar($mensaje)
{
    
$nopermitidos = array("'",'\\','<','>',"\"");
    
$mensaje str_replace($nopermitidos""$mensaje);
    return 
$mensaje;
}
if(
trim($_POST["usuario"]) != "" && trim($_POST["password"]) != "")
{
    
// Puedes utilizar la funcion para eliminar algun caracter en especifico
    //$usuario = strtolower(quitar($_POST["usuario"]));
    //$password = $_POST["password"];
    // o puedes convertir los a su entidad HTML aplicable con htmlentities
    
$usuario strtolower(htmlentities($_POST["usuario"], ENT_QUOTES));
    
$password $_POST["password"];
    
$result mysql_query('SELECT password, usuario FROM usuarios WHERE usuario=\''.$usuario.'\'');
    if(
$row mysql_fetch_array($result)){
        if(
$row["password"] == $password){
            
$_SESSION["k_username"] = $row['usuario'];
            echo 
'Has sido logueado correctamente '.$_SESSION['k_username'].' <p>';
            echo 
'<a href="index.php">Index</a></p>';
            
//Elimina el siguiente comentario si quieres que re-dirigir automáticamente a index.php
            /*Ingreso exitoso, ahora sera dirigido a la pagina principal.
            <SCRIPT LANGUAGE="javascript">
            location.href = "index.php";
            </SCRIPT>*/
        
}else{
  echo
'<script>alert("El usuario o contraseña son erroneos.");</script>';
  echo
'<SCRIPT LANGUAGE="javascript">
            location.href = "one.html";
            </SCRIPT>'
;
        }
    }else{
          echo
'<script>alert("El usuario o contraseña son erroneos.");</script>';
  echo
'<SCRIPT LANGUAGE="javascript">
            location.href = "one.html";
            </SCRIPT>'
;
    }
    
mysql_free_result($result);
}else{
     echo
'<script>alert("Debe especificar un usuario y password.");</script>';
 echo
'<SCRIPT LANGUAGE="javascript">
            location.href = "one.html";
            </SCRIPT>'
;
}
mysql_close();
?>
Código PHP:
<?php
session_start
();
//datos para establecer la conexion con la base de mysql.
mysql_connect('localhost','xxx','xx')or die ('Ha fallado la conexión: '.mysql_error());
mysql_select_db('xx')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
function 
formRegistro(){
?>
<form action="registrar.php" method="post">
Usuario (max 20): 
  <input type="text" name="username" size="20" maxlength="20" /><br />
Password (max 10): 
<input type="password" name="password" size="10" maxlength="10" />
Confirma: <input type="password" name="password2" size="10" maxlength="10" /><br />
Email (max 40): 
<input type="text" name="email" size="20" maxlength="40" /><br />
<input type="submit" value="Registrar" />
</form>
<?php
}
// verificamos si se han enviado ya las variables necesarias.
if (isset($_POST["username"])) {
    
$username $_POST["username"];
    
$password $_POST["password"];
    
$password2 $_POST["password2"];
    
$email $_POST["email"];
    
// Hay campos en blanco
    
if($username==NULL|$password==NULL|$password2==NULL|$email==NULL) {
        echo 
"un campo está vacio.";
        
formRegistro();
    }else{
        
// ¿Coinciden las contraseñas?
        
if($password!=$password2) {
            echo 
"Las contraseñas no coinciden";
            
formRegistro();
        }else{
            
// Comprobamos si el nombre de usuario o la cuenta de correo ya existían
            
$checkuser mysql_query("SELECT usuario FROM usuarios WHERE usuario='$username'");
            
$username_exist mysql_num_rows($checkuser);
            
$checkemail mysql_query("SELECT email FROM usuarios WHERE email='$email'");
            
$email_exist mysql_num_rows($checkemail);
            if (
$email_exist>0|$username_exist>0) {
                echo 
"El nombre de usuario o la cuenta de correo estan ya en uso";
                
formRegistro();
            }else{
                
$query 'INSERT INTO usuarios (usuario, password, email, fecha)
                VALUES (\''
.$username.'\',\''.$password.'\',\''.$email.'\',\''.date("Y-m-d").'\')';
                
mysql_query($query) or die(mysql_error());
                echo 
'El usuario '.$username.' ha sido registrado de manera satisfactoria.<br />';
                echo 
'Ahora puede entrar ingresando su usuario y su password <br />';

?>
Repito todo funciona, el problema está en que deja poner caracteres como >@/*+- lo que sea, y la idea es que no vayan a realizarle Sql inyection.
  #2 (permalink)  
Antiguo 03/10/2012, 16:06
 
Fecha de Ingreso: abril-2012
Mensajes: 124
Antigüedad: 12 años
Puntos: 3
Respuesta: Panel Login Anti-SQl Inyection

Yo suelo usar mysql_real_escape_string($texto) o a veces
htmlspecialchars(stripslashes(strip_tags($texto))) No se qual es mejor.


Código PHP:
$query sprintf("SELECT * FROM libros WHERE autor='%s'",

mysql_real_escape_string($autor_nombre));

mysql_query($query); 
Pero es muy buena idea sustituir los carácteres que dices, aunque habría que incluir los paréntesis para más seguridad.
  #3 (permalink)  
Antiguo 03/10/2012, 21:04
 
Fecha de Ingreso: octubre-2011
Ubicación: CABA
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Panel Login Anti-SQl Inyection

Código PHP:
function quitar($mensaje)
{
    
$nopermitidos = array("'",'\\','<','>',"\"");
    
$mensaje str_replace($nopermitidos""$mensaje);
    return 
$mensaje;

Esa parte venia en el código y la verdad no la entiendo, porque no funciona...

Antes utilizaba la funcion eregi (), pero en PHP 5.4 no va más.
  #4 (permalink)  
Antiguo 04/10/2012, 11:29
 
Fecha de Ingreso: octubre-2011
Ubicación: CABA
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Panel Login Anti-SQl Inyection

Intento cambiar la funcion eregi () por otra que dan en otros lugares y nada.
  #5 (permalink)  
Antiguo 04/10/2012, 13:53
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Panel Login Anti-SQl Inyection

Escapar o preparar los datos es suficiente para evitar ataques SQL, pero no evita ataques XSS, te recomiendo leer: http://www.forosdelweb.com/f18/aport...a-php-1011808/
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: html, login, mysql, panel, registro, sql, variables, usuarios
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 13:25.