php: изменение эффектов mysql_real_escape_string на двоичный файл - PullRequest
1 голос
/ 20 мая 2009

Я создал веб-страницу, где пользователи могут отправлять PDF-файл, который затем вставляется в базу данных MySQL в медиа-блок для последующего извлечения.

Это все работает нормально, за исключением случаев, когда PDF-файл содержит изображения или встроенные шрифты, в этом случае изображения повреждены и любой текст, использующий шрифт, исчезает (Acrobat отображает сообщение об отсутствующем шрифте).

Я определил, что проблема возникает из-за моей передачи pdf-данных через функцию mysql_real_escape_string_function. Я перешел на base64_encode / base64_decode при отправке / извлечении, который устранил проблему для всех новых файлов, но у меня есть около 25 уже отправленных PDF-файлов, которые мне нужно прочитать.

Возможно ли обратить вспять эффекты mysql_real_escape_string? Или эти файлы не подлежат восстановлению?

Ответы [ 4 ]

1 голос
/ 20 мая 2009

mysql_real_escape_string() ставит обратную косую черту этим символам.

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

Дело в том, что если ваш двоичный вывод имеет обратную косую черту, то это двоичные данные, это может быть очень трудно исправить. При этом нет магической функции, чтобы отменить эту функцию.

0 голосов
/ 20 мая 2009

Олафур

Я понял это из руководства по php и даже попробовал следующее:

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

Кажется, это работает нормально при работе с текстом, но применение его к двоичным данным только ухудшает PDF (например, пропадают параграфы).

0 голосов
/ 20 мая 2009

Честно говоря, я не знаю, что еще это может быть. Когда я изменил этот фрагмент кода, это прояснило проблему, и я обнаружил в Интернете другие случаи, когда люди сталкивались с той же проблемой (но без решений).

Вот код вставки:

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 голосов
/ 20 мая 2009

Конечно, должно быть исправимо. Вам просто нужно выяснить точно , что делает mysql_real_escape_string. Я считаю, что вам просто нужно удалить любые косые черты, которые непосредственно предшествуют CR, LF, TAB, одинарные кавычки, двойные кавычки, NUL или другие косые черты. Должно быть исправление регулярного выражения в одну строку.

...