2009-05-19 4 views
1

Ich baute eine Webseite, wo Benutzer eine PDF senden können, die dann in eine MySQL-Datenbank in einem Mediumblob für den Abruf später eingefügt wird.php: Umkehrung mysql_real_escape_string Auswirkungen auf binäre

Dies funktioniert alles gut, außer wenn die PDF-Datei Bilder oder eingebettete Schriftarten enthält. In diesem Fall sind die Bilder beschädigt und der Text mit der Schriftart verschwindet (Acrobat zeigt eine Meldung über die fehlende Schriftart an).

Ich habe festgestellt, dass das Problem auftritt, indem ich die pdf-Daten durch die mysql_real_escape_string_function übergeben. Ich bin auf base64_encode/base64_decode beim Senden/Abrufen gewechselt, was das Problem für alle neuen Dateien behoben hat, aber ich habe ungefähr 25 bereits eingereichte PDFs, die ich lesen kann.

Ist es möglich, die Auswirkungen von mysql_real_escape_string umzukehren? Oder sind diese Dateien irreparabel beschädigt?

Antwort

0

Sicher, sollte reparierbar sein. Sie müssen nur herausfinden, genau was mysql_real_escape_string tut. Ich glaube, Sie müssen nur Schrägstriche entfernen, die unmittelbar vor einem CR, LF, TAB, Anführungszeichen, Anführungszeichen, NUL oder einem anderen Schrägstrich stehen. Sollte ein One-Line-Regexp-Fix sein.

1

mysql_real_escape_string() setzt Backslashes auf diese Zeichen.

Die Sache ist, dass, wenn Ihre binäre Ausgabe Backslashes hat es binäre Daten, kann es sehr schwer zu beheben. Abgesehen davon gibt es keine magische Funktion, um diese Funktion rückgängig zu machen.

0

Ich weiß ehrlich nicht, was es sonst noch sein könnte. Als ich diesen Code änderte, klärte es das Problem auf, und ich habe andere Instanzen online gefunden, wo Leute das gleiche Problem hatten (aber keine Lösungen). Hier

ist das Einfügen Code:

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; 
} 

Und hier ist der Extraktionscode:

$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,

ich gesammelt, dass aus dem PHP-Handbuch, und versuchte sogar, die folgend :

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

Dies scheint im Umgang mit Text gut zu funktionieren, aber die Anwendung auf die Binärdaten verschlechtert nur die PDF-Datei (z. Absätze fehlen).

+0

Sie könnten regelmäßige Daten haben, die diesen Kriterien entsprechen, deshalb ist es schwer zu beheben. –