【问题标题】:php: reversing mysql_real_escape_string's effects on binaryphp: 反向 mysql_real_escape_string 对二进制文件的影响
【发布时间】:2010-10-27 11:32:07
【问题描述】:

我建立了一个网页,用户可以在其中提交 PDF,然后将其插入到 MySQL 数据库中的 mediumblob 中以供以后检索。

这一切正常,除非 PDF 包含图像或嵌入字体,在这种情况下图像已损坏并且使用该字体的任何文本都会消失(Acrobat 会显示有关丢失字体的消息)。

我已经确定问题发生在我通过 mysql_real_escape_string_function 传递 pdf 数据时。我已在提交/检索时切换到 base64_encode/base64_decode,这解决了所有新文件的问题,但我有大约 25 个已经提交的 PDF 文件我需要能够阅读。

是否可以反转mysql_real_escape_string的效果?还是这些文件已损坏无法修复?

【问题讨论】:

    标签: php mysql pdf binary blob


    【解决方案1】:

    当然,应该可以修复。您只需要确切地弄清楚 mysql_real_escape_string 的作用。我相信您只需要删除紧接在 CR、LF、TAB、单引号、双引号、NUL 或其他斜杠之前的任何斜杠。应该是单行正则表达式修复。

    【讨论】:

      【解决方案2】:

      mysql_real_escape_string() 为这些字符添加反斜杠。

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

      问题是,如果您的二进制输出带有反斜杠,则它是二进制数据,则可能很难修复。话虽如此,没有神奇的功能可以撤消此功能。

      【讨论】:

        【解决方案3】:

        老实说,我不知道还有什么可能。当我更改那段代码时,问题就解决了,而且我在网上发现了其他人们遇到同样问题的实例(但没有解决方案)。

        这是插入代码:

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

        【讨论】:

          【解决方案4】:

          奥拉弗,

          我从 php 手册中收集到,甚至尝试了以下方法:

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

          这在处理文本时似乎效果很好,但将其应用于二进制数据只会进一步降低 PDF 的质量(例如,段落丢失)。

          【讨论】:

          • 您可以拥有符合该标准的常规数据,这就是它难以修复的原因。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 2012-03-23
          • 1970-01-01
          • 2012-11-23
          • 1970-01-01
          • 2017-10-04
          相关资源
          最近更新 更多