gpt4 book ai didi

php - 写入文件的输入可以被恶意篡改吗?

转载 作者:可可西里 更新时间:2023-11-01 13:14:56 24 4
gpt4 key购买 nike

Uber 简单的例子来说明这一点:

$message = $_POST['message'];

$fp = fopen("log.txt", "a");
fwrite($fp, $message);

fclose($fp);

我应该为 $_POST['message'] 变量清理用户输入吗?

我理解准备好的语句(用于数据库清理)和 htmlentities(如果我在某个时候将 POST 消息输出回屏幕)但在这种情况下,输入只是位于一个日志文件中,该文件将由一个小的 PHP 脚本读取(via fopen())

答案是否取决于阅读方式?例如,如果我通过 fopen() 打开日志文件,它应该是 htmlentities,如果我打算下载日志文件并用 Excel 读取(用于过滤目的),则没有什么可做的完成了吗?

最佳答案

您的代码基本上是无辜的。唯一“明显”的攻击是反复将数据上传到您的服务器,最终耗尽您的磁盘空间。

“ sanitizer ”是视情况而定的。这不是你可以在代码上撒些东西来让它变得更好,就像你可以在食物上撒盐一样。也许您会清理 $_POST 数据以防止 SQL 注入(inject)攻击,但随后在 HTML 上下文中使用该数据 - 现在您很容易受到 XSS 攻击。也许它是一个图像上传,你做基本的 MIME 类型确定以确保它是一个图像。这一切都很好,很花哨,但是有人上传了 child 色情片,这将通过“它是图像吗”测试,现在你遇到了一个更大的问题。

由于您正在接受用户数据并将其写入文件,因此使用此代码(磁盘空间问题除外)无法滥用您的系统。您不能将某些数据序列嵌入到会导致 PHP 或底层操作系统突然停止将该数据写入磁盘并开始执行的数据中。上传数据的类型无关紧要,因为它永远不会在可能用于影响脚本执行的上下文中使用。您只是从网络服务器中吸取一些数据,然后将其输出到磁盘。您不允许用户影响写入哪个文件(除非您的用户对服务器具有 shell 级访问权限,并且可以创建一个名为“log.txt”的符号链接(symbolic link)指向其他一些更重要的文件)。

真正的问题是在之后……写入文件后如何处理它?如果你后面的代码做了一些愚蠢的事情,比如

include('log.txt');

那么现在您确实遇到了问题 - 您现在已经将位于磁盘文件中的“无害”数据转换为可能的可执行代码。只需要一个简单的 <?php exec('rm -rf /') ?>该文件中的任何位置都会破坏您的服务器。

同时,考虑一些类似于 PHP 的 magic_quotes 的固有愚蠢的“安全”措施。 . PHP 开发人员(WRONGLYSTUPIDLY)假定从外部世界提交的任何数据永远只会在 SQL 上下文中使用,并且对所有数据进行 SQL 转义,无论其最终目的。更糟糕的是,他们简单地假设所有数据库都使用反斜杠作为转义序列。如果您只使用 MySQL,那一切都很好,但如果您使用的是 SQL Server 怎么办?现在你必须翻译 PHP 提供的 Miles O\'BrienMiles O''Brien ,本质上必须撤消 PHP 自动为您执行的操作。

TL;DR:不要使用霰弹枪“ sanitizer ”方法,它们几乎总是无用/毫无意义,只是前后需要做更多的工作。只需在您使用数据时使用特定于上下文的方法。

关于php - 写入文件的输入可以被恶意篡改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14555392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com