我想了解目前我网站的安全性;我刚刚意识到我在处理网站内容时遇到了漏洞,所以我想确保没有任何其他问题。
我的网站的工作方式如下:请求的实际“文件”(页面模板)只有一个。
使用AJAX,每次点击链接时内容都会加载到页面正文中(因此页脚和页眉始终保持不变)。
这些页面中的每个页面的内容都存储在与我的网站类似的数据结构中的JSON中(即example.com/about的内容将存储在example.com/json/about/data.json中)。我使用JSON,因为不仅存储了页面正文的html,而且还存储了一些自定义CSS(将被注入到标题中),页面标题以及其他一些属性。
从服务器获取正文内容时,使用连接器脚本(example.com/getcontent.php)检索页面的相应内容。使用此连接器脚本是因为在JSON正文内容中,存在需要它的页面的PHP代码。连接器脚本会删除内容,然后将输出发送到浏览器。
我发现的安全漏洞是,任何人都可以访问example.com/json/page/data.json并阅读我在每个页面的正文中编写的所有PHP代码。我计划通过使用mcrypt在创建它之后加密JSON并再次使用get.php中的mcrypt来解密它来解决这个问题。
由于这是一个如此大的安全漏洞,在我看来,我想知道是否有其他人可以想到类似于我的设置可能出错的类似内容。
注意:只有我可以访问服务器(因此,只有我可以创建被证明的JSON),所以不应该被唤醒的内容不是问题,因为我是为每个页面写一个内容。
答案 0 :(得分:2)
将您的JSON数据保留在Web根目录之外,并确保您的getcontent.php仅提供来自该目录的数据。
因此,如果您的Web根目录是/ home / website / htdocs,请将json存储在/ home / website / data中。
在getcontent.php中,确保从输入中删除所有..或使用如下的realpath:
define(APP_ROOT, '/home/website');
$p = realpath(APP_ROOT.'/data/'.$_SERVER['PATH_INFO']);
if (!preg_match('#^'.realpath(APP_ROOT).'#', $p)){
header('HTTP/1.0 403 Forbidden');
die("Access denied");
}
然后您可以通过URL以getfile.php / path / to / the / json-file.json
的形式引用该数据文件夹中的任何文件答案 1 :(得分:2)
我已经删除了我之前的回答,因为我误解了你的意思。 (问题确实不是很清楚,所以我可能还没有得到它)
我仍然说服务器上eval()
的任何使用都存在安全风险。无论你认为你控制得多么严密,如果你的PHP代码包含eval()
调用,那么它很可能会被黑客攻击。
不要冒这个风险:不要在PHP中使用eval()
。的自从强> †
此外,使用eval()
意味着PHP无法预编译代码,因此它的运行速度比普通的PHP代码慢得多。
您可以在客户端Javascript中使用eval()
,因为(a)它是在某些浏览器中解析JSON的唯一方法,并且(b)客户端可以使用Firebug运行他喜欢的任何Javascript代码或类似的工具。 (但它仍然会很慢,所以你应该尽可能避免它。)
† [edit]为了安抚@symcbean,我应该澄清一下,除了之外,你应该永远不要使用eval()
,这是最好的解决方案解决手头的问题,只有一旦你对使用它所涉及的风险有了深刻的了解。然而,这些情况很少见,但是:我已经看到eval()
使用了很多,但我从来没有遇到过正确使用它的代码;它始终是糟糕的代码。