这是我的代码:
<?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"?-->
有没有人知道如何将其转变为<!--?
并使我的包含代码有效。
答案 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。