2011-04-05 38 views
2

我正在使用Ubuntu并尝试获得一个PHP脚本,它将允许用户输入Youtube视频URL,脚本将下载flv并使用youtube2mp3将其转换(我发现这里:http://hubpages.com/hub/Youtube-to-MP3-on-Ubuntu-Linux)。我一直在收到基于权限的错误,并且我想知道纠正错误的最好和最安全的方法。现在我打电话Linux PHP创建文件权限被拒绝

echo system("youtube-dl --output=testfile.flv --format=18 $url"); 

只是试图让下载部分工作。什么下页显示出来是

[youtube] Setting language 
[youtube] xOMEi2g_oEU: Downloading video webpage 
[youtube] xOMEi2g_oEU: Downloading video info webpage 
[youtube] xOMEi2g_oEU: Extracting video information 
[youtube] xOMEi2g_oEU: Extracting video information 

显示我的(无关)输出的其余部分之前。在Apache错误日志中,我得到

ERROR: unable to open for writing: [Errno 13] 
    Permission denied: u'testfile.flv.part' 

这明显表示权限问题。我是否必须将有问题的目录切换到www-user?这是安全的吗?或者我应该改变目录吗?最终我会把这个放在面向公众的服务器上,我不希望我的实现中有任何漏洞。任何和所有的建议和答案非常感谢!

+0

忘了提,我通过YouTube-DL来源看这里:HTTP:/ /www.xtga.net/downloads/youtube-dl和脚本似乎使用的urllib2做文件下载,我怀疑这是非常相关的,虽然我敢肯定,这是用户在执行命令的问题,削减他们的权限允许 – dude 2011-04-05 05:28:07

回答

4

这是运行在用户运行PHP的过程,从而两件事情:

  1. 确保此用户有权访问你写你的testfile的出来的目录。我会指定一个被隔离的路径,而不是它现在正在做的web服务器目录结构的一部分
  2. $url来自用户输入吗?如果是的话,我会在整个字符串上使用escapeshellcmd以确保在那里没有随机的rm -rf *命令。
+0

我将如何找到运行php进程的用户?如果在我的脚本中,我把“echo exec(”whoami“);”它打印www用户,会是用户?我要创建一个新的文件夹,在/ var/videofiles /,我将如何确保用户具有访问它? chmod呢? – dude 2011-04-05 16:40:56

+0

经过一些Google搜索后,我使用了ps aux | grep apache和用户是万维网数据,所以这是运行Apache/PHP的用户?我的目录/ var/videofiles /在其权限最右边的3列中有r-x,我应该chmod它以便该部分读取rw-? – dude 2011-04-05 17:03:45

0

chown只能由超级用户使用,所以如果方便的话可以使用它,但服务器通常不会像超级用户那样运行,所以我会选择chmod。

0

@ Wes的建议值得关注;您不希望某些goofball提供像||nc -l 8888 | sh &这样的网址,并在稍后登录您的系统。

我强烈建议您如AppArmorSElinuxTOMOYO,或SMACK工具限制您的配置。任何这些mandatory access control工具都可以阻止应用程序写入特定位置,执行任意命令,读取私人数据等。

由于我在AppArmor系统上工作了十年,这是我最熟悉的用;我相信你可以在半天左右的时间内为你部署一个配置文件。 (它会带我大约十到十五分钟,但就像我说的,我一直工作在AppArmor配置了十年:)

+0

我读了维基百科MAC页面的前几个段落,并通过AppArmor网站浏览......我了解MAC的总体思路,但apparmor网站只是压倒了我。我正在处理的仅仅是一个基本的LAMP脚本加上youtube2mp3功能,我不知道从哪里开始保证这一点,我已经做了输入验证和消毒处理,但不会伤害AppArmor到位当然。 – dude 2011-04-05 17:12:57

+0

@dude,或许在一个较小的程序上通过示例学习会有所帮助;尝试'apt-get install xpdf'来安装旧的'xpdf' PDF查看器,然后在一个终端中运行'aa-genprof xpdf',在另一个终端中运行'xpdf /path/to/a/file.pdf&'。回答问题,重新启动程序几次,尝试一下,看看它在一段时间后是否有意义。 :)你总是可以回到'rm /etc/apparmor.d/usr.bin.xpdf; /etc/init.d/apparmor reload'。 – sarnold 2011-04-05 23:04:51

+0

谢谢@sarnold,现在我正急于获得一个概念证明,希望在今年夏天能够获得软件开发实习,但是一旦我有了应用程序和一个合理的演示发布,我将会回到您的按照您的描述评论和学习AppArmor。再次感谢:) – dude 2011-04-07 06:21:29