我参与了一个关于信息安全的学校项目,其中一项任务是用PHP编写一些安全页面。我小组中没有人知道PHP,但这不是一个大问题,我们将学习足够的知识来创建所需的简单页面。
学生助理给出的一个提示是使用strip_tags()
和mysqli_real_escape_string()
两个函数。我认为这些是安全的,但没有深入的了解我不确定。一些简单的Google搜索显示,至少过去存在漏洞。作为转让的一部分,试图打破其他组系统,重要的是这两个,我们自己的系统是安全的,并找到另一组的系统可能vulnarabilites。而且大多数团体都会盲目地使用这两个功能。所以我的问题是:
strip_tags()
中是否存在任何已知漏洞?mysqli_real_escape_string()
中是否存在任何已知漏洞?答案 0 :(得分:8)
首先,我建议您使用Mysqli Prepared Statements。这些是more secure而不是转义函数,因为它将查询结构与查询参数完全分开。
您可以使用either strip_tags或htmlentities确保没有恶意代码输出到浏览器。在将其输出到浏览器之前,您可能还希望通过某种过滤功能运行all动态内容。这是一个组织良好且具有凝聚力的OO方法可以提供帮助的一个领域,因为您可以将所有动态内容分配给单个对象,然后负责将输出呈现给浏览器,以便您可以始终感到安全,因为您知道您的内容是XSS安全,无需在多个页面中搜索数百个echo语句。
然而,这两个建议实际上只涉及到PHP安全性的冰山一角。还有许多其他问题需要处理,例如:
我建议您查看以下网站,以获取有关PHP安全性主题的其他更全面的处理方法:
在最后一项上,如果可能,您将需要查看使用.htaccess文件或其等效的IIS,以确保只有您想要访问的文件是公开可用的。否则,您的所有其他安全措施都将是徒劳的。
更新:我想到了与项目安全相关的其他几个问题。如果你还记得Twitter管理员的账号在不久前遭到黑客入侵的不幸事件,那么就可以通过几个原因轻松解决这个问题。
1)密码登录尝试未受限制的地方。换句话说,如果用户尝试登录并失败,那么来自其IP的重复请求可能需要2秒来处理第二次,然后4则是下一次,依此类推。这使得机器人连续登录尝试变得不切实际 2)不需要安全密码。由于密码具有更高的要求(字母数字和特殊字符所需的字符长度和类型),因此字典攻击变得完全不切实际,因为在破解密码时抛出字典要比提出随机数字字符串容易得多和信件。此外,随着更多字符的添加,破解密码的时间会呈指数级增长。
您可以在杰夫阿特伍德看到this post,了解有关此特定主题的更多信息。
答案 1 :(得分:2)
对于PHP错误:bugs.php.net
答案 2 :(得分:1)
漏洞是特定于版本的,您应该指定您应该使用的PHP版本。如果您使用的是旧版本,则可以在bugs.php.net或Secunia Advisory and Vulnerability Database
中轻松找到旧(固定)漏洞