2009-05-19 4 views
1

J'ai construit une page Web où les utilisateurs peuvent soumettre un PDF qui est ensuite inséré dans une base de données MySQL dans un blob de taille moyenne pour être récupéré plus tard. Cela fonctionne très bien, sauf lorsque le PDF contient des images ou des polices incorporées, auquel cas les images sont corrompues et tout texte utilisant la police disparaît (Acrobat affiche un message à propos de la police manquante).php: inversion des effets de mysql_real_escape_string sur un binaire

J'ai déterminé que le problème se produisait lorsque je transmettais les données pdf via la fonction mysql_real_escape_string_function. Je suis passé à base64_encode/base64_decode lors de la soumission/récupération qui a résolu le problème pour tous les nouveaux fichiers, mais j'ai environ 25 PDF déjà soumis que je dois pouvoir lire.

Est-il possible d'inverser les effets de mysql_real_escape_string? Ou sont ces fichiers endommagés au-delà de la réparation?

Répondre

0

Bien sûr, devrait être réparable. Vous avez juste besoin de comprendre exactement ce que fait mysql_real_escape_string. Je crois que vous avez juste besoin de supprimer les barres obliques qui précèdent immédiatement un CR, LF, TAB, guillemet simple, guillemet double, NUL, ou une autre barre oblique. Devrait être une correction d'une ligne rationnelle.

1

mysql_real_escape_string() met des barres obliques inversées à ces caractères.

\x00, \n, \r, \, ', " and \x1a 

La chose est, que si votre sortie binaire a antislashs il c'est des données binaires, il peut être très difficile à corriger. Cela étant dit, il n'y a pas de fonction magique pour annuler cette fonction.

0

Honnêtement, je ne sais pas ce que ça pourrait être. Quand j'ai changé ce peu de code, j'ai résolu le problème, et j'ai trouvé d'autres instances en ligne où les gens avaient le même problème (mais pas de solutions).

Voici le code d'insertion:

function db_value($mysqli, $value) { 
if(empty($value)) 
    return "''"; 

if(get_magic_quotes_gpc()) 
    $value = stripslashes($value); 

if(!is_numeric($value) || ($value[0] == '0' && $value != 0)) 
    $value = "'".mysqli_real_escape_string($mysqli, $value)."'"; 

return $value; 
} 

function saveToDatabase($data, $fileTempName, $abstractFileName) { 
$fileHandle = fopen($fileTempName, 'r'); 
$abstractFile = fread($fileHandle, filesize($fileTempName)); 
fclose($fileHandle); 
$abstractFileMimeType = $fileUpload->get_mime(); 

$mysqli = connect_to_database(); 

if($mysqli != FALSE) { 
    $insertQuery = "INSERT INTO `paper_submissions` (
     `name`, 
     `affiliation`, 
     `email`, 
     `phone_number`, 
     `title`, 
     `abstract`, 
     `abstract_file`, 
     `abstract_file_name`, 
     `abstract_file_mime_type`, 
     `requests_financial_support`, 
     `HTTP_USER_AGENT`, 
     `REMOTE_ADDR` 
    ) 
    VALUES ( 
     ".db_value($mysqli, $data['submitter_name']).", 
     ".db_value($mysqli, $data['submitter_affiliation']).", 
     ".db_value($mysqli, $data['submitter_email']).", 
     ".db_value($mysqli, $data['submitter_phone']).", 
     ".db_value($mysqli, $data['paper_title']).", 
     ".db_value($mysqli, $data['abstract_text']).", 
     ".db_value($mysqli, $abstractFile).", 
     ".db_value($mysqli, $abstractFileName).", 
     ".db_value($mysqli, $abstractFileMimeType).", 
     ".db_value($mysqli, $data['request_financial_support']).", 
     ".db_value($mysqli, $_SERVER['HTTP_USER_AGENT']).", 
     ".db_value($mysqli, $_SERVER['REMOTE_ADDR'])." 
    )"; 

    $insertResult = $mysqli->query($insertQuery); 

    close_database($insertResult, $mysqli); 

    return $insertResult; 
} 

return FALSE; 
} 

Et voici le code d'extraction:

$selectQuery = "SELECT `abstract_file_name`, `abstract_file_mime_type`, `abstract_file` 
FROM `paper_submissions` 
WHERE `id` = ".db_value($mysqli, $id); 


$result = $mysqli->query($selectQuery); 

if($result != FALSE) { 
if($result->num_rows) { 
    $paper = $result->fetch_array(MYSQL_ASSOC); 

    $fileSize = strlen($paper['abstract_file']); 

    header('Date: '.gmdate("D, d M Y H:i:s").' GMT'); 
    header('Expires: Thu, 19 Nov 1981 08:52:00 GMT'); 
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: no-cache'); 
    header('Content-Type: '.$paper['abstract_file_mime_type'].'; charset=utf-8'); 
    header('Content-Length: '.$paper['abstract_file_size']); 
    header('Content-Disposition: inline; filename="'.$paper['abstract_file_name'].'"'); 
    echo $paper['abstract_file']; 
    exit(); 
} 
} 
0

Ólafur,

Je recueilli que du manuel php, et même essayé ce qui suit :

$search = array("\\0", "\\n", "\\r", "\\\\", "\\'", "\\\"", "\Z",); 
$replace = array("\x00", "\n", "\r", "\\", "'", "\"", "\x1a"); 
$desiredString = str_replace($search, $replace, $escapedString); 

Cela semble fonctionner correctement avec le texte, mais l'appliquer uniquement aux données binaires dégrade davantage le PDF (par ex. paragraphes manquants).

+0

Vous pourriez avoir des données régulières qui répondent à ces critères, c'est pourquoi c'est difficile à corriger. –

Questions connexes