PHP:从CodeMirror保存和显示用户代码的安全方式


PHP: Secure way save and display user's code from CodeMirror

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

我希望学生能够保存他们的代码,这样它就可以在一个独立的浏览器窗口中看到,它有自己的链接,可以与朋友和家人分享以展示他们的工作(即 mydomain.com/users/他们的用户名/测试.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> ,但我想做好准备,以防万一将恶意内容放入代码编辑器中保存。

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

也许没有安全的方法可以做到这一点,

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

感谢您提供的任何帮助或见解! -马克

addslashesstripslashes在这里根本不为你做任何事情。我不确定您要用它们做什么,但是斜杠字符串不是文件名处理的有用编码形式,也不是您在 Web 应用程序中可能遇到的任何上下文的有用编码形式。

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

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

是的,这是非常不安全的。通过在用户名或文件名中放置..段,攻击者可以将文件存储在根路径之外。完全控制文件名,包括扩展名,可以包括可执行文件(如.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 地址。这很快就会变得昂贵!但这些都是不太严重的攻击。