Codigo PHP vulnerable

Iniciado por Juanpi123321, 6 Junio 2018, 01:08 AM

0 Miembros y 1 Visitante están viendo este tema.

Juanpi123321

hola que tal quisiera saber que esta mal en el siguiente codigo, osea cuales serian las debilidades, referidas al tema de la seguridad y un poco sobre el tema SQL Injection.
Le puse puntos xq no me deja identar correctamente.



Codigo PHP vulnerable

Código (php) [Seleccionar]
<?
$mysqli = new mysqli('localhost','root', ,'seguridad');
if($mysqli->connect_errno){
    echo 'error db';
}

$id=$_GET['id'];
if(isset($id) && !empty($id)){

    $sql = "SELECT text,title FROM news where id=" $id;
    #echo $sql;
   
    $q = $mysqli->query($sql) or mysql_error();
    $row = $q->fetch_assoc();
   
    if(isset($row['title'])){
        echo 'Titulo: '  $row['title'];
        echo "<br>";
        echo 'Texto: ' $row['text'];
        echo "<br>";
    }

}
else{
    echo 'pase algun valor en la variable id';
}

?>



· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

engel lex

$id=$_GET['id'];
$sql = "SELECT text,title FROM news where id=".$id;


allí se puede filtrar una peticion (y ese codigo tiene errores)

estudia sobre sql injection pero podría pasar solo viendolo sin mucho detalle

url,com/id?1' or '1'='1

esto hará que los datos detornados sean de todos los id... es el clasico codigo de principios de los 2000 para mostrar como una pagina era vulnerable
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

LaThortilla (Effort)

Cita de: engel lex en  6 Junio 2018, 01:17 AM
$id=$_GET['id'];
$sql = "SELECT text,title FROM news where id=".$id;


allí se puede filtrar una peticion (y ese codigo tiene errores)

estudia sobre sql injection pero podría pasar solo viendolo sin mucho detalle

url,com/id?1' or '1'='1

esto hará que los datos detornados sean de todos los id... es el clasico codigo de principios de los 2000 para mostrar como una pagina era vulnerable

Exactamente por eso debes utilizar http://php.net/manual/es/mysqli.real-escape-string.php

#!drvy

#3
- Aprende a utilizar sentencias preparadas.
- Intenta tener un control (más o menos) sobre los datos que manejas. Si usas el ID únicamente como un integro, asegúrate que es un integro.
- Usar isset y empty viene a ser algo así como comprobar que tienes las llaves en el bolsillo y sacarlas del bolsillo para comprobar que las tienes... a la vez.
- Aprende a utilizar Try/Catch en vez de usar el "OR ELSE".

Código (php) [Seleccionar]
<?php

mysqli_report
(MYSQLI_REPORT_STRICT MYSQLI_REPORT_ALL);
$mysqli = new mysqli('localhost''root''contraseña','seguridad');

if(
$mysqli->connect_errno){
    die(
'error db');
}


if(!empty(
$_GET['id'])){

    
// con (int) te aseguras que manejas un integro.
    
$id = (int) $_GET['id'];

    
// sentencia preparada
    
$query "SELECT text,title FROM news where id=?";

    try {

        
$stmt $mysqli->prepare($query);
        
$stmt->bind_param('i'$id); // i de integer.
        
$stmt->execute();
        
$result $stmt->get_result();
        
$stmt->close();


        
// Si la consulta devuelve 1 o más resultados...
        // recogemos el resultado.

        
if($result->num_rows 0){
            
$result $result->fetch_assoc();
        } else {
            
$result false;
        }

    
// Si hay error en la consulta...
    
} catch(Exception $e){
        die(
'Error con la consulta -> '$e->getMessage());
    }


    
// Resultado.
    
if($result){
        
print_r($result);
    } else {
        echo 
'No hay resultados.';
    }

} else {
    echo 
'Haga una consulta al ID.';
}



Referencias:
http://php.net/manual/es/mysqli.prepare.php
http://php.net/manual/es/language.types.integer.php (#Conversión de numeros a enteros).
http://php.net/manual/en/mysqli-stmt.bind-param.php
http://php.net/manual/es/mysqli-stmt.get-result.php
http://php.net/manual/es/class.exception.php

Saludos