2010-08-18 79 views
7

que estaba aprendiendo el código PHP de un tutorial para subir archivosayuda para entender magic_quotes_gpc()

<form method="post" enctype="multipart/form-data"> 
    <input name="userfile" type="file" id="userfile"> 
</form> 

<?php 
    if (isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) { 
    $fileName = $_FILES['userfile']['name']; 
    $tmpName = $_FILES['userfile']['tmp_name']; 
    $fileSize = $_FILES['userfile']['size']; 
    $fileType = $_FILES['userfile']['type']; 

    $fp  = fopen($tmpName, 'r'); 
    $content = fread($fp, filesize($tmpName)); 
    $content = addslashes($content); 
    fclose($fp); 

    if (!get_magic_quotes_gpc()) { 
    $fileName = addslashes($fileName); 
    } 

    include 'library/config.php'; 
    include 'library/opendb.php'; 

    $query = "INSERT INTO upload (name, size, type, content) ". 
    "VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; 

    mysql_query($query) or die('Error, query failed'); 
    include 'library/closedb.php'; 

ahora entiendo todas las funciones y todo mediante el uso de documentación de PHP

SALVO

get_magic_quotes_gpc() 
  • ¿Qué es? ¿Que hace?
  • ¿Es esteencial? Si es así, ¿hay un reemplazo para esto?
  • el Manual de PHP dijo "Esta característica ha sido DEPURADA a partir de PHP 5.3.0. Se desaconseja confiar en esta característica.". Elaborar por favor?
  • no hay una manera de subir archivos al servidor (web) discos duros y proporcionar enlaces a los mismos ..
+1

Este código es vulnerable a la inyección SQL, independientemente de magic_quotes, usted debe darle una etiqueta [de seguridad] si desea una mejor respuesta. Quien escribió esto no entiende php o seguridad. – rook

+0

bien si prohíbe la entrada del carácter '(comillas) en mi entrada (cuadro de texto) entonces aseguraré la inyección de SQL, no ... – Moon

Respuesta

15

get_magic_quotes_gpc() es una función que comprueba la configuración (php.ini) y devuelve 0 si magic_quotes_gpc está desactivado (de lo contrario, devuelve 1).

Cuando magic_quotes están encendidas, todo '(comilla simple), "(comillas dobles), \ (barra invertida) y NULs se escaparon con una barra invertida de forma automática. Esto es para evitar todo tipo de problemas de seguridad de la inyección.

En su caso, el código comprueba si la configuración está desactivada y agrega barras para escaparse correctamente del contenido para evitar la inyección SQL

Como usted dijo: esta función está obsoleta y sin duda será eliminada en el futuro (de hecho se eliminaron) en PHP6).

La alternativa es escapar de los datos en tiempo de ejecución según sea necesario

+0

impresionante .... no podría haber dado una mejor explicación ... hombre, ¿puedes reescriba el Manual de PHP para que el mundo entienda – Moon

+1

Las únicas adiciones que haría es decir que trata de prevenir problemas de seguridad de inyección. No hace un buen trabajo (y de ahí el motivo de funciones como 'mysql_real_escape_string'). Y en segundo lugar, nunca lo use ('magic_quotes_gpc'). Si la función devuelve verdadero (está habilitado), ejecute 'stripslashes' en todas las entradas. A continuación, enlaza tus parámetros a través de una consulta preparada o utiliza 'mysql_real_escape_string/mysqli :: real_escape_string'. ** No confíe en 'magic_quotes_gpc' ** ... Hay una razón por la que está en desuso ... (y su código publicado en la pregunta es vulnerable debido a eso) ... – ircmaxell

+0

Quiere decir que solo precede una barra' \ 'a cualquier entidad/carácter html? –

0

después de leer su correo y todas las respuestas y los comentarios que creo que esta función puede ayudar,

function mysql_prep($value) { 
    $magic_quotes_active = get_magic_quotes_gpc(); 
    $new_enough_php = function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0 
    if($new_enough_php) { // PHP v4.3.0 or higher 
     // undo any magic quote effects so mysql_real_escape_string can do the work 
     if($magic_quotes_active) { $value = stripslashes($value); } 
     $value = mysql_real_escape_string($value); 
    } else { // before PHP v4.3.0 
     // if magic quotes aren't already on then add slashes manually 
     if(!$magic_quotes_active) { $value = addslashes($value); } 
     // if magic quotes are active, then the slashes already exist 
    } 
    return $value; 
} 
Cuestiones relacionadas