非常教程

Codeigniter 3参考手册

安全 | Security

安全 | Security

本页面描述了一些关于网络安全的“最佳实践”,并详细介绍了CodeIgniter的内部安全功能。

如果您来这里寻找安全联系人,请参考我们的Contribution Guide <../contributing/index>...

URI安全性

CodeIgniter对URI字符串中允许的字符有相当严格的限制,以帮助将恶意数据传递到应用程序的可能性降到最低。URI只能包含以下内容:

  • 字母数字文本(仅限拉丁字符)
  • Tilde:〜
  • 百分比符号:%
  • 期间:.
  • 冒号::
  • 下划线:_
  • Dash: -
  • 空间

register_globals

在系统初始化期间,发现存在于$_GET,,,$_POST,,,$_REQUEST$_COOKIE都是未定的。

未设置的例程实际上与register_globals = off相同。

display_errors

在生产环境中,通常希望通过将内部display_errors标志设置为0 来“禁用”PHP的错误报告。这将禁止将本地PHP错误呈现为可能包含敏感信息的输出。

将index.php中的CodeIgniter 环境常量设置为'production'将会关闭这些错误。在开发模式下,建议使用“开发”的值。有关区分不同环境的更多信息,请参阅处理环境页面。

magic_quotes_runtime

magic_quotes_runtime的指令系统初始化时,这样你就不必从数据库中检索数据时删除斜线关闭。

最佳实践

在接受应用程序中的任何数据之前,无论是表单提交、cookie数据、URI数据、XML-RPC数据,甚至服务器数组中的数据,都鼓励您实践以下三步方法:

  • 验证数据以确保其符合正确的类型、长度、大小等。
  • 过滤数据就好像它被污染了一样。
  • 在将数据提交到数据库或将其输出到浏览器之前将其转义。

CodeIgniter提供了以下功能和提示,以帮助您完成此过程:

XSS滤波

CodeIgniter带有一个跨站点脚本过滤器。该过滤器会查找常用技术,将恶意JavaScript嵌入到您的数据或其他类型的试图劫持cookie或执行其他恶意事件的代码中。这里描述了XSS过滤器。

XSS过滤只能在输出上执行。过滤输入数据可能会以不希望的方式修改数据,包括从密码中剥离特殊字符,这会降低安全性而不是改进它。

CSRF保护

CSRF是跨站点请求伪造的意思,这是攻击者欺骗受害者在不知不觉中提交请求的过程。

CodeIgniter提供开箱即用的CSRF保护,它将自动触发每个非GET HTTP请求,但也需要您以某种方式创建提交表单。这在安全图书馆文件。

密码处理

它是临界性正确处理应用程序中的密码。

不幸的是,许多开发人员不知道如何做到这一点,而且网络上充斥着过时的或错误的建议,这是没有帮助的。

我们想给你一个综合的做和不帮助你的清单。请看下面。

  • 不要以纯文本格式存储密码. 总散列你的密码。
  • 不要使用base 64或类似的编码来存储密码。

这与以纯文本方式存储它们一样好。做散列,而不是编码

编码和加密也是双向的.。密码是秘密,只能为其所有者所知,因此只能在一个方向上工作。哈希做这个-有不散列或去散列,但有解码和解密。

  • 不要使用弱散列或散列算法,如MD5或SHA 1。 这些算法很老,被证明是有缺陷的,而且最初不是为密码哈希而设计的。 另外,不要发明你自己的算法。 只使用强密码散列算法,如bcrypt,这是PHP自己使用的密码散列职能。 请使用它们,即使您没有运行PHP 5.5+,CodeIgniter也会为您提供它们。
  • 切勿以纯文本格式显示或发送密码!

即使是密码的所有者,如果您需要“忘记密码”功能,只需随机生成一次性(这也是重要的)密码并发送。

  • 不要对用户的密码设置不必要的限制。

如果您使用的是除了BCrypt(其最大长度为72个字符)以外的散列算法,则应该设置相对较高的密码长度限制以减轻DoS攻击 - 例如1024个字符。

但是,除此之外,没有必要强制规定密码只能包含多个字符,或者密码不能包含特定的特殊字符集。

这不仅减少了安全性,而且改善了安全性,但实际上没有理由这样做。没有技术限制,没有(实际的)存储限制适用于一旦你散列它们,没有!

验证输入数据

CodeIgniter有一个表单验证库这有助于您验证、筛选和准备数据。

但是,即使这对您的用例不起作用,也一定要始终验证和清理所有输入数据。例如,如果您期望输入变量有一个数字字符串,则可以使用is_numeric()ctype_digit()总是尽量把你的支票缩小到一个特定的模式。

记住这不仅包括$_POST$_GET变量,还包括cookie、用户代理字符串和基本上所有不是由您自己的代码直接创建的数据。...

在插入数据库之前转义所有数据

不要在没有转义的情况下将信息插入数据库。请参阅讨论的部分数据库查询想了解更多信息。

隐藏你的文件

另一个好的安全做法是只在服务器的webroot目录(通常命名为“htdocs /”)下放置index.php和“资产”(例如.js,css和图像文件)。这些是您需要通过网络访问的唯一文件。

允许访问者看到任何其他东西,可能会允许他们访问敏感数据、执行脚本等。

如果你不被允许这样做,你可以尝试使用一个。htaccess文件以限制对这些资源的访问。

CodeIgniter将在其所有目录中都有一个index.html文件,试图隐藏其中的一些数据,但要记住,这不足以防止严重的攻击者。

安全 | Security
安全类 | Security Class 详细
安全助手 | Security Helper 详细