我应该在PHP中注意哪些安全问题
我刚刚开始学习PHP,我一直在ASP.Net开发Web应用程序很长一段时间。 我想知道是否有任何PHP特定的安全错误,我应该寻找。
所以,我的问题是每个PHP开发人员应该知道的最重要的安全提示是什么。
请保持每个答案一个提示,以便人们可以有效地投下来。
避免使用register_globals
(没有特定的顺序)
- 总是检查注册全局variables是否closures
- 始终检查魔术引号是否closures
- 确保你了解SQL注入攻击
- 在生产中closures错误报告
编辑:对于“新手”那里这是一个基本的原因(因为我有时间来解释这个):
-
注册全局variables是一个畸变。 这是最终的安全漏洞。 例如,如果register_globals打开,那么url http://www.yourdomain.com/foo.php?isAdmin=1将声明$ isAdmin作为全局variables,而不需要代码。 我不知道为什么这个“function”已经成为了PHP的方式,但是这个背后的人应该在他们的额头上有下面的纹身:“我发明了PHP Register Globals”,所以当我们看到它们时,我们可以像害虫一样逃离它们!
-
魔术引号是另一个愚蠢的想法,它已经成为PHP的方式。 基本上,当ON PHP会自动转义引号('变成'和'成为')来帮助SQL注入攻击。 这个概念并不错(帮助避免注入攻击),但是转义所有的 GET,POST和COOKIE值会让你的代码变得非常复杂(例如,每次显示和数据时都不得不忽略)。 另外如果有一天你关掉这个设置而不做任何改变你的代码,所有你的代码和/或数据被破坏,甚至更容易受到注入攻击(即使在ON时你是脆弱的)。
-
您的数据库数据是您网站上最有价值的东西。 你不希望人们搞砸,所以保护你自己,阅读关于它的东西, 并且考虑到这一点。
-
这又会导致安全问题。 该错误消息可以提示您如何处理代码。 而且这些信息对你的访问者来说并不意味着什么,为什么要播种呢?
- 跨站点脚本(XSS) Wiki , Google
- 跨站请求伪造(XSRF / CSRF) Wiki , Google (感谢Rook)
- 会话固定Wiki , Google
- SQL注入(SQLi) Wiki , Google
- 在生产环境中closures错误消息
- 请将任何“包含”代码保留在不可通过networking访问的目录中(要么拒绝访问,要么将其保留在networking根目录之外)
- 这里有一篇关于如何以安全的方式存储密码的文章,如果您不想听我的话,请查看底部的链接。
- 也链接在我的文章中,但在这里给出了它自己的单独链接,这是麻省理工学院(MIT)发表的一篇文章,称为“在networking上进行客户端身份validation的DOs和Do notTs [PDF]” 。 虽然它的一些信息(build议使用MD5哈希,因为我们知道现在和现在知道的东西)已经有些过时了,但总的原则是非常强大的,应该加以考虑。
- 其中一个链接让我想起另一个重要的限制条件
- closuresRegister Globals(这是现在的默认设置,所以我之前没有提到过)
- 在处理file upload时,请确保使用
is_uploaded_file()
来validation文件是否已上传,并使用move_uploaded_file()
而不是copy()
或rename()
。- 如果你需要知道为什么(和你这样做),请阅读PHP手册的这一部分 。
- 由于我现在提到他两次,检查出Rooks的答案 ( https://stackoverflow.com/questions/2275771/what-are-the-most-important-safety-precautions-that-a-php-developer-needs-因为它包含了一个文档的链接,其中包含关于最重要的安全问题(这可能是正确的答案)的(非PHP特有的)信息。;
这里是一个很好的PHP安全编程实践的链接。
大部分安全问题都围绕用户input(自然),并确保他们不会把你搞砸。 始终确保您validation您的input。
http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php
- 始终清理和validation从页面传递的数据
- 与#1一起,总是正确地逃避你的输出
- 在生产中始终closures
display_errors
- 如果使用数据库后端,则使用支持/模拟准备好的语句的驱动程序,并在不影响使用的情况下使用:-)
不要使用“注册全局variables”并过滤xss和注入的用户input
语言与程序员。 您可以编写最严重的漏洞,并且不会收到警告或错误消息。 漏洞可以像添加或删除代码中的2个字符一样简单。 有数百种不同types的影响PHP应用程序的漏洞。 大多数人都认为XSS和Sql Injection是最受欢迎的。
阅读OWASP前10名 。
如果您使用的是mysql数据库,请确保在向数据库发送数据时调用mysql_real_escape_string
有很多安全防范措施。 我可以推荐一本书Chris Shiflett:PHP和Web应用程序安全。
看一下Suhosin Hardening Patch ,看看它所处理的安全漏洞 。
PHPSec指南提供了一个很好的概述。
与PHP相关的大多数安全问题都来自使用未分析的“外部”(GET / POST / COOKIE)variables。 人们将这种数据直接放入文件path或sql查询中,导致文件泄漏或sql注入。
OWASP提供了很多关于当今应用程序中最大的问题的安全问题。 很高兴看到他们有一个PHP专用页面可用
- 总是closures你的SQL连接。
- 始终释放SQL结果。
- 总是把所有的variables放到数据库中。
- 以防万一删除或从sql中删除使用限制1。
- 在开发时,确保你有一个locking的东西,以防止不受欢迎的。 如果它打开,你现在知道不加载页面,因为它可以打破某些东西,并不意味着其他人这样做。
- 不要使用Admin或Root作为您的服务器login名称。
只要有可能,就使用准备好的语句( 教程) 。每当处理用户input时(我几乎说“因为有一些用例不工作)”,几乎是必须的,即使不处理input,也会让你在这种习惯中,更不用说它们可以带来更好的performance,而且一旦进入事物的摆动,更容易,而不是零碎的消毒。
介绍性的教程通常不会讲述如何检查用户的数据。 像所有的编程环境一样,不要相信从用户那里得到的数据。 学习使用像is_numeric()
, isset()
和mysql_real_escape_string()
这样的函数来保护您的系统。
还有一些function可以让你访问远程文件和其他有创意的东西。 我会避免这些,直到你有一个很好的了解他们如何和什么时候工作(通常他们是出于安全原因被禁用)。