【问题标题】:What security considerations need to be made for a php Cms?php Cms 需要注意哪些安全问题?
【发布时间】:2011-09-15 01:12:31
【问题描述】:

构建 Cms 很简单,您只需将内容保存在数据库中,并提供一种通过网页本身编辑该内容的方法。对吧?

那么我需要考虑哪些安全因素?考虑以下。

  1. 内容只能由登录用户修改。
  2. 将信任具有登录详细信息的用户不会插入错误数据。
  3. 用户输入中不允许使用 HTML 标记,因此在使用输入之前将其删除。
  4. 将使用替代代码集,而不是使用 HTML。例如。 [b]文本为粗体[/b]

【问题讨论】:

  • 您所列举的一切都与真正的安全考虑无关。
  • 当你考虑 4 时,请看在克苏鲁的份上,don't use use BBCode。让我们战胜这个邪恶的“标准”。
  • 不要重新发明轮子。构建一个 CMS 可能需要几个月的时间。这是一个完整的选项列表en.wikipedia.org/wiki/List_of_content_management_systems如果你认为你可以做得更好,请记住这一点xkcd.org/927
  • 一个 cms 需要几个月?嗯。
  • @dqhendricks 是的,任何人都可以在一个晚上左右组装出一个糟糕的厘米,但做好工作需要几个月的时间。当您开始考虑自定义、样式、菜单结构、权限系统、文件处理、社交媒体集成、可扩展性等时,范围会迅速扩大。

标签: php mysql content-management-system


【解决方案1】:

html 标签在打印输出之前应该被剥离或替换为 html 实体,而不一定是在放入数据库之前。许多程序会保存可编辑的数据和预先格式化的数据以提高性能。例如,如果有人将(我知道我知道)bbcodes 放入表单中,您可能希望在用户输入时保存一个版本,以及一个已解析 bbcode 并清理了 html 的版本。从内容中清除 html 只是为了防止用户将恶意 javascript 放入您的页面,从而允许他们在没有凭据的情况下访问信息或修改系统。请参阅 xxs 或跨站点脚本。

来自用户的数据永远不应该被信任,并且应该被验证和过滤到最远的程度。这意味着在将所有内容放入数据库之前对其进行转义。这可以使用 mysql_real_escape_string() 之类的函数来完成,或者使用 PDO 准备好的语句。参见 sql 注入攻击。

一个棘手的问题是确保请求来自预期的登录用户。例如,如果您登录到您的银行网站,我会向您发送一封带有图片标签的电子邮件<img src="www.yourbank.com?func=transfer&account=1234&amount=10000" />。这会导致你把钱转给我吗?不允许任何从 GET 修改系统数据的请求,但如果涉及 javascript 或病毒,这可能来自帖子。人们还经常在发送给会话中登录用户的每个表单以及表单本身中保存一个表单实例 ID。然后,他们将根据该表单实例列表检查传入的请求,忽略它自己没有发送的请求。请参阅 csrf 或 xsrf。

确保您的会话存储在安全的位置。至少与发送请求的浏览器验证会话,这意味着存储发送登录请求的浏览器,并在每次用户提交另一个请求时检查它以验证它是否是同一个浏览器。有些还会将部分 IP 地址合并到此会话验证中。

清除所有文件上传。如果有人要上传一个名为 some.jpg.php 的文件,该文件是一个有效的 jpg,但在 jpgs 元注释中包含 PHP 代码。上传者可以接管您的服务器。至少确保对上传的文件使用您自己的文件扩展名。有些人甚至建议将所有上传的文件存储在一个私人位置,然后设置一个文件服务器脚本来使用 PHP 服务这些文件。有些人甚至会建议对上传的文件进行病毒扫描。检查 MIME 类型没有保护作用。

确保在设置 PHP 和服务器设置时考虑到最佳实践。

我相信还有更多,因为你永远不会太小心,但这是一个好的开始。

【讨论】:

    【解决方案2】:
    1. 当然。
    2. 用户必须从不值得信任。登录与否。
    3. 无需删除 HTML 标签,只需将用户输入数据编码为 HTML 实体,这样就不会破坏实际的 HTML。来自用户的数据绝不是可信的。
    4. 您可以使用降价。来自用户的数据绝不是可信的。

    我有没有提到不要信任用户?

    【讨论】:

    • 1.为什么是“确定”?谁告诉你的?维基百科不同意你的看法
    • 查看 OP 上的编号列表,然后在此处查看答案.. 它的 1 比 1 :-)
    【解决方案3】:

    与 SpiceMan 结合,

    还要检查基于用户的输入,用户是任何人或机器人。通过检查,我的意思是运行并确保没有提交可注入代码试图欺骗您的安全性。还要确保输入始终在您希望的范围内。例如,您希望在执行任何其他操作之前先检查邮政编码输入,以查看提交的值是否实际上是数字。不要依赖 JavaScript 来处理您的验证。如果这样做,请在后端对 PHP 执行相同的操作。 Web 表单不是将表单发布到数据库的唯一方式。如果它在那里并且有人想要,他们会找到一种方法来做到这一点。你唯一能做的就是让他们很难进入。希望他们能绕道而行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多