2009-05-19 7 views
1

にmysql_real_escape_stringのの効果を逆転させる、私は、ユーザーがその後の検索のためにMEDIUMBLOBでMySQLデータベースに挿入されたPDFを提出することができ、Webページを構築しました。PHP:バイナリ

これはすべて、PDF、画像が破損して、フォントを使用して、任意のテキストが(Acrobatが不足しているフォントについてのメッセージを表示)が消えている場合には、画像または埋め込まれたフォントを、含まれている場合を除き、正常に動作します。

私はこの問題は、私がmysql_real_escape_string_functionてPDFデータを渡すから発生して決定しました。私はbase64_encode/base64_decodeをsubmission/retrievalに変更して、すべての新しいファイルの問題を修正しましたが、私は約25個の既に提出されたPDFを読めるようにする必要があります。

mysql_real_escape_stringの効果を元に戻すことはできますか?または、これらのファイルが修復を超えて損傷していますか?

答えて

0

確かに、修正する必要があります。 正確にのmysql_real_escape_stringの機能を理解するだけです。 CR、LF、TAB、一重引用符、二重引用符、NUL、または別のスラッシュの直前にあるスラッシュを削除するだけでよいと思います。 1行の正規表現の修正でなければなりません。

1

mysql_real_escape_string()は、これらの文字にバックスラッシュを挿入します。

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

バイナリ出力にバックスラッシュがあると、それはバイナリデータなので、修正するのが非常に難しくなります。つまり、この機能を元に戻すという魔法のような機能はありません。

0

私は正直なところ、他に何ができるか分かりません。そのコードを変更すると問題が解決し、同じ問題(解決策はありません)があった他のインスタンスがオンラインで見つかりました。ここで

は、挿入コードです:

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

そして、ここでは抽出コードです:

$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

オラフル、

私はPHPのマニュアルからのことを集め、さらに次のことを試してみました:

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

これは、テキストを扱うときにはうまくいくようですが、バイナリデータに適用するとPDF(例:段落がなくなる)。

+0

あなたは、その基準に適合する通常のデータを持つことができます。つまり、修正が難しいのです。 –