2013-07-31 2 views
0

Я пытаюсь создать страницу PHP, которая будет безопасно принимать загрузку файла (резюме), хранить его как blob mysql и предоставлять загрузку позже. Но когда я загружаю PDF-файлы позже для просмотра, они всегда кажутся поврежденными и не будут открываться должным образом.PHP: защищает ли base64_encode от инъекций mysql?

Благодаря вопрос по Jgoettsch (php: reversing mysql_real_escape_string's effects on binary), я понял, что скармливание данные файла через mysql_real_escape_string (для предотвращения инъекции) может развратить содержимое файла, и появилась идея передать двоичный файл через base64_encode() вместо этого, и использовать base64_decode() перед загрузкой.

Вот некоторый макет код демонстрирует, что я делаю в данный момент (который не работает):

Выгрузка:

<? 
// Get file contents 
$cv_pointer = fopen($_FILES['cv']['tmp_name'], 'r'); 
$cv_content = fread($cv_pointer, filesize($_FILES['cv']['tmp_name'])); 
fclose($cv_pointer); 

// Insert SQL 
$sql = sprintf("INSERT INTO documents (name, file, size, date_uploaded) 
    VALUES ('%s', '%s', '%s', NOW())", 
    mysql_real_escape_string($_FILES['cv']['name']), 
    mysql_real_escape_string($cv_content), 
    mysql_real_escape_string($_FILES['cv']['size'])); 
$result = mysql_query($sql); 
?> 

И скачать:

<? 
if (isset($_GET['view_cv'])) { 
    $cv = mysql_fetch_assoc($rsApplicationCv); 

    header("Content-length: ".$cv['size']); 
    header("Content-type: application/pdf"); 
    header("Content-disposition: attachment; filename=".$cv['name']); 
    echo $cv['file']; 
    exit(); 
} 
?> 

Вот мои вопросы:

  1. I f у вас есть поле для загрузки файлов, это поле уязвимо для SQL-инъекции? Или я беспокоюсь излишне? Очевидно, что эта задача загрузки файлов была бы намного проще, если бы я мог просто передать двоичный код в поле blob без каких-либо переводов.
  2. Если я загружаю содержимое загруженного файла через base64_encode(), это равносильно дезинфекции? или я должен закодировать его, а затем передать закодированную строку через mysql_real_escape_string?
  3. Это все, что вам нужно, чтобы сохранить и извлечь PDF-файл. Есть ли более простое решение этой общей потребности, которую я еще не наткнулся?

Заранее благодарен!

+1

Ответ: ** НЕТ ** –

+2

Используйте mysqli или PDO с подготовленными запросами и заполнителями, которые должны решить проблему с кодировкой и впрыском. – Barmar

+2

Это безопасно от инъекции таким же образом, что НЕ набивая вилку в электрическую розетку, защищайте вас от поражения электрическим током. Правило для уязвимости в отношении инъекций: если вы используете «внешние» данные в запросе, то вы уязвимы. Не имеет значения, откуда поступают данные, даже если это от СЕБЯ. Вы можете легко добавить свои собственные запросы. –

ответ

1

Q Если у вас есть поле для загрузки файлов, это поле уязвимо для SQL-инъекции?

да (вроде это не поля на форме, которые являются уязвимыми для SQL инъекций,.. Уязвимость действительно в коде, который обрабатывает значения, представленные в запросе)

Q Или я беспокоюсь излишне?

Нет, вы всегда должны быть осведомлены о возможности для плохих вещей, и написать свой код таким образом, что предотвращает уязвимость от воздействия (и эксплуатируемых.)

Q Если я загружать содержимое загруженного файла через base64_encode(), это равносильно санированию?

A Это почти так, если ваш base64_encode гарантирует, что возвращаемое значение будет содержать только [A-Za-z0-9 +./=]. Лучшей практикой было бы использовать параметры привязки

Q или должен ли я закодировать его, а затем передать кодированную строку через mysql_real_escape_string?

запрещая использование подготовленных операторов с параметрами связывания, то лучше практика подсказывает, что все значения (в том числе base64_encoded значений) будет проходить через mysql_real_escape_string, если они включаются в текст SQL, который будет представлен в базе данных.

1

Поскольку вы говорите о дезинфекции, я предполагаю, что это для общедоступного сайта, где незнакомые люди будут загружать файлы. Хранение пользовательских файлов PDF является очень плохой идеей. Во-первых, как вы можете быть уверены, что файл, который вы получаете, - это даже PDF? На 100% доступно пользователям CURL вредоносный файл в вашу базу данных и пользователи могут бесплатно скачать вирус. Само собой, сами PDF-файлы (если я правильно помню) могут наступить на выполнение вирусов в некоторых операционных системах Windows, как это делают файлы WMV и WMA.

Если вам абсолютно необходим PDF-файл, лучшим вариантом является вместо этого создать свой собственный файл PDF с дезинфицированными данными, представленными пользователем. Вы, вероятно, можете найти учебник онлайн о том, как это сделать. Я лично не рекомендовал бы использовать PDF-файлы в первую очередь, так как вы можете использовать HTML & CSS для создания резюме и его распечатки.

+0

Спасибо, Андрей. PDF-файлы будут представлены общественности, и на короткий срок я не вижу способа обойти это. Нам необходимо упростить для будущих стажеров заявку на вакансии и принять их резюме в наиболее стандартных формах, которые могут им помочь (.docx, .doc, .pdf). Он не будет летать с HR, чтобы потребовать от заявителей скопировать и вставить свое резюме в CKeditor или что-то в этом роде. –

+0

Да, я понимаю, что вы хотите создать веб-приложение, дружелюбное к пользователям, но при работе с файлами это становится довольно сложно. Я не вижу краткосрочного решения, кроме как позволить себе подвергать себя дырам в безопасности. В общем, вам не придется беспокоиться об инъекциях из MYSQLi или PDO, но реальной проблемой являются пользователи, которые скачивают файлы. – Andrew

+0

Файлы PDF не * обычно * уязвимы.Я не знаю о какой-либо уязвимости, которая не исправлена ​​с помощью последних обновлений Adobe Reader. Возможно, действительно стоит проверить, что файл на самом деле * является * реальным PDF, но нет необходимости полностью отказываться от PDF-загрузок. –

Смежные вопросы