PHP包含在现有代码中?

时间:2013-11-03 08:37:51

标签: php mysql database include

这是我的代码:

<?php
if(isset($_GET['p']))
{
    $nshortname = strip_tags($_GET['p']);
    $check = mysql_query("SELECT * FROM pages WHERE `shortname` = '$nshortname'");

    if(mysql_num_rows($check) == 0) 
    {
        echo '<center><font size="50" style="font-weight:bold;">404</font><br>Appears this page is a dead end</center>';
    }
    else
    {
        $h = mysql_fetch_array($check);
        //post details
        $title = $h["title"];
        $content = $h["content"];
        $shortname = $h["shortname"];
        // Start of page content
        echo '

        <p>
        <font size="5pt">'.$title.'</font><br><hr>
        '.$content.'<br>
        ';
        // End of page content
    }
} 
else
{
    echo 'No page has been selected to view';
}
?>

它究竟做了什么,它是从我的数据库抓取页面并读取它们,所以例如,如果我在该表中有一个名为“test”的页面,我可以通过http://mylink.com/?p=test转到它。虽然我提出了一个问题。在我想要包含的数据库中的其中一个页面上,但是当我在数据库字段中键入它并返回到它没有显示的页面时。

我在浏览器中找到了该页面的来源,发现代码已变为<!--?php include "inc/extra/plugins/header/slideshow.php"?-->

有没有人知道如何将其转变为<!--?并使我的包含代码有效。

2 个答案:

答案 0 :(得分:3)

我会提醒您不要使用未知内容的eval()。基本上,内容来自您的数据库,但这并不能保证作为代码执行是安全的!有很多方法可能导致错误或做恶意事件。

但是您的代码中还有其他危险的安全漏洞。您应该了解如何防范SQL injection漏洞和Cross-Site Scripting (XSS)漏洞以及File Inclusion漏洞。

  • 如果您仍在使用已弃用的ext / mysql,请使用mysql_real_escape_string()。但是,如果可以,请切换到mysqli或PDO_mysql并使用带参数的预准备语句。

  • 始终使用htmlspecialchars()输出动态内容。如果内容包含Javascript代码怎么办?这可能会导致恶作剧。

  • 永远不会eval()任意内容作为代码。您无法控制该内容的内容,或执行它时可以执行的操作。

  • 尽可能限制 - 如果要包含文件,请将文件名与内容分开存储(例如,在单独的列中),并仅使用 来包含文件。< / p>

以下是您的代码中修复了其中一些问题的示例:

<?php

if(isset($_GET['p']))
{
    $nshortname = mysql_real_escape_string($_GET['p']);
    $check = mysql_query("SELECT * FROM pages WHERE `shortname` = '$nshortname'");

    if(mysql_num_rows($check) == 0) 
    {
        echo '<center><font size="50" style="font-weight:bold;">404</font><br>Appears this page is a dead end</center>';
    }
    else
    {
        $h = mysql_fetch_array($check);
        //post details
        $title = htmlspecialchars($h["title"]);
        $content = htmlspecialchars($h["content"]);
        $shortname = $h["shortname"];
        // Start of page content
        echo '

        <p>
        <font size="5pt">'.$title.'</font><br><hr>
        '.$content.'<br>
        ';
        // End of page content

        // Start of include
        if ($h["include"]) {
          // strip out anything like "../../.." etc. 
          // to make sure this is only a simple filename.
          $include = basename($h["include"]);
          include "inc/extra/plugins/header/{$include}.php";
        }
        // End of plugin inclusion
    }
} 
else
{
    echo 'No page has been selected to view';
}
?>

另请查看http://www.sitepoint.com/php-security-blunders/http://phpsec.org/projects/phpsecinfo/


重新评论:

要允许一组有限的基本HTML,您需要使用的最佳工具是http://htmlpurifier.org

我不确定如何说明您的包含显示代码而不是工作。我刚刚对此进行了测试,以下两个文件似乎完全符合预期:

<强> foo.php

<?php

echo "<h1>START FOO</h2>";
if ($_GET["include"]) {
    $include = basename($_GET["include"]);
    include "./{$include}.php";
}
echo "<h1>END FOO</h2>";

<强> bar.php

<?php
echo "<h2>BAR</h2>";

答案 1 :(得分:0)

如果你有一个变量$ content,它是带有php的html,你可以使用
eval("?>" . $content . "<?php");
这将输出处理了所有<?php ?>标记的$ content。