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