HTML — Как добавить домен перед file_get_contents в коде PHP

Я новичок здесь, и у меня был PHP-кодер для некоторых модов на 2 моих файла, которые, как предполагалось, могли позволить пользователю иметь возможность напрямую ссылаться на файл, преобразованный из DOC в IMG на http://NFOPic.com

Вот отредактированный код (вы можете увидеть отредактированные части с помощью DrTech76) -:

get_image.php

<?php
require_once 'include/db.php';
$file_name = $_GET['f'];
if ( empty( $file_name ) || !file_exists( 'uploads/' . $file_name ))
{
die( 'File not found...' );
}

$sql = "SELECT original_file_name FROM nfo_images WHERE file_name = '" . $file_name . "'";
$rs = mysql_query( $sql );
$file = mysql_fetch_assoc( $rs );

$original_file_name = explode( '.', $file['original_file_name'] );
//just get rid of the last, then put back together
array_pop( $original_file_name );
$original_file_name = implode( '.', $original_file_name );

header("Content-Type: image/png");
//start edit 10.07.2014 DrTech76, flow the direct image link through here to keep the actuall location unknown
if(!isset($_REQUEST["dl"]))
{//it's not a request through a direct link, so process as file download, as it was   originally
header("Content-Disposition: attachment; filename=\"" . $original_file_name . ".png\"");
}
//end edit 10.07.2014 DrTech76, flow the direct image link through here to keep the actuall location unknown
echo file_get_contents( 'uploads/' . $file_name );
?>

Другой редактируемый файл — это index.php (добавленная область ввода, должна была быть текстовая область IMO с «выбором для копирования», чтобы скопировать содержимое в буфер обмена) (ЭТО ТОЛЬКО ОБЪЕДИНЕННАЯ ОБЛАСТЬ, Я ДОБАВЛЕНО, иначе будет слишком долго)

<div id="uploaded_image_div" align="center">
<b>Left Click on the Below Image to Save it to your PC...</b><br /><br />
<div id="title" style="font-weight:bold;"></div>
<br />
<a href="" target="_blank"><img border="0" src="" /></a>
<br />
<?php
//start edit 10.07.2014 DrTech76, direct link containers, styling is done  through css/style.css
?>
<div id="direct_link">
<label for="link">Direct link to this image</label><br />
<input id="link" readonly onfocus="$(this).select()" />
</div>
<?php
//end edit 10.07.2014 DrTech76, direct link containers, styling is done through css/style.css
?><br />
<br />

Может кто-нибудь, пожалуйста, помогите мне исправить эту ошибку, как вы можете видеть на странице индекса NFOPic.com, что фактическое доменное имя не отображается — хотя мне это нужно, так что если я загружаю его в другой домен (новый домен выбирается, когда BETA выпущен) он будет работать с любым доменом, а не просто положить http://nfopic.com/ перед кодом — СПАСИБО В ПРЕДПРИНИМАТЕЛЯХ!

-1

Решение

Итак, есть несколько вещей, которые нужно сделать с этим скриптом.

1) Избавьтесь от уязвимости XSS и внедрения SQL:

Прямо сейчас вы проверяете, существует ли файл, что не является полностью неправильным, но не выполняет работу за вас:

$file_name = $_GET['f'];
if ( empty( $file_name ) || !file_exists( 'uploads/' . $file_name ))
{
die( 'File not found...' );
}

Поскольку Питер уже говорил вам, что вы позволяете людям загружать данные вашего доступа к SQL Server, вставляя http://nfopic.com/get_image.php?f=../include/db.php в браузер, я просто предположу, что вы поняли основную проблему.
file_exists просто проверяет, доступен ли файл на сервере, что верно для вашего include/db.php файл. Таким образом, переводчик перепрыгивает через IF и продолжает выполнение. Поскольку вы уже используете БД, мы собираемся использовать ее, чтобы определить, существует ли файл на самом деле. Мы вернемся к этому через секунду.

mysql_query совсем не безопасно (инъекция SQL)! Вам нужно будет использовать PDO или MySQLi для запросов SQL (я использую PDO для демонтации):

$prep = $db->prepare("SELECT original_file_name FROM nfo_images WHERE file_name = ?");
$prep->execute(array($file_name));
$res = $prep->fetchAll();
if(count($res) == 0){
die( 'File not found...' );
}
$original_file_name = explode('.', $res[0]["original_file_name"]);
// ... and what else you want to do with the file name

Вы можете прочитать больше об этом здесь: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

Теперь мы должны закрыть обе уязвимости, используя этот способ (при условии, что выгрузка не позволяет неправильно взаимодействовать с БД -> вам нужно проверить generate_image.php).

2) Ваша проблема с добавлением домена:

Я не совсем понял, в чем ваша проблема, поэтому не стесняйтесь комментировать и задавать дополнительные вопросы, если я не отвечаю правильно.

Вы можете получить текущий домен, позвонив $_SERVER['SERVER_NAME'], Это должно вывести что-то вроде: nfopic.com (хотя я не знаю, где вы хотели бы добавить это).

Если вы имели в виду, что доменное имя в input поле неверно, вы можете изменить это в своем js/nfo.js файл. Есть строка:

$('#uploaded_image_div #link').val('http://nfopic.com/get_image.php?f=' + validate[1]);

http://nfopic.com/get_image.php?f= часть жестко закодирована, поэтому вам придется вставить ее любым другим способом.

Если вы хотите добавить доменное имя к изображению, которое пользователь может загрузить, вам придется перенаправить свое изображение с помощью .htaccess файл, так что вы можете запросить реальное имя изображения image_234234.png,

3) Остальная часть домашней страницы:

Поскольку в этой части сайта так много уязвимостей и ошибок, generate_image.php, Проверка типов файлов (txt, nfo и diz) выполняется в JS. Проблема в том, что вы можете обойти их и загрузить любой другой тип файла, если в PHP тоже нет проверки. Это приводит нас к еще одной уязвимости -> может быть загружен скрипт SHELL (простой файл PHP), и ваши файлы могут быть изменены от злоумышленника.

В КОНЦЕ КОНЦОВ:
Вся домашняя страница может быть небезопасной. Определенно есть некоторые изменения, которые необходимо сделать.
И снова, если я не ответил на ваш начальный вопрос, не стесняйтесь задавать дополнительные вопросы.

2

Другие решения

Других решений пока нет …