Команда UNIX whois через PHP и system()

Я хочу получить простую форму, используя системную команду php и unix «whois». Где ошибка? :-/

        <form action="whois.php" method="get" >
<p>
    Domainadresse (ohne <i>http://</i> oder <i>www</i>) <input type="text" name="domainname" value="teleschirm.info" /> 
    <input type="submit" value="Okay, Abfrage starten!" />
</p>
</form>
<?php
echo '<pre>';
$last_line = system('whois 
    echo $_POST[domainname]
' , $retval);
echo '</pre>'
?>

person Wilhelm    schedule 13.08.2015    source источник
comment
ваш код возвращает какую-либо ошибку?   -  person Thiago Elias    schedule 14.08.2015
comment
прекрасная уязвимость к атаке с внедрением оболочки. буквально наслаждайтесь тем, что ваш сервер полностью уничтожен. например $_POST['domainname'] = '; rm -rf ');   -  person Marc B    schedule 14.08.2015
comment
@MarcB Я сделал то же самое, и кто-то проголосовал за эту мысль :-)   -  person Kevin Seifert    schedule 14.08.2015
comment
@KevinSeifert: действительно. люди продолжают говорить, что php небезопасен... они действительно должны говорить, что большинство (некоторые? немногие?) разработчики php не заботятся о безопасности.   -  person Marc B    schedule 14.08.2015
comment
В вашем языке есть библиотеки для выполнения запросов whois, так зачем убегать в оболочку? Это кошмар безопасности и производительности...   -  person Patrick Mevzek    schedule 02.01.2018


Ответы (3)


Вы используете одинарные кавычки. То, что находится между одинарными кавычками, не оценивается, поэтому ваша переменная не копируется в строку, которую вы передаете в system. Измените строку на

system("whois {$_POST['domainname']}" , $retval);
person twentylemon    schedule 13.08.2015

form использует метод get, но php-код использует переменную post. выберите один для обоих.

использование переменной в системе неверно:

$last_line = system('whois '.$_POST['domainname'] , $retval);

вы делаете отметку с возвращаемым значением:

echo $retval;

как отмечали другие: пользовательский ввод необходимо дезинфицировать с помощью escapeshellarg() или escapeshellcmd()

person Community    schedule 13.08.2015

Стоит отметить, что здесь есть серьезная дыра в безопасности, и ее, как правило, следует избегать. Пользовательский ввод не должен передаваться system() без тщательной очистки. Что произойдет, если это чей-то домен?

sorry.com; rm -rf /

Он удалит все на сервере. Вы захотите очистить данные, возможно, с помощью escapeshellarg() и/или escapeshellcmd().

Я бы удалил все за пределами [a-z0-9] и, возможно, пару невредных специальных символов, таких как _, -, . Одинарная кавычка аргумента.

:-)

person Kevin Seifert    schedule 13.08.2015
comment
Это должен быть единственный разумный ответ на вопрос. Ошибка явно начинается с использования system() для выполнения запроса whois. - person Patrick Mevzek; 02.01.2018