安全 | 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文件,试图隐藏其中的一些数据,但要记住,这不足以防止严重的攻击者。