1

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

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

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

所以对于初学者来说,我必须过滤掉",这样无论他们输入什么,他们都不能从他们的输入中逃脱,成为convert. 但是我也应该过滤掉;吗?我见过带有分号的网址......虽然分号在这里确实很危险,但过滤掉"仍然可以保证我的安全,对吗?但是网址可以包含"在其中吗?还有其他我应该注意的角色吗?

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

对不起,我漫无目的的困惑,我只是这方面的新手,想保持安全!

谢谢,
马拉

4

3 回答 3

3

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

filter_var($url, FILTER_VALIDATE_URL);

这不会阻止人们提供一个类似的 URL example.com/foo?;rm -rf,它仍然是一个有效的 URL。我不确定这是否会导致rm执行,但您也可以检查 URLparse_url()并省略查询部分。

一般来说,看看这些也是个好主意:

另请参阅有关保护用户输入的 PHP 手册

于 2010-01-14T10:35:33.017 回答
2

您可以使用escapeshellarg函数。

于 2010-01-14T10:36:25.917 回答
0

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

于 2010-02-25T16:47:15.183 回答