2012-07-13 95 views
4

我在想下面的代码注入漏洞是否在fwrite中?

foreach($_POST as $key=>$val) { 
    fwrite($fh, "\nPOST variable named " . $key . " has the value " . $val); 
} 

我应该在将它们写入日志文件之前以某种方式清理这些值吗?

UPDATE。 fh是日志文件处理程序

+0

try htmlentities();之前或之后(但只有一次),并使用mysql_real_escape_string – Waygood 2012-07-13 08:37:03

+1

@Waygood:'htmlentities'只适用于HTML输出。 'mysql_real_escape_string'只适用于使用mysql扩展的情况,这种情况不应该发生在新代码中,因为mysql扩展已过时并被弃用。 – outis 2012-07-13 08:41:00

+0

没有规定数据的使用位置,所以在浏览器中查看是我最初的想法(与Jon相同)。 – Waygood 2012-07-13 08:43:28

回答

3

只要日志文件被其使用者视为纯文本(它应该始终),就没有漏洞。

如果您决定输出日志文件的未处理内容作为HTML的一部分,那么这将是一个真正的漏洞(可能并不是非常严重的实际影响,但仍然)。但是这个问题可能与在HTML中显示文本的“其他”代码无关,而不会调用htmlspecialchars,而不是在这里简单地写日志的代码。

3

这将取决于什么$fh是。如果$fh是一个HTML文件,您可能会遇到麻烦。不是真的,如果它是一些文本文件或外部任何浏览器无法访问。

在HTML输出的情况下使用htmlspecialchars(..)总是一个好主意。

UPDATE

是没有问题的,只要:

  • 日志文件是在别处(外面的public_html,通过浏览器基本上无法访问)
  • 您的Web服务器不发送text/html标题并将其视为正常文本文件(如果可访问)
+0

谢谢,我正在更新这个问题,提到它是一个日志文件处理程序 – Andrei 2012-07-13 08:48:42

+0

“不是真的,如果它是某个文本文件,或者是外部任何浏览器都无法访问的。”这很有趣,所以我应该把日志文件放在一个隐藏文件夹中,或者配置htaccess。 – Andrei 2012-07-13 08:52:10

+0

正如其他人所指出的,当浏览器能够访问它时,它只有一个问题**,并且将其解释为HTML。 – SuperSaiyan 2012-07-13 08:53:56

2

这可能是反映的XSS(跨站点脚本)攻击的来源(如果您正在写入提供给用户的HTML文件)。你没有受到这次攻击的伤害,但一些天真的用户会。

+2

这加强了所有保存的请求变量应该被消毒的原则。 – Pete 2012-07-13 08:42:10

+1

@Pete:消毒到底如何?如果不知道日志将如何被消耗,你会怎么做? – Jon 2012-07-13 08:45:08

+0

@Jon:好点。国际海事组织,如果消费者解释HTML和Javascript,消毒应该用PHP完成。消耗日志的程序必须执行特殊的清理(如果正在写入日志文件)。 – nhahtdh 2012-07-13 08:50:19