Защита строки перед exec () ее - PullRequest
1 голос
/ 14 января 2010

У меня есть приложение PHP, которое принимает введенный пользователем $ imageurl и выполняет следующие действия:

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

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

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

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

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

Спасибо
Мало

Ответы [ 3 ]

3 голосов
/ 14 января 2010

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

filter_var($url, FILTER_VALIDATE_URL);

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

Как правило, это хорошая идея, чтобы посмотреть на них:

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

Также см. Руководство по PHP для обеспечения безопасности пользовательского ввода .

2 голосов
/ 14 января 2010

Вы можете использовать функцию escapeshellarg .

0 голосов
/ 25 февраля 2010

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

...