如何在PHP代码中的file_get_contents前添加域

时间:2014-09-16 11:50:27

标签: php html mysql css

我是新来的,有一个PHP编码器,可以使用一些mod到我的2个文件,这些文件可以让用户能够直接链接到http://NFOPic.com上从DOC转换为IMG的文件

以下是编辑的代码(您可以看到带有'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 个答案:

答案 0 :(得分:2)

所以,这个脚本有很多事情要做。

1)摆脱XSS和SQL注入漏洞:

现在,您正在检查文件是否存在,这不是完全错误的,但是没有为您完成这项工作:

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

由于Peter已经告诉过你,你允许人们通过将http://nfopic.com/get_image.php?f=../include/db.php插入浏览器来下载你的SQL Server访问数据,我只是假设你理解了基本问题。 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

现在我们应该通过这种方式关闭这两个漏洞(假设上传不允许与数据库进行错误的交互 - &gt;您需要检查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中也没有一些检查。这导致我们另一个漏洞 - &gt;可以上传SHELL脚本(简单的PHP文件),并且可以从攻击者修改您的文件。

<强>最后: 整个主页可能不安全。肯定有一些需要做的修改。 再说一次,如果我没有回答您的问题,请随时提出进一步的问题。

相关问题