在exec()之前保护字符串

时间:2010-01-14 10:29:52

标签: php security shell-exec

我有一个PHP应用程序,它采用用户输入的$ imageurl并执行以下操作:

exec('convert "'.$url.'" -thumbnail 80x500 "images/out.jpg"');

现在显然我必须采取一些预防措施来阻止用户执行任意代码。例如,如果用户将$url设置为";rm -rf *;"则一点也不好。

所以对于初学者我必须过滤掉",这样无论他们输入什么内容,他们都无法逃脱他们作为convert参数的输入。但是我应该过滤掉;吗?我已经看到了带有分号的网址......虽然分号确实存在危险,但过滤掉"仍然会让我安全吗?但网址中有"吗?还有其他我应该注意的角色吗?

也许我应该尝试逃避它们,而不是过滤掉角色。那么我应该尝试逃避shell专门解释的每个角色吗?或者只是逃避"因为其他所有内容都是“预先转义”,因为它在双引号内?

对不起我的漫无边际的困惑,我对此很陌生并希望保持安全!

谢谢,
马拉

3 个答案:

答案 0 :(得分:3)

好吧,如果您想确保网址是网址,请使用filter_var

filter_var($url, FILTER_VALIDATE_URL);

这不会阻止人们提供像example.com/foo?;rm -rf这样的网址,但这仍然是有效的网址。我不确定这是否会导致rm执行,但您也可以使用parse_url()检查网址并省略查询部分。

一般来说,最好还是看看这些:

另见PHP Manual on securing user input

答案 1 :(得分:2)

您可以使用escapeshellarg功能。

答案 2 :(得分:0)

使用正则表达式确保$ url仅包含有效的文件名字符,例如“(\ W \ \ - /){1256}”。另外,我想你将用户上传的文件重命名为随机文件名,或者至少是白名单文件名(即使用相同的正则表达式)。 sha1 .ext或 md5 .ext是易于使用的格式。