【发布时间】:2010-11-12 23:55:12
【问题描述】:
我刚开始学习 PHP,我已经在 ASP.Net 中开发 Web 应用程序很长时间了。我想知道是否有任何我应该注意的特定于 PHP 的安全错误。
那么,我的问题是每个 PHP 开发人员都应该知道的最重要的安全提示是什么?
请为每个答案保留一个提示,以便人们可以有效地投票赞成/反对。
【问题讨论】:
我刚开始学习 PHP,我已经在 ASP.Net 中开发 Web 应用程序很长时间了。我想知道是否有任何我应该注意的特定于 PHP 的安全错误。
那么,我的问题是每个 PHP 开发人员都应该知道的最重要的安全提示是什么?
请为每个答案保留一个提示,以便人们可以有效地投票赞成/反对。
【问题讨论】:
(排名不分先后)
编辑:对于那里的“新手”来说,这是一个基本的原因(因为我有时间解释这一点):
注册全局变量是一种异常。这是有史以来的终极安全漏洞。例如,如果 register_globals 打开,则 url http://www.yourdomain.com/foo.php?isAdmin=1 将声明 $isAdmin 为全局变量,无需任何代码。我不知道为什么这个“功能”会成为 PHP 的方式,但是 这背后的人应该在他们的额头上纹上以下纹身:“我发明了 PHP Register Globals”,这样我们就可以像害虫一样逃离它们了看看他们!
魔术引号是另一个愚蠢的想法,它已经成为 PHP 的方式。基本上,当 ON PHP 将自动转义引号('成为\'和“成为\”)以帮助进行 SQL 注入攻击。这个概念还不错(有助于避免注入攻击),但是转义 all GET、POST 和 COOKIE 值会使您的代码非常复杂(例如,每次显示和数据时都必须取消转义)。另外,如果有一天您关闭此设置而不对您的代码进行任何更改,那么您的所有代码和/或数据都会被破坏并且(甚至更)容易受到注入攻击(是的,即使您很容易受到攻击)。
您的数据库数据是您网站上最有价值的东西。您不希望人们惹恼它,因此请保护好自己并阅读有关它的内容并牢记这一点。
同样,这可能会导致安全问题。错误消息可以为黑客提供有关您的代码如何工作的提示。此外,这些消息对您的访问者没有任何意义,那么为什么要显示它们呢?
【讨论】:
避免使用register_globals。
警告:此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。
【讨论】:
is_uploaded_file() 来验证文件是否已上传,并使用move_uploaded_file() 而不是copy() 或rename()。
【讨论】:
session_start(),会话固定不是问题吗?你知道 PHP 的会话模型是如何工作的吗?这正是它的问题所在。也许你在想session_regenerate_id()?尽管如此,这也会在可能同时触发多个请求的环境中引入竞争条件(例如 AJAX)。我质疑你关于“只使用session_start()”的建议是本周在 PHP 安全方面“过于简单”的答案!
session_start() 本身就很弱,而是会话 ID 可以通过各种方式“固定”(查询字符串、发布参数,或者如果您可以控制 cookie),这可以提供恶意攻击者完全访问经过身份验证的系统。采取措施防止这种情况(例如,不允许通过 POST 和 GET 设置会话 ID,在某些事件(如登录和购买)上轮换会话 ID)是防止此类攻击的简单方法。我的问题是,session_start() 在什么世界里没有其他会话固定保护被认为是足够的保护?
这里是良好 PHP 安全编程实践的链接。
大多数安全问题都围绕着用户输入(自然而然),并确保他们不会把你搞砸。始终确保验证您的输入。
http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php
【讨论】:
display_errors
【讨论】:
不要使用“注册全局变量”并过滤用户输入以进行 xss 和注入
【讨论】:
语言与程序员。您可以编写最严重的漏洞,并且不会收到警告或错误消息。漏洞可以像在代码中添加或删除 2 个字符一样简单。有数百种不同类型的漏洞会影响 PHP 应用程序。大多数人会想到 XSS 和 Sql 注入,因为它们是最流行的。
阅读OWASP top 10。
【讨论】:
如果您使用的是 mysql 数据库,请确保在向数据库发送数据时调用 mysql_real_escape_string
【讨论】:
有很多安全预防措施。我可以推荐一本书 Chris Shiflett:PHP 和 Web 应用程序安全。
【讨论】:
PHPSec Guide 提供了很好的概述。
【讨论】:
与 PHP 相关的大多数安全问题都来自使用未解析的“外部”(GET/POST/COOKIE) 变量。人们将这种数据直接放入文件路径或sql查询中,导致文件泄漏或sql注入。
【讨论】:
OWASP 提供了对当今应用程序中最大问题的安全问题的深入了解。很高兴看到他们有一个 PHP 专用页面可用
【讨论】:
【讨论】:
尽可能使用准备好的语句(tutorial。在处理用户输入时几乎是必须的(我说“几乎”是因为在一些用例中它们不起作用),甚至在不处理时也是如此输入,它们让你养成习惯。更不用说它们可以带来更好的性能,而且一旦你开始做事情,它们比零敲碎打要容易得多。
【讨论】:
通常介绍性教程根本不讨论检查用户数据。像所有编程环境一样,永远不要相信您从用户那里获得的数据。学习使用is_numeric()、isset() 和mysql_real_escape_string() 等功能来保护您的系统。
还有一些功能可以让您访问远程文件和其他有创意的东西。在您充分了解它们的工作方式和时间之前,我会避免使用它们(出于安全原因,它们通常被禁用)。
【讨论】:
1.234 这样的值会漏掉,这几乎总是不是你想要的,因为你大部分时间都将在 SQL 查询中使用这些值。相反,请参阅this 答案。
使用 POST 方法将数据从一个页面传递到另一个页面。
在获取trim($_POST) 之类的数据时使用修剪。
此外,在传递到查询之前,请使用 strip_tags 作为变量。
我建议你使用任何框架链接 Codeigniter、Laravel、YII、Cake PHP,因为它们为所有证券提供了框架
我建议将 Codeigniter 用于小型项目,将 Laravel 用于大型项目。
【讨论】:
对重要数据始终使用 POST 而不是 GET...
【讨论】: