PHP/MySQL安全问题

PHP/MySQL安全问题,php,mysql,security,Php,Mysql,Security,我在WebHost上有一个PHP/MySQL网站(http://www.boisvert.me.uk;但目前正在进行审查)我担心它的安全性。我所做的会让任何网站变得脆弱;这相当于给孩子们尖锐的包皮环。我有各种各样的想法来最小化网站的脆弱性,但欢迎更多的建议 特别是,有两个脚本: 上传脚本。其目的是允许注册站点用户上载某些XML文件(教程)。显然,要做到这一点,网站上的文件夹为访问者提供了写访问权限。我不喜欢这样,但我看不到解决方法,我可以在脚本中添加检查(类型、大小),以确保上传的文件仅限于X

我在WebHost上有一个PHP/MySQL网站(http://www.boisvert.me.uk;但目前正在进行审查)我担心它的安全性。我所做的会让任何网站变得脆弱;这相当于给孩子们尖锐的包皮环。我有各种各样的想法来最小化网站的脆弱性,但欢迎更多的建议

特别是,有两个脚本:

  • 上传脚本。其目的是允许注册站点用户上载某些XML文件(教程)。显然,要做到这一点,网站上的文件夹为访问者提供了写访问权限。我不喜欢这样,但我看不到解决方法,我可以在脚本中添加检查(类型、大小),以确保上传的文件仅限于XML和一些图像。我还有其他可以改进的地方吗

  • 脚本2是PHP的解释器-用户可以在表单中输入PHP并执行(不保存)。我希望允许用户尝试数据库访问,因此一个粗略的字符串替换可以确保我不需要泄露MySQL访问信息。但攻击者可以使用此解释器访问文件区域并上载不受欢迎的内容。我的解决方案是将解释器放在一个单独的域中,在这个域中不能上传任何文件


任何关于这方面的改进建议都是欢迎的,除了“不要这样做”。我知道这很危险。过马路也是如此。谢谢你的帮助。

好吧,脚本2在我看来绝对是不可能的。除非您完全确定可以避免任何不希望在服务器上运行的脚本(相信我,这根本就没有做到)。我会放弃这个想法。在这种情况下,您更有可能编写此脚本并存储代码,直到您审阅了代码,然后用户可以执行它

我不确定你想给他们什么访问数据库的权限,但也许你可以通过创建某种表单来控制它,比如:

(1) give me data from [table]
(2) based on these critera
(3) from startdate to enddate
不确定那是否适合你的需要。。但是,如果您只是想让他们访问数据库,那么使用搜索函数进行访问比让他们执行PHP代码更容易控制


你的第一个问题只是一个风险,如果你没有很好地保护它。打开文件夹进行上传并不是最大的风险,没有人可以将文件放在那里。风险在于安全性差,允许上传恶意文件(例如PHP文件),然后再运行。因此,除了检查文件类型、文件扩展名、文件大小、文件头等,您可能还希望将这些文件放在网站根文件夹之外。如果它们只是图像和XML文件,您可以编写PHP脚本,以获取文件内容(file_get_contents),并根据读取的内容创建一个XML/图像文件。

在第一种情况下,如果您检查以确保上传的文件是XML或图像,并且不允许任何其他类型,则可以。我看不出有什么问题


你想做的第二件事是我关心的事。即使您将PHP解释器放在单独的域中,这仍然是危险的,因为任何人都可以使用它发送垃圾邮件或解释自己的脚本来删除您的文件或其他内容。我看到的唯一解决方案是不允许php命令和表达式列表,尽管您必须确保列表已满。抱歉,没有其他想法…

在PHP中

关于第二点,您可以通过

  • 禁用所有可执行外部命令的功能
  • 禁用fopen URL包装器以防止
    http://
    请求
  • 禁用
    mail
    命令、
    curl
    和所有其他可能有问题的命令和包装器-下面是一个有用的列表:
  • 安装补丁
  • 为每个用户创建数据库;发布mySQL凭据仅限于一个数据库。(您将无法保护单个数据库。)
这些都不能在共享主机上完成,但是,这些东西需要对服务器的根访问权限。在共享主机上,我要说的是,你想做的是不可能的

使用虚拟机

另一个想法:我不知道你的项目的背景/预算/目标受众是什么-如果你只能使用一家网络托管公司,这是不可能的-但如果是一个大学项目(=学生数量有限,时间跨度较长),您是否考虑过以每用户虚拟机的形式创建一个真正的沙盒解决方案

每个用户都可以拥有自己的虚拟机,其中预装了PHP和mySQL,并且可以在上面做任何他们喜欢的事情。您将阻止它访问外部世界,并在学生处理完每个VM后将其处理掉


从预定义映像创建每个虚拟机应该是可能的,但显然这需要大量的硬件资源和系统管理工作,因此它可能不是您场景的解决方案

前面的答案涵盖了第一点(在本网站的其他地方可能有很多次)

对于第二点,如果你觉得你必须拥有这个,我将提出一些建议。您可以编译自己的PHP二进制文件,排除您不希望用户需要的所有选项(可能省略除MySQL之外的所有选项)。然后,您应该创建一个php.ini文件,该文件将禁用任何可能有危险的函数(使用disable_functions config选项,参见其他答案)。将内存使用和CPU时间限制在合理的范围内(对于希望允许用户运行的简单脚本)。现在我们应该能够在chrooted环境中使用类似
system(“chroot/path/to/secure/dir./php tempfile.php”)的东西来运行所有这些/path/to/secure/dir应该是将用户PHP脚本写入临时文件的目录。它应该包含PHP可执行文件和secure PHP.ini文件。这些文件和安全目录应该是