Php 用户提交代码演示区的安全预防措施和技术

Php 用户提交代码演示区的安全预防措施和技术,php,javascript,security,codeigniter,xss,Php,Javascript,Security,Codeigniter,Xss,也许这真的不可行。但基本上,我一直在开发一个片段共享网站,我希望它有一个“现场演示区” 例如,您正在浏览一些代码片段并单击“演示”按钮。弹出一个新窗口,执行web代码 我知道这样做会带来无数的安全风险——XSS、标签、恶意软件/硬盘下载、pr0n等等 社区将能够标记那些明显淘气的提交,但显然有些会被忽略(而且,在许多情况下,必须有人成为受害者才能发现提交的任何讨厌的东西) 所以我需要知道: 在安全方面,我应该做些什么来确保用户可以提交代码,但不能在异地运行或执行恶意代码? 供您参考,我的网站是由

也许这真的不可行。但基本上,我一直在开发一个片段共享网站,我希望它有一个“现场演示区”

例如,您正在浏览一些代码片段并单击“演示”按钮。弹出一个新窗口,执行web代码

我知道这样做会带来无数的安全风险——XSS、标签、恶意软件/硬盘下载、pr0n等等

社区将能够标记那些明显淘气的提交,但显然有些会被忽略(而且,在许多情况下,必须有人成为受害者才能发现提交的任何讨厌的东西)

所以我需要知道: 在安全方面,我应该做些什么来确保用户可以提交代码,但不能在异地运行或执行恶意代码?

供您参考,我的网站是由PHP使用CodeIgniter提供动力的


杰克

正如弗兰克所指出的,如果你想保持高水平的安全性,请使用白名单技术。这当然是有代价的(可能限制太多,难以实现)

另一种方法是开发黑名单技术。i、 e.只允许未触发任何铃声的代码。这更容易,因为您必须指定更少的内容,但它不会捕获新的漏洞

这两种技术在网络上都有大量可用的信息

依靠CodeIgniters安全功能(XSS过滤等)不会让您走得很远,因为大多数代码片段都不允许通过

无论你做什么,你都必须记住:

不要认为恶意代码只是为了伤害你网站的访问者。它还可以通过解析器/代码检查器危害服务器。例如,假设Alice上传了snippet foo。Alice故意编写代码段,以便解析器将其标记为恶意代码段,因为XSS攻击。假设您的解析器还使用恶意代码段更新数据库,以便进一步调查。爱丽丝知道这一点。除了利用XSS漏洞之外,Alice还在代码段中注入了一些SQL代码,因此当您将代码段插入数据库时,它会做各种各样的坏事

如果你真的是偏执狂,你可以有一个独立的服务器,它的唯一责任就是检查代码片段。因此,在WCS中,只有低风险的服务器会受到损害,并且您(希望)有足够的时间来修复/审核这种情况

希望这有帮助

供您参考,我的网站是由PHP使用CodeIgniter提供动力的

对不起,杰克,如果你认为这一点都不重要,那么你要理解这个问题的任何有效答案还有很长的路要走——更不用说能够区分无效的答案了

您创建的任何沙箱都将阻止有人攻击您的机器或您的客户,这些沙箱的限制性将使您的客户除了“打印”之外无法做更多的事情

您需要在定制的chroot服务器上运行suhosin的CLI版本,并且为每个脚本维护单独的环境是完全不切实际的


C.

假设您只允许使用javascript代码,那么您应该执行以下操作-

  • 购买与您的域不可识别的一次性域名
  • 在一个iframe中为用户输入的代码提供服务,该iframe由丢弃域托管
  • 这基本上就是iGoogle所做的。它阻止XSS,因为您使用的是不同的域。我所知道的唯一漏洞是恶意代码可以改变网页的位置

    如果您打算共享服务器端代码片段,那么这是另一种情况。对于java/jsp代码段,可以使用JVM内部安全类在沙箱中运行代码。如果你在谷歌上搜索,你会发现很多关于这个的信息。我想这就是谷歌在应用程序引擎中使用的东西(不过我不确定)


    除了Java之外,我不知道如何保护它。dotnet可能有一个类似的概念,但我怀疑你能否以类似的方式对PHP代码片段进行沙箱处理。

    你不能将PHP列入白名单或黑名单,它就是不起作用。如果您列出了我可以使用的命令列表,或阻止我使用恶意功能,那么什么是阻止我编写的命令:

    $a = 'mai';
    
    {$a .'l'}('somebody@important.com', 'You suck', 'A dodgy message sent from your server');
    

    您不能将PHP列入白名单或黑名单。

    这些代码片段将完全是Javascript吗?如果您想要真正的安全性,您必须开发一种技术,用于将您知道是“安全”的代码列入白名单。