php: ikiliğe ters mysql_real_escape_string olan etkileri

4 Cevap php

Kullanıcıların daha sonra geri alma için MEDIUMBLOB bir MySQL veritabanı içine sokulan bir PDF sunabilirsiniz bir web sayfasını inşa.

Bu, tüm PDF resimlerin bozuk durumda görüntüleri veya gömülü yazı tipleri içerir ve yazı tipini kullanarak herhangi bir metin (Acrobat eksik yazı hakkında bir mesaj görüntüler) kaybolur dışında çalışıyor.

Ben sorun benim mysql_real_escape_string_function aracılığıyla pdf veri geçirerek meydana gelir tespit ettik. Ben tüm yeni dosyalar için sorun sabit gönderme / alma üzerinde base64_encode/base64_decode açtınız, ama ben okumak gerekiyor yaklaşık 25 zaten teslim PDF'leri var.

Bu mysql_real_escape_string etkilerini tersine mümkün mü? Ya bu dosyaları tamir edilemeyecek zarar görmüş?

4 Cevap

mysql_real_escape_string() Bu karakterlere ters eğik çizgi koyar.

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

Şey, bunu düzeltmek için çok zor olabilir, ikili çıkış backslash'lar varsa o ikili veri bulunuyor olmasıdır. Söyleniyor, bu işlevi geri almak için hiçbir sihirli işlevi yoktur.

Tabii, tamir edilebilir olmalıdır. Sadece exactly ne mysql_real_escape_string yapar anlamaya ihtiyacımız var. Ben sadece hemen CR, LF, TAB, tek tırnak, çift tırnak, NUL, ya da başka bir eğik çizgi koyun herhangi bir bölü çizgisi kaldırmak gerektiğine inanıyorum. Bir tek satır sıradanifade düzeltme olmalı.

Ben dürüst başka ne olabilir bilmiyorum. Ben bu kod biraz değişti zaman sorun giderilebilir, ve insanlar aynı sorun (ama hiçbir çözüm) olduğu yerde çevrimiçi diğer örneklerini buldum.

Burada ekleme kodu:

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

Ve burada çıkarma kodu:

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

, Ólafur

Ben php manuel ve hatta aşağıdaki çalıştı toplandı:

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

Bu metin ile uğraşırken çalışıyor gibi görünüyor, ancak ikili verilere uygulamaya sadece daha fazla (örneğin paragraf eksik gitmek) PDF düşürür.