Partyflock
 
Forumonderwerp · 805370
Werkzaam bij HouseNation
Artiest Yoda
Waarschuw beheerder
Beetje vage topic naam zo..... Maar wat ik wil is vanuit een web pagina pingen naar een willekeurig op te geven server.

Vanaf het console werkt het, maar vanuit een browser niet.

Hier is de code:

<?php
echo '<pre>';
system('ping -c 4 $domain');
echo '</pre>';
?>


Veel meer moet het toch niet wezen lijkt mij??

Als ik bijvoorbeeld ipv "ping -c 4" -=> "dig mx" doe dan krijg ik wel output op mijn scherm.

Zou dit kunnen komen door de save mode van de PHP server?

Thx!
laatste aanpassing
Waarschuw beheerder
Pingen :lief:
Waarschuw beheerder
Ik sluit me volwaardig bij je aan..... maar vanwaar jouw voorliefde voor Ping??

:P:9
Waarschuw beheerder
Heb je een windows of linux/unix machine?

Bij de eerste moet je -n gebruiken ipv -c.


Safe_mode zorgt ervoor dat je system() sowieso niet uit zult kunnen voeren, dat is hier dus niet het probleem.

Overigens kan het zijn dat een foutmelding naar stderr geschreven wordt ipv stdout. De Windows details hierover weet ik niet, onder linux/unix kun je stderr doorsturen naar stdout door aan het eind '2>&1' toe te voegen.

PS: Laat even weten wat je precies wil. Er is namelijk de nodige kritiek te verzinnen op de manier hoe je het nu wilt doen.
Waarschuw beheerder
Narotic is zo slim.. :lief:
Waarschuw beheerder
Chrisje is lief.. :lief:
Waarschuw beheerder
Hiihihihii :bloos:
Waarschuw beheerder
Uiteraard op een Linux doos! ;)

ik heb de code nu ff voor het gemak zo:

<?php
echo '<pre>';
system('ping -n housenation.nl 2>&1');
echo '</pre>';
?>


ff voor de duidelijkheid...... dit is mijn ontmaagding wat PHP betrefd ;) Dus niet te moeilijke kreten gaan werpen.

Zoals ik de code nu heb krijg ik de volgende output:

ping: icmp open socket: Operation not permitted


Waarschuw beheerder
Probleem zit dan zo te zien niet in PHP, maar dat je uberhaupt geen ping uit mag voeren.

Je kunt de volgende dingen doen:

- ping werkend krijgen (werkt hij wel vanuit een shell?)
- andere manier gebruiken om te testen of een machine up is (bijv. connecten op poort 80 TCP oid, of SNMP gebruiken)

Let overigens wel op dit:

Waarschuwing
If you are going to allow data coming from user input to be passed to this function, then you should be using escapeshellarg() or escapeshellcmd() to make sure that users cannot trick the system into executing arbitrary commands.


(bron: http://nl3.php.net/system)

Het is erg belangrijk dat je de user input checkt als je deze gebruikt in een functie als shell.
Waarschuw beheerder
Vanuit een shell is het geen probleem. Als ik daar het php bestand run gaat het allemaal goed. Het is niet te bedoeling dat we het gaan gebruiken om te kijken of een machine up is.

Het is een tool wat in ons intranet gemaakt gaat worden om te kijken op welke site op welke server staat (hosting provider), dit zal door de mensen gebruikt gaan worden die er helemaal de ballen van snappen.

Het komt dus zowiezo in een beveiligd gedeelte te zitten.
Waarschuw beheerder
ok probleem gevonden......

De user die door Apache gebruikt wordt mag het commando ping niet uitvoeren.....

Enige suggesties om die gebruiker die rechten wel te verschaffen?
Waarschuw beheerder
Suid bit aanzetten op ping executable zal hoogstwaarsch. wel werken. Als je een ogenblikje hebt boot ik ff Debian zodat ik zelf wat kan testen...

PS: Suid bit kan wel veel gevaar opleveren als er een bug in de ping executable blijkt te zitten.


Uitspraak van yoda op dinsdag 23 augustus 2005 om 17:53:
Vanuit een shell is het geen probleem. Als ik daar het php bestand run gaat het allemaal goed.


Normale user of root?
laatste aanpassing
Waarschuw beheerder
ok, ik maak me daar niet zo heel veel zorgen om, omdat de machine intern hangt en de php scripts in een beveiligd gedeelte komt te zitten.
Waarschuw beheerder
Dat risico is dan voor jou :)

Waarsch. zal dit werken:

chmod 4755 `which ping`


Waarschuw beheerder
euhh..... voordat ik dat ga doen..... ghaha

de bak waar ik nu op aan het testen ben is een operationele machine....

Dus daar zal ik het niet op doen. haha

ik ben zo thuis dan doe ik wel wel ff op mijn pinguin thuis.

Overigens hebben we nu een andere manier werkend zonder dat er aan de rechten gekut hoeft te worden.

PING.PHP

<?php

$contentFileName=uniqid(microtime());

$contentFileName-trim($contentFileName);
$contentFileName=str_replace(" ","_",$contentFileName);
$contentFileName=str_replace(".","_",$contentFileName);


echo '<pre>';


system('./ping ' . $contentFileName ." " . $_GET["domein"]);

$filename="out/" . $contentFileName;
if(file_exists($filename))
{
include("out/" . $contentFileName);
unlink($filename);
}
echo '</pre>';
?>


Deze roept een shell scriptje aan met daarin:

ping -c 4 $2 > /home/_dev/housenation/testje/out/$1


Dan zal de ping output in een uniek bestand geschreven worden welke vervolgens door het php script wordt ge-include en vervolgens verwijderd. Waardoor er meerdere mensen het script tegelijk uit kunnen voeren.

Misschien beetje omslachtig maar het veiligste denk ik.
Waarschuw beheerder
Uitspraak van yoda op dinsdag 23 augustus 2005 om 18:22:
Misschien beetje omslachtig maar het veiligste denk ik.


Hmm, eerlijk gezegd zie ik niet in waarom dit wel zou werken. De ping applicatie wordt alsnog door user 'www' (of 'apache') uitgevoerd. :S

Nofi, maar deze oplossing heeft imho geen enkel voordeel ten opzichte van degeen die je eerder had. Daar staat wel tegenover dat de code omslachtiger is en juist weer enkele onveiligheden geintroduceerd worden (writable dir voor 'www').

PS: De suid bit op de ping executable is overigens redelijk standaard onder veel Linux distro's. Hele grote risico's zal dit ook niet met zich meebrengen.
laatste aanpassing
Waarschuw beheerder
Het verschil is nu dat er een shell script genaamd ping vanuit de php code aangeroepen wordt, en niet direkt het commando ping.

Gek genoeg werkt dit wel. Maar wat je zegt over die schrijfbare directory is wel een punt.

Help jij dan ook nog even verder zoeken naar een "mooie" oplossing?? ;)
Waarschuw beheerder
Uitspraak van yoda op dinsdag 23 augustus 2005 om 18:49:
Het verschil is nu dat er een shell script genaamd ping vanuit de php code aangeroepen wordt, en niet direkt het commando ping.


Snap ik, maar ik zie niet in wat voor verschil dat maakt. Tenzij dat shell script natuurlijk op zijn beurt weer de suid bit heeft.

Ik schrijf nu ff wat in PHP, post het straks.
Waarschuw beheerder
Het spijt me dat ik jullie discussie even ga onderbreken, maar ik heb even een vraagje aan yoda:

Moet het per sé in een PHP script verwerkt zijn?

Ik werk namelijk ook bij een Hosting/Access Provider, en wij gebruiken voor (ongeveer) dezelfde doeleinden het programma Hover IP. Met dit programma kan je o.a. NSlookups, pings, traces en poortscans uitvoeren, zonder in een command venstertje te moeten kutten. Het programma is nog geen 1 MB groot, dus daar doe je het ook niet voor.

Misschien een idee?
laatste aanpassing
Waarschuw beheerder
Simpel, veilig en slordig:

<?

$host = escapeshellcmd(trim($_GET['host']));

if(!empty($host)) {

// add 2>&1 if you want to show stderr messages

$output = shell_exec("ping -c 4 $host");

$output = nl2br($output);

// add htmlentities() or htmlspecialchars() if wanted

echo "<p>Output: $output</p>\n";

}

?>



Iets minder simpel, veiliger en netter:

<?

$host = trim($_GET['host']);

if(!empty($host)) {

if(!eregi("^([a-z0-9\-]+\.?)+$", $host)) {

echo "<p>not a valid hostname: $host</p>\n";

} else {

// add 2>&1 if you want to show stderr messages

$output = shell_exec("ping -c 4 $host");

$output = nl2br($output);

// add htmlentities() or htmlspecialchars() if wanted

echo "<p>Output: $output</p>\n";

}

}

?>



Het verschil tussen beide is hoe ze omgaan met userinput. De eerste zorgt voor de cruciale veiligheid zodat geen andere commando's uitgevoerd kunnen worden (bijv. door een ';' te gebruiken). De tweede valideert de userinput dmv een regular expression en is dus erg strict qua userinput.

PS: Met deze scripts zul je vast weer op dezelfde fout stuiten als eerder. Ik denk dat het echter beter is om uit te zoeken hoezo ping niet werkt als je een directe aanroep doet en wel werkt als je hem vanuit een shell script aanroept. Desnoods kun je de script aanroep blijven gebruiken, maar de output niet naar een file schrijven. Ik zie zelf geen voordelen in het wegschrijven naar een file. Schrijven naar en lezen van stdout zou zonder enig probleem moeten werken.
laatste aanpassing
Waarschuw beheerder
D'r is vanavond niets meer van gekomen....

Morgen ff jouw scrippie proberen.

thx!

2 Bern: Het is de bedoeling dat het webbased gaat werken. :)
 
Waarschuw beheerder
Kleine tip: Als je met je script enkel en alleen wil controleren of een host up is, kijk dan eens naar fping. fping kan meerdere hosts pingen, de output is makkelijk te parsen. Ook echoping werkt leuk in scripts.
Standaard scripts zoals Smokeping, Nagios en Castle Looking Glass bieden overigens ook iets om te controleren of hosts up zijn.
laatste aanpassing