Я пытаюсь создать страницу 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();
}
?>
Вот мои вопросы:
- I f у вас есть поле для загрузки файлов, это поле уязвимо для SQL-инъекции? Или я беспокоюсь излишне? Очевидно, что эта задача загрузки файлов была бы намного проще, если бы я мог просто передать двоичный код в поле blob без каких-либо переводов.
- Если я загружаю содержимое загруженного файла через base64_encode(), это равносильно дезинфекции? или я должен закодировать его, а затем передать закодированную строку через mysql_real_escape_string?
- Это все, что вам нужно, чтобы сохранить и извлечь PDF-файл. Есть ли более простое решение этой общей потребности, которую я еще не наткнулся?
Заранее благодарен!
Ответ: ** НЕТ ** –
Используйте mysqli или PDO с подготовленными запросами и заполнителями, которые должны решить проблему с кодировкой и впрыском. – Barmar
Это безопасно от инъекции таким же образом, что НЕ набивая вилку в электрическую розетку, защищайте вас от поражения электрическим током. Правило для уязвимости в отношении инъекций: если вы используете «внешние» данные в запросе, то вы уязвимы. Не имеет значения, откуда поступают данные, даже если это от СЕБЯ. Вы можете легко добавить свои собственные запросы. –