2010-01-14 2 views
1

У меня есть PHP приложение, которое принимает пользователь введенного $ ImageUrl и делает следующее:Закрепление строки перед Exec() ИНГ это

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

Теперь, очевидно, я должен принять некоторые меры предосторожности с этим, чтобы остановить пользователь от выполнения произвольного кода. Например, если пользователь устанавливает $url на ";rm -rf *;", это вообще не помогает.

Итак, для начала я должен отфильтровать " так, чтобы независимо от того, что они набирают, они не могут убежать от своего ввода, являющегося параметром, до convert. Но следует ли фильтровать также ;? Я видел URL-адреса с точкой с запятой в них ... и в то время как точка с запятой действительно представляет опасность здесь, фильтрация " все равно сохранит меня в безопасности? Но могут ли в них URL-адреса "? И есть ли другие персонажи, за которыми я должен следить?

Возможно, вместо того, чтобы фильтровать символы, я должен попытаться их избежать. Так что я должен попытаться избежать каждого персонажа, который интерпретируется специально оболочкой? Или просто избегайте ", поскольку все остальное является своего рода «предварительно сбежавшим», учитывая, что оно находится внутри двойных кавычек?

Извините за мое бессвязное смятение, я просто новый в этом и хочу оставаться в безопасности!

Спасибо,
Мала

ответ

3

Ну, если вы хотите, чтобы убедиться, что URL является URL, используйте filter_var

filter_var($url, FILTER_VALIDATE_URL); 

Это не будет мешать людям подачи URL, как example.com/foo?;rm -rf хотя, что по-прежнему является действительным URL. Я не уверен, что это приведет к выполнению rm, но вы также можете проверить URL-адрес с помощью parse_url() и опустить часть запроса.

Как правило, это хорошая идея, чтобы взглянуть на них, а также:

  • escapeshellarg() - Побег строку, которая будет использоваться в качестве аргумента оболочки
  • escapeshellcmd() - Побег SHELL метасимволы

Также см. PHP Manual on securing user input.

+0

Я не могу опустить часть запроса, так как некоторые сайты служат там изображения через script.php? Image = something.jpg – Mala

+0

Тогда просто используйте filter_var и функцию escape-функции оболочки – Gordon

0

Используйте регулярные выражения, чтобы гарантировать, что $ url содержит только допустимые имена файлов, например. "(\ Ш \ \ -. /) {1.256}". Кроме того, я предполагаю, что вы переименовываете файл, который пользователь загружает, чтобы быть случайным именем файла, или, по крайней мере, имя файла с белым списком (т. Е. С использованием одного и того же регулярного выражения). sha1 .ext или md5 .ext - это простые форматы для использования.

Смежные вопросы