你的代码基本上是无辜的。唯一“明显”的攻击是反复将数据上传到您的服务器,最终耗尽您的磁盘空间。
“消毒”是一种情境。这不是你可以洒在代码上以使其变得更好的东西,就像你可以在食物上加盐一样。也许您会清理 $_POST 数据以防止 SQL 注入攻击,然后在 HTML 上下文中使用这些数据 - 现在您很容易受到 XSS 攻击。也许它是一个图像上传,并且您进行基本的 MIME 类型确定以确保它是一个图像。这一切都很好,很花哨,但是有人上传了儿童色情片,这将通过“它是图像”测试,现在你遇到了一个更大的问题。
由于您正在接受用户数据并将其写入文件,因此无法使用此代码(除了磁盘空间问题)来滥用您的系统。您不能将某些数据序列嵌入到数据中,这会导致 PHP 或底层操作系统突然停止将该数据写入磁盘并开始执行它。上传数据的类型无关紧要,因为它永远不会在可能用于影响脚本执行的上下文中使用。您只是从网络服务器中吸入一些数据,然后将其吐出到磁盘上。您不允许用户影响写入哪个文件(除非您的用户对服务器具有 shell 级别的访问权限,并且可以创建一个名为“log.txt”的符号链接,指向其他更重要的文件)。
真正的问题出现在之后......这个文件写完后你会做什么?如果您以后的代码做了一些愚蠢的事情
include('log.txt');
那么现在你确实有一个问题——你现在已经把这个“无辜”的数据放在磁盘上的一个文件中,并将它变成了潜在的可执行代码。只需<?php exec('rm -rf /') ?>
在该文件中的任何地方简单地丢弃您的服务器。
同样,考虑一下类似于 PHP 的固有愚蠢的“安全”措施magic_quotes
。PHP 开发人员(错误地和愚蠢地)假设从外部世界提交的任何数据都只会在 SQL 上下文中使用,并且无论其最终目的如何,都会对所有数据进行 SQL 转义。更糟糕的是,他们只是假设所有数据库都使用反斜杠作为转义序列。如果您从不使用 MySQL 以外的任何东西,这一切都很好,但如果您使用的是 SQL Server 怎么办?现在您必须将 PHP-provided 翻译Miles O\'Brien
成Miles O''Brien
,本质上必须 UNDO PHP 自动为您所做的。
TL;DR:不要使用霰弹枪“消毒”方法,它们几乎总是无用/毫无意义,只是在之前和之后需要更多的工作。只需在使用数据时使用特定于上下文的方法。