需要对php Cms进行哪些安全考虑?

时间:2011-09-15 01:12:32

标签: php mysql content-management-system

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

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

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

3 个答案:

答案 0 :(得分:2)

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

来自用户的数据永远不应该被信任,并且应该被验证并过滤到最远的程度。这意味着在将所有内容放入数据库之前将其转义。这可以使用mysql的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,但有PHP代码inspde的jpgs元笔记。上传者可以接管您的服务器。请确保至少使用您自己的文件扩展名来上传文件。有些人甚至建议将所有上传的文件存储在私有位置,然后设置文件服务器脚本以使用PHP提供这些文件。有些人甚至建议扫描上传的文件以查找病毒。检查MIME类型是没有保护的。

确保您的PHP和服务器设置在设置时考虑了最佳做法。

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

答案 1 :(得分:1)

  1. 不确定
  2. 用户必须永远不会受信任。登录或不登录。
  3. 无需删除HTML标记,只需将用户输入数据编码为HTML实体,这样就不会破坏实际的HTML。来自用户的数据必须永远才能被信任。
  4. 您可以使用降价。来自用户的数据必须永远才能被信任。
  5. 我是否提到不信任用户?

答案 2 :(得分:0)

与SpiceMan合作,

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