0

我正在使用CodeMirror设置一个简单的基于 Web 的代码编辑器,以帮助学生学习基本的 HTML、CSS 和 JavaScript。

我希望学生们能够保存他们的代码,这样它就可以在一个独立的浏览器窗口中看到,它有自己的链接,可以与朋友和家人共享以展示他们的工作(即 mydomain.com/users/ their-用户名/test.html)。

我目前有以下 PHP,但我知道我的使用$content根本不安全:

if ($_POST['type'] == 'save') {

  $content = stripslashes($_POST['code']);
  $username = addslashes(strip_tags($_POST['username']))); //i.e. markrummel
  $filename = addslashes(strip_tags($_POST['filename']))); //i.e. test, index
  $ext = addslashes(strip_tags($_POST['filetype']))); //i.e. html, css, js
  $path = '/users/' . $username . '/';
  $URL = $path . $filename . '.' . $ext;

  file_put_contents($URL, $content);

}

在大多数情况下$content应该是安全的 HTML、CSS 或 JavaScript,例如:<p>My name is Mark</p>,但我想做好准备,以防万一将恶意内容放入代码编辑器进行保存。

关于如何安全地保存和显示他们的代码的任何建议?有没有办法将每个用户的文件夹与其他用户文件夹和网站的其余部分隔离/沙箱?

也许没有安全的方法可以做到这一点,我不应该允许我不信任的任何人将代码保存到我的服务器,但如果有一种安全的方法可以做到这一点......那对这个项目来说会很棒!如果没有,我会想出别的办法。

感谢您提供的任何帮助或见解!-标记

4

1 回答 1

2

addslashes根本stripslashes不为你做任何事。我不确定您要对它们做什么,但对字符串进行斜线处理对于文件名处理或您可能在 web 应用程序中遇到的任何上下文都不是一种有用的编码形式。

strip_tags对于与文件名有关的任何事情也没有用;它从字符串中删除 HTML(但即便如此,它也不能以一种足够好的方式正确地用作防止 HTML 注入的防护措施)。

$URL = $path . $filename . '.' . $ext;
file_put_contents($URL, $content);

是的,这是非常不安全的。通过将..段放入用户名或文件名中,攻击者可以将文件存储在根路径之外。完全控制文件名,包括可以包含可执行文件(如 .php)或其他敏感文件(如 .php)的扩展名.htaccess。(即使$ext仅限于已知良好的值,根据您的服务器运行的操作系统,也有可能逃避该扩展附加。)

虽然可以通过限制文件名中可以​​使用的字符来清理文件名,但是当你可能运行时,要做到无懈可击比你想象的要难。Windows 服务器。自己生成文件名(例如,使用唯一的整数 ID 而不是攻击者提供的文件名)以存储在本地文件系统上几乎总是更好。您始终可以使用重写来使文件看起来具有不同的地址。

在大多数情况下,$content 应该是安全的 HTML、CSS 或 JavaScript

你确定那是安全的吗?

如果您从域内部提供一些用户提供的脚本,它可以控制您的任何用户在站点内所做的一切。它可以覆盖或伪造您拥有的任何用户级安全控制,以其他用户的名义上传文件等等。

您可以尝试对提交的 HTML 进行清理以使其仅使用安全标签,但这很难做到,而且如果您允许用户运行 CSS/JS,那也毫无用处!

有没有办法将每个用户的文件夹与其他用户文件夹和网站的其余部分隔离/沙箱?

是的。从不同的主机名服务每个区域。例如。将主站点http://www.example.com/与沙箱放在http://tom.users.example.com/http://dick.users.example.com/依此类推。

这可以防止直接跨站点脚本。为确保沙盒站点无法从主站点读取 cookie,请确保它也未在其上运行example.com(将其重定向到www.example.com)。

这不是一个完整的沙箱。如果您需要确保沙箱站点不能将 cookie 写入其他站点(可能会通过停止它们自己的 cookie 工作来破坏它们,那么您别无选择,只能在其自己的完整域中运行每个沙箱。如果您必须防范 Java 插件 URL 连接,每个沙箱都需要自己的 IP 地址。这很快就会变得昂贵!但这些攻击不那么严重。

于 2012-04-14T17:31:12.003 回答