我有一个PHP应用程序,它采用用户输入的$ imageurl并执行以下操作:
exec('convert "'.$url.'" -thumbnail 80x500 "images/out.jpg"');
现在显然我必须采取一些预防措施来阻止用户执行任意代码。例如,如果用户将$url
设置为";rm -rf *;"
则一点也不好。
所以对于初学者我必须过滤掉"
,这样无论他们输入什么内容,他们都无法逃脱他们作为convert
参数的输入。但是我应该过滤掉;
吗?我已经看到了带有分号的网址......虽然分号确实存在危险,但过滤掉"
仍然会让我安全吗?但网址中有"
吗?还有其他我应该注意的角色吗?
也许我应该尝试逃避它们,而不是过滤掉角色。那么我应该尝试逃避shell专门解释的每个角色吗?或者只是逃避"
因为其他所有内容都是“预先转义”,因为它在双引号内?
对不起我的漫无边际的困惑,我对此很陌生并希望保持安全!
谢谢,
马拉
答案 0 :(得分:3)
好吧,如果您想确保网址是网址,请使用filter_var
filter_var($url, FILTER_VALIDATE_URL);
这不会阻止人们提供像example.com/foo?;rm -rf
这样的网址,但这仍然是有效的网址。我不确定这是否会导致rm
执行,但您也可以使用parse_url()
检查网址并省略查询部分。
一般来说,最好还是看看这些:
答案 1 :(得分:2)
您可以使用escapeshellarg功能。
答案 2 :(得分:0)
使用正则表达式确保$ url仅包含有效的文件名字符,例如“(\ W \ \ - /){1256}”。另外,我想你将用户上传的文件重命名为随机文件名,或者至少是白名单文件名(即使用相同的正则表达式)。 sha1 .ext或 md5 .ext是易于使用的格式。