我正在创建一个PHP CMS,我希望它能被公众使用。安全性是一个主要的问题,我想学习一些流行的PHP CMS,如Wordpress,Joomla,Drupal等。他们过去有哪些安全漏洞或漏洞,我可以避免在我的应用程序中使用我可以用什么策略来避免它们?我需要关注的其他问题是,他们可能没有面对漏洞,因为他们从一开始就正确处理了漏洞?您还需要提供哪些额外的安全功能或措施,从微小的详细信息到系统级安全方法? 请尽可能具体。 我一般都知道大多数常见的攻击媒介,但我想确保所有的基础都被覆盖,所以不要不要害怕提到明显的。假设PHP 5.2 +。
编辑:我正在将此更改为社区维基。尽管Arkh的优秀答案已被接受,但如果你有这些答案,我仍然会对其他例子感兴趣。
答案 0 :(得分:59)
答案 1 :(得分:12)
我记得phpBB中有一个很有趣的。自动登录cookie包含一个包含userId和加密密码(无盐)的序列化数组。将密码更改为值为true的布尔值,您可以以任何人的身份登录。你喜欢弱文化的语言吗?
phpBB的另一个问题是正则表达式,用于突出显示具有回调的搜索关键字(使用e modifier
),这使您能够执行自己的PHP代码 - 例如,系统调用不安全系统或只输出配置文件以获取MySQL登录名/密码。
所以总结这个故事:
md5( "secretpass" ) == true
)。当然,我之前已经提到过其他问题。
答案 2 :(得分:3)
我看到CMSes处理的另一个应用程序级安全问题是没有充分授权页面或功能级别访问。换句话说,只有在您被授权查看这些链接时才显示链接,而不是完全检查用户帐户是否有权查看该页面或在页面上使用该功能后设置安全性。
换句话说,管理员帐户显示了转到用户管理页面的链接。但是用户管理页面仅检查用户是否已登录,而不是他们已登录和管理员。普通用户然后登录,手动输入管理页面URI,然后拥有对用户管理页面的完全管理员权限,并将他们的帐户变为管理员帐户。
即使在可以查看用户CC数据的购物车应用程序中,我也会多次看到这样的事情。
答案 3 :(得分:3)
这么多......
这里的一些答案列出了他们记住的特定vuls或通用“我在编写webapp时担心的事情”,但是如果你想要一个历史上发现的大多数报告漏洞的相当可靠的列表,那么你就不会这样做比搜索National Vulnerability Database
更糟糕Joomla或Joomla插件中报告了582个漏洞,Wordpress报告了199个漏洞,Drupal漏报了345个漏洞。
对于常见的webapp vuls的一般理解,OWASP Top Ten project最近已经更新,对于任何Web开发人员来说都是必读的。
答案 4 :(得分:3)
这么多人似乎忘记或没有意识到的最大问题是,任何人都可以将任何数据发布到您的脚本中,包括Cookie和会话等。不要忘记,仅仅因为用户已登录,不会这意味着他们可以采取任何行动。
例如,如果您有一个处理注释添加/编辑的脚本,您可能会这样:
if ( userIsLoggedIn() ) {
saveComment( $_POST['commentid'], $_POST['commenttext'] )
}
你能看出什么是错的吗?您检查了用户是否已登录,但您没有检查用户是否拥有该评论,或者是否能够编辑评论。这意味着任何登录用户都可以发布评论ID和内容,并编辑其他人的评论!
向其他人提供软件时要记住的另一件事是服务器设置变化很大。发布数据时,您可能希望这样做,例如:
if (get_magic_quotes_gpc())
$var = stripslashes($_POST['var']);
else
$var = $_POST['var'];
答案 5 :(得分:2)
我心中有四个大的:
答案 6 :(得分:1)
禁止来自其他域/ IP的POST所以Bots无法登录/提交表单。
答案 7 :(得分:0)
人,答案是最强大的安全臀位,是人 愚蠢。 信任,审核代码。你需要一个特殊的团队,它会审查在你的应用程序中添加额外代码的任何东西,cms的问题是外包,incomings,WordPress,Drupal,Joomla和其他流行的cms,比如默认安装,他们真的很喜欢好点安全。当你让人们在你的应用程序中添加额外的代码而没有一个好的评论(或更好,没有渗透测试)时,问题就出现了。这是WordPress和Joomla有这个弱点的地方,有很多插件n主题开发者,有这么多的批准,数百个过时的插件n主题无处可去....所以imho,如果你能够建立一个强大的团队,一个好的安全计划,训练你的贡献者,并学习如何编码安全,以及我之前的所有其他评论,然后你将继续说:ei嗨那是我的cms,它更安全一点比网上所有其他的cms;)
答案 8 :(得分:-2)
对于论坛管理员来说,这是一个潜在的陷阱,尤其是那些使用下拉选择器编写表单但未验证发布的响应实际上是可用选项之一的任何人。
在大学里,我意识到用户在phpBB中的“国家/地区”选择器没有这样的验证。
在我们的学校论坛上,不管是多么愚蠢或肮脏,我的国家可能是任何东西,而不是“美国”或“阿富汗”。我需要的只是一个html POST表单。我的同学花了几天时间弄清楚我是怎么做到的,但很快,所有“酷孩子”都有了有趣的短语,而不是用他们的用户名显示的国家。
去一个极客大学真是太棒了。 :d