【问题标题】:Are Cookies a Security Risk?Cookie 是否存在安全风险?
【发布时间】:2012-02-18 00:42:04
【问题描述】:

假设我们有一个网站询问用户的姓名。

然后网站将此值存储在 cookie 中,并在下一页通过 PHP 检索它并以某种方式使用它(可能页面将名称显示为文本)。

用户是否可以修改 cookie 数据以注入恶意代码?是否应该在脚本检索 cookie 数据时对其进行清理?

(这是一个假设场景。显然这里不需要 cookie。)

【问题讨论】:

标签: php security cookies sanitization code-injection


【解决方案1】:

用户是否可以修改 cookie 数据以注入恶意代码?是否应该在脚本检索 cookie 时对其进行清理?

注入恶意代码?不是 PHP 代码,但您是对的,您应该在使用 cookie 值之前对其进行清理。

用户可以轻松修改、添加和删除 Cookie,应将其视为不受信任的用户输入。它们与任何其他用户输入一样容易受到 XSS 和 SQL 注入漏洞的影响。

此外,除非您使用 SSL,否则 cookie 与请求中的 GET 或 POST 数据一样容易被嗅探。恶意互联网服务可以拦截或修改 cookie。另请参阅 Firesheep,了解有关 cookie 如何被滥用和不信任的示例。

【讨论】:

  • 如果你从 cookie 中“运行”数据,那你就疯了。
  • 嗯,让我修正一下那个短语的措辞。
  • 您能否举例说明如何为 XXS 操作 cookie 数据?
  • 你的意思是,比如说,echo $_COOKIE['foo']?实际上,考虑到 cookie 是特定于浏览器的,用户自己进行 XSS 是非常愚蠢的。恶意互联网服务提供商修改 cookie 以进行 XSS 也是愚蠢的,因为他们可以修改内容无论如何,所以他们不妨直接这样做。
  • 除非您通过将字符串评估为代码的函数(如evalassert)采取显式步骤,否则无法在服务器上执行任何用户数据和create_function,或者如果你对variable variablesvariable functions 的使用很草率。仅仅将 cookie 数据回显给用户只是创建了 XSS 漏洞,而不是创建了代码注入漏洞。
【解决方案2】:

使用 cookie 没有固有的安全风险。安全风险来自您对 cookie 数据的处理,以及您在 cookie 中存储的数据。例如,如果您执行以下操作:

<h3>Hello, <?php echo $_COOKIE['user']; ?>!</h3>

...然后用户将能够将任意代码注入您的页面(XSS 漏洞)。要解决此安全问题,您必须正确转义 HTML 上下文的 cookie 数据:

<h3>Hello, <?php echo htmlspecialchars($_COOKIE['user']); ?>!</h3>

【讨论】:

  • 那么可以在第一个例子中注入可执行的PHP代码吗?
  • @Peter:是的,有可能,但这不是因为使用了 cookie。这是因为缺乏正确的数据转义。如果您没有正确转义数据,POST、GET、SERVER、FILE、SESSION 等也会存在同样的漏洞。
【解决方案3】:

在将名称前面带有 $_($_POST、$_GET、$_COOKIE、$_FILE、$_SESSION)的 PHP 中的所有变量放在页面或数据库中之前,应检查它们。

您可以使用htmlentities( $str ) 来保护大多数注入。

【讨论】:

  • htmlentities 可以恶意破坏 Unicode,除非小心处理。 htmlspecialchars 提供相同级别的 XSS 保护,但没有字符集恶作剧。
  • @Charles:htmlentities() 函数采用可选的第三个参数来指定字符集。如果您不使用正确的设置,它只会“恶意破坏”您的数据。
  • 虽然这是事实,但它也迫使您考虑每次调用的字符编码,这充其量是麻烦,最坏的情况是烦人。
【解决方案4】:

Cookie 只是来自客户端的另一种输入形式,因为客户端可以在 cookie 中向您发送他们想要的任何内容,并且您的应用不得信任 cookie 中提交的内容,直到您对其进行清理/验证。

OWASP 和can be found here 提供了有关执行数据验证 的良好指导,该指导应正确应用于应用程序的所有输入,包括 cookie。简短的形式是:在明确定义可接受的输入并只接受那些的地方进行接受已知良好的验证。除了阻止已知的不良模式(与良好的 accept-known-good 方法相一致,而不是替换它)之外,拥有一个黑名单也是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多