Php 允许用户将主题文件上载到我的服务器的最佳做法是什么

Php 允许用户将主题文件上载到我的服务器的最佳做法是什么,php,mysql,frameworks,Php,Mysql,Frameworks,我正在尝试为我自己的项目创建我自己的框架,我希望人们将他们个人资料的主题上传到数据库中。让他们对自己的账户的外观和感觉进行主题化 我首先想到的是把文件放在服务器上 用户将登录,PHP将获取他们的用户id和其他杂项详细信息,并将URL路由到他们的特定文件夹,并提供该文件夹中的文件 一个例子是一个真实的 http://www.foo.bar/users/me/style.css http://www.foo.bar/users/me/script.js http://www.foo.bar/user

我正在尝试为我自己的项目创建我自己的框架,我希望人们将他们个人资料的主题上传到数据库中。让他们对自己的账户的外观和感觉进行主题化

我首先想到的是把文件放在服务器上

用户将登录,PHP将获取他们的用户id和其他杂项详细信息,并将URL路由到他们的特定文件夹,并提供该文件夹中的文件

一个例子是一个真实的

http://www.foo.bar/users/me/style.css
http://www.foo.bar/users/me/script.js
http://www.foo.bar/users/me/index.tpl
http://www.foo.bar/users/me/otherPage.tpl
然后我想哇,想象一下如果我有100个用户?然后,我的服务器上的用户目录中会有100个文件夹,更不用说到处都是重复的文件,占用了空间。所以,好吧,虽然这可能是获取文件的最快方法,但从数据库加载标记不是个坏主意,对吧

我的服务器看起来更干净了,但是现在我的数据库将被查询到比我想要的更多的内容

然后,我认为主要的问题是,拥有用户特有的文件。例如,样式表可能有带有图像的背景url,因此现在需要将这些图像链接到服务器上的实际路径。这让我想起了为每个用户提供一个专用文件夹来存放其特定主题的文件

我如何安全有效地找到一种方法,让用户上传主题并保存所有文件、图像、pdf、文档等,而不让其他帐户持有人访问,或通过简单的黑客技术从属于另一用户的服务器中提取文件

我想到的一个解决方案是,只允许登录的用户查看文件,在文件中附加一个唯一的标记,如果标记与会话变量匹配,该标记将允许用户查看文件。但是,如果一个用户想与另一个人共享该文件,那么标记该文件将使我回到安全问题的第一步,不允许查看该文件,因为他们不是授权用户

好吧,在任何情况下,什么样的最佳实践可以让我的一些关注点走上正确的道路

附言。
我之所以选择这些标签,是因为在我的解决方案中,我认为它们会涉及其中的一些方面。

您可以将html或css存储在表行中,但一定要清理数据,以避免黑客攻击或注入。最简单的方法是让用户将代码粘贴到文本区域或字段中。如果你想让他们上传文件,你需要编写一个脚本来解析上传文件中的数据。这更为复杂,因为您必须管理所有过滤和消毒,同时从文件中提取数据并将其保存到数据库。

我们将CMS皮肤化,以便与多个客户端及其自己的用户一起工作。但我们不允许他们更改页面的任何区域或样式,而是允许某些区域,例如:

上传你的标志 使用智能颜色选择器和一些“计算颜色之间的对比度”功能设置徽标后面横幅栏的颜色 使用颜色选择器设置文本颜色 对于您希望更改的项目,依此类推。 然后我们将它们存储在数据库中,并通过动态样式表提供它们。我知道这些样式表不会缓存,但这比拥有数百个文件要好

我知道MySpace曾经让你上传一大堆HTML和CSS,不知道它们是否仍然可以上传,但这是一场安全噩梦,因为XSS的潜力是巨大的


如果你想让他们添加自己的自定义HTML和完整主题,你可能想看看HTML净化器->

是的,我知道了,标准编码技术。但我不知道如何保存图片和文档。我如何保存它们,以便数据库中的css标记指向它们,而不会在重命名过程中丢失它们,等等。您可以将它们存储为/fileserver/background{$client_id}.jpg格式,以便安全地重命名它们并映射到数据库中的列。不错,我使用的方法是与Smarty一起使用,让用户自己创建模板文件,并在我预定义的站点变量中抛出,以允许某些功能或有关其自定义主题的信息。我认为Smarty包含了它自己的验证方法hmmm。如何处理用户上传的图像以应用于他们的个人资料?你们是如何管理logo上传过程的?只是这么晚才再次检查这个logo,回复->但是我用logo将它重命名为与他们的帐户id关联的散列。我尽量不使用原始名称引用任何内容。当用户登录时,它会得到相关的哈希值,并提供诸如/fileserver/logos/md5_of_client_id.png;