【问题标题】:How to secure custom user input code for web page?如何保护网页的自定义用户输入代码?
【发布时间】:2023-04-07 20:59:02
【问题描述】:

我的网站上有一项功能,允许我的用户创建自定义“网页”。他们可以随意添加 HTML 元素、CSS 和自定义 javascript 代码。

我计划使用TEXTMEDIUMTEXT 将整个网页(HTML、css、javascript、jquery)代码存储在 MySQL 数据中(除非您可能有更好的解决方案?)。我也在使用 PHP。

这是我插入代码的一部分:

$stmt = prepare("INSERT INTO webpages (content) VALUES (:content));
...

如何保护正在插入数据库的内容/网页代码,和/或保护显示的文本?

这里是检索代码的一部分:

$stmt = prepare("SELECT * FROM webpages WHERE id = :id");
...

谢谢

【问题讨论】:

标签: javascript php html css mysql


【解决方案1】:

通常,如果您要存储和显示来自用户的 HTML,您应该通过类似htmlpurifier 的方式运行它,以确保 HTML 中没有恶意内容。

但是,这将删除任何 javascript,因为您不能信任任何提交的内容。

另一种方法是在 iframe 中显示用户的 HTML,方法是将其内容设置为已保存的 HTML,并启用沙盒选项。

【讨论】:

    【解决方案2】:

    您可以存储编码/加密形式的 HTML。但这不是正确的方法。当您尝试将整个网页存储在数据库中时,它会增加数据库大小并降低性能。而且你只需要允许安全的html标签。

    如果您允许 javascript 并在您的同一域下加载存储的网页内容,例如 https://yoursite.com/storedsite-id-or-name 有可能,用户可以通过使用 javascript 来强化该域的所有 cookie。

    如果用户插入 PHP 代码,则没有问题,因为 php 在您运行代码之前不会执行。如果您从数据库中获取 html 并显示为纯文本,它将不会执行。

    但在我看来。

    您可以将这些冗长的 html 内容以 encodedencrypted 形式存储在文件中。并使用unique hash 作为文件名。您也可以使用自定义扩展。

    7815696ecbf1c96e6894b779456d330e.sitedata

    并防止直接访问。并将站点信息存储在数据库中。

    喜欢,

    ------------------------------------------------------------------
    row_id | user_id | site_name   | site_source
    ------------------------------------------------------------------
    1      | 34      | sample-site | 7815696ecbf1c96e6894b779456d330e
    

    然后就可以查看网站了,

    https://yoursite.com/sample-site 当用户请求此 URL 时,您需要从 URL 中获取site-name。并从数据库中获取site source file。然后读取文件内容和decode / decrypt到实际内容。然后,您可以使用内容呈现页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 2016-08-18
      • 2010-10-03
      • 2016-01-24
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多