我刚开始学习PHP,我一直在ASP.Net开发Web应用程序很长一段时间.我想知道是否有任何PHP特定的安全错误,我应该注意.
所以,我的问题是每个PHP开发人员应该知道的最重要的安全提示是什么?
每个答案请保持一个提示,以便人们可以有效地上/下投票.
(没有特别的顺序)
始终检查寄存器全局变量是否为OFF
始终检查魔术引号是否为OFF
确保您了解SQL注入攻击
关闭生产中的错误报告
编辑:对于"新手",这是一个基本的原因(因为我有时间解释这个):
注册全局变量是一种失常.这是有史以来最终的安全漏洞.例如,如果启用了register_globals,则网址http://www.yourdomain.com/foo.php?isAdmin=1将声明$ isAdmin作为全局变量,不需要代码.我不知道为什么这个"功能"让它成为PHP的方式,但是这背后的人应该在他们的额头上纹了下面的纹身:"我发明了PHP Register Globals",所以当我们看到它们时我们可以像害虫一样逃离它们!
魔术引用是另一个愚蠢的想法,它使它成为PHP的方式.基本上,当ON PHP将自动转义引号('变为\'和"成为\")以帮助SQL注入攻击.这个概念并不坏(有助于避免注入攻击),但是逃避所有 GET,POST和COOKIE值会使您的代码变得如此复杂(例如,每次显示和数据时都必须进行浏览).另外,如果有一天你关闭此设置而不对代码进行任何更改,那么所有代码和/或数据都会被破坏,并且(甚至更多)容易受到注入攻击(即使在你很容易受到攻击时也是如此).
您的数据库数据是您网站上最有价值的东西.你不希望别人搞砸它,所以保护自己,阅读有关它的东西,并考虑到这一点.
这又可能导致安全问题.错误消息可以提供有关代码如何工作的hackes的提示.此外,这些消息对访问者没有任何意义,为什么要显示它们呢?
避免使用register_globals.
警告:自PHP 5.3.0起,此功能已被弃用,自PHP 5.4.0起已被删除.
Cross Site Scripting(XSS)Wiki,Google
Cross Site Request Forgery(XSRF/CSRF)Wiki,Google(感谢Rook)
Session Fixation Wiki,Google
SQL注入(SQLi)Wiki,Google
关闭生产环境中的错误消息
将任何"包含"代码保存在不可通过Web访问的目录中(拒绝访问或将其保留在webroot之外)
这是我写的一篇关于以安全的方式存储密码的文章,如果你不想接受我的话,请查看底部的链接.
在我的文章中也有链接,但在这里给出了它自己的单独链接,麻省理工学院发表了一篇名为"网上客户认证的DO和不做"的论文[PDF].虽然它的一些信息(建议使用MD5哈希,仅为一个)仅仅因为我们现在所知道的与我们所知道的相比已经过时,但整体原则非常强大,应予以考虑.
Rooks的一个链接让我想起了另一套重要的限制
关闭Register Globals(这是现在的默认值,所以我之前没有提到过)
处理文件上传时,请务必使用is_uploaded_file()
以验证文件是否已上传而move_uploaded_file()
不是copy()
或rename()
.
如果您需要知道原因(并且确实如此),请阅读PHP手册的这一部分.
由于我现在两次提到他,请查看Rooks的答案(/sf/ask/17360801/知道#2275788)因为它包含一个文档的链接,其中包含关于最重要的安全问题的(非PHP特定的)信息(因此这可能是正确的答案).
这是一个很好的PHP安全编程实践的链接.
http://phpsec.org/
大多数安全问题都围绕着用户输入(自然地),并确保它们不会让你烦恼.始终确保验证您的输入.
http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php
始终清理并验证从页面传递的数据
结合#1,始终正确地逃避输出
始终display_errors
在生产中关闭
如果使用数据库后端,请使用支持/模拟预准备语句的驱动程序,并在不带偏见的情况下使用:-)
不要使用"注册全局变量"并过滤用户输入的xss和注入
语言与程序员.您可以编写最严重的漏洞,但不会收到警告或错误消息.漏洞可以像在代码中添加或删除2个字符一样简单.有数百种不同类型的漏洞会影响PHP应用程序.大多数人都会想到XSS和Sql Injection,因为它们最受欢迎.
阅读OWASP前10名.