Der Gästezugriff auf dieses Forum wurde limitiert. Insgesamt gibt es 11 Beiträge in diesem Thema.
Um sie alle lesen zu können müssen Sie sich vorher registrieren.

ProK1991

Foren Legende

  • »ProK1991« ist der Autor dieses Themas

Beiträge: 3 188

Registrierungsdatum: 20. Juli 2006

Wohnort: 64331 Weiterstadt

Beruf: Schulbankwärmer

  • Nachricht senden

1

Mittwoch, 23. September 2009, 00:51

Ram auslesen.

Hey ho,

Ich steh grad irgendwie total auf dem Schlauch.

Ich brauche noch ein PHP-Script das mir einfach in Textform die Grösse des Rams und die Aktuelle Auslastung angibt. Allein die Prozentuale Auslastung würde mir eigentlich reichen.

Das OS wo das script laufen soll ist Debian.

Hoff mal das da einer ne idee für mich hat

Euer
ProK1991
Systeme: Asus Eee 1000H, HP 6715s, Vaio PCG-C1XD, Musikbox, Wall-PC, Home-Server

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ProK1991« (23. September 2009, 00:51)


Thuroc

Tuxianer

Beiträge: 1 909

Registrierungsdatum: 17. Oktober 2003

Wohnort: Köln

Beruf: Sysadmin Linux, Voice Engineer

  • Nachricht senden

2

Mittwoch, 23. September 2009, 09:21

PHP selbst wird dir da nicht viel weiterhelfen, da es sich um Befehle des OS handelt welche du benötigst. Für den Client kannst du es mit der Funktion system() umsetzten. Das hier sollte auch unter Debian funktionieren:

PHP-Quelltext

1
2
3
4
<?php
var $mem system("cat /proc/meminfo");
var $cpu system("cat /proc/cpuinfo");
?>


//EDIT
Wenn du genauere Infos brauchst, kannst du ja mit " | grep" weiter verfeinern...

//EDIT 2
Pass aber verdammt gut auf die Validierung auf, optimalerweise mit Whitelists oder hardcodiert, mindestens HEX-sichere PCRE Regex via pregmatch(). Sonst kann jeder über dieses Skript den Server übernehmen, falls du $_GET oder $_POST Übergaben für den Befehl erlaubst.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Thuroc« (23. September 2009, 09:21)


ProK1991

Foren Legende

  • »ProK1991« ist der Autor dieses Themas

Beiträge: 3 188

Registrierungsdatum: 20. Juli 2006

Wohnort: 64331 Weiterstadt

Beruf: Schulbankwärmer

  • Nachricht senden

3

Mittwoch, 23. September 2009, 14:54

So Weit war ich ungefähr auch schon. Nur ist mein Problem das der Code:

PHP-Quelltext

1
var $mem system("cat /proc/meminfo"); 
Mir als Fehler

Zitat

Parse error: syntax error, unexpected T_VAR in /var/www/ram.php on line 2
Zurück gibt. Wenn ich das "var" weglasse hab ich das Problem das dann sofort das entsprechenende aus proc/meminfo eusgegeben wird :wacko:

Edit:
Hab nun Etwas gefunden das das ganze auch auslesen kann. Nur ich bekomm die Richtige ausgabe nich hin...

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
function getSystemMemInfo() 
{       
    $data explode("\n"file_get_contents("/proc/meminfo"));
    $meminfo = array();
    foreach ($data as $line) {
        list($key$val) = explode(":"$line);
        $meminfo[$key] = trim($val);
    }
    return $meminfo;
}


Ausgabe funktioniert mit

PHP-Quelltext

1
var_dumpgetSystemMemInfo() ); 

Nur schaffs ich nich das mir nur die Zahlen von MemFree und MemTotal ausgegeben werde. Selbst mit kB hintendran wär okay aber ich hab keine ahnung was ich nun wieder falsch mach...
Systeme: Asus Eee 1000H, HP 6715s, Vaio PCG-C1XD, Musikbox, Wall-PC, Home-Server

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ProK1991« (23. September 2009, 14:53)


Thuroc

Tuxianer

Beiträge: 1 909

Registrierungsdatum: 17. Oktober 2003

Wohnort: Köln

Beruf: Sysadmin Linux, Voice Engineer

  • Nachricht senden

4

Mittwoch, 23. September 2009, 19:35

Ah, ok.... dann benötigt meminfo ein Array. Hier nochmal eine alternative Schreibweise:

PHP-Quelltext

1
2
3
4
5
<?php
$ram = array();
$befehl 'cat /proc/meminfo';
system($befehl$ram);
?>


In diesem Fall hast du dann die Rückgabewerte in dem Array $ram, welches du genau so wie Arrays von Datenbanken benutzen kannst (foreach, etc.). Um nun die Zahl selbst auszulesen, hast du sehr viele verschiene Möglichkeiten mit den ganzen String-Funktionen. Schau dir aber vorher genau die Ausgabe an und passe die Suchfunktion entsprechend an.

Alternativ könntest du wie gesagt gleich mit grep in der Debian-Console (dem Befehl) weitere Suchoptionen angeben.

//EDIT
So Feierabend, jetzt hab ich was mehr Zeit darauf einzugehen.

Den String, bzw. das Array würde ich via Schleife mit nem Regex durchsuchen, so dass nur Zahlen, gefolgt von "kb" ausgegeben werden. Der Suchstring für die Suchfunktion könnte z.B. so aussehen:

PHP-Quelltext

1
var $pattern '~[0-9]{8}\20[kb|mb]~i';

Das bedeutet nicht anderes wie: 8 Zeichen im Format 0 bis 9 + ein Leerzeichen (HEX = \20) + die Zeichen kb oder mb in Folge, das i lässt Groß- und Kleinschreibung weg. Damit findest du in Strings alle Zeichenfolgen im Format "0 kb" bis "99999999 MB". Ein Problem bekommst du nur wenn die Ausgabe mehrere Werte enthällt, da in einem normalen String die ersten Suchergebnisse immer durch das letzte überschrieben wird. Also ist auch hier ein Array gefragt.

Du könntest im CPU-Array auch via strrchr() das zuletzt vorkommende "kb" suchen und dann alles dahinter löschen, somit hast du den CPU-Wert als Ganzzahl am Ende des Strings stehen. Danach nochmals die selbe Funktion mit dem Regex ~[0-9]{8}~i und schon hast du die letzten 8 möglichen Zahlen des Strings im Ergebnis. Auch diese Funktion kann man mit Schleifen so ausbauen, das alle kb/mb Zahlen im String gesucht werden, z.B. in dem du nach der ersten Suche, die Zahl löscht und den String nochmals prüfst. Auch hier wäre ein Ergebnisarray sicherer.

Poste doch mal so eine Ausgabe, dann kann auch was rumspielen :D

//EDIT2-X
Nur mal so als Anregung Regex zu lernen und zu benutzen. Die Teile sind für alle Text-Validierungen perfekt geeignet, z.B. um $_SERVER['QUERY_STRING'] zu prüfen und ungültige Übergaben via $_GET, z.B. Directory Traversal Attacken / URI Injections zu finden:

PHP-Quelltext

1
var $pattern '~^[;?]{1}[A-Z|0-9|-_]{1,10}[=]{1}[A-Z|0-9|-_]{1,10}~i';

~~ sind PCRE Begrenzer (siehe weiter unten)
^[;?]{1} verlangt GENAU ein Zeichen mit dem Inhalt ; oder ? am Anfang des Strings (^)*
[A-Z|0-9|-_]{1,10} erlaubt 1 bis 10 Zeichen von A bis Z, 0 bis 9 sowie die Sonderzeichen - und _
[=]{1} erwartet genau ein =
i steht wieder dafür die Groß- und Kleinschreibung zu ignorieren. Da es eine Option ist und nicht zum Inhalt gehört, kommt es nach den Begrenzern.

*siehe Spoiler

Dazu brauchst du eine Schleife, die mit strrchr() Rückwärts die ganze URI auftrennt. Das geht z.B. in dem du immer das letzte ; oder ? sucht, die einzelnen Ergebnisse zwischenspeicherst, den gespeicherten Teil im Originalstring löschst und die Schleife erneut durchführst. Das geht dann so lange bis das Zeichen ? gefunden wird. Hier endet die Schleife und das Ergbnis wird (mit dem letzten ? Ergebnis!) zurückgeliefert.

Hier sind also nur Strings im Format "https://www.domain.dd/index.php?a=0;1234567890=abcdef-xyz" erlaubt, wobei hier nur der Teil ab dem ? geprüft wird. Die 'https' und $_SERVER['SERVER_PORT'] Prüfung fehlt also noch für eine saubere URI, falls SSL genutzt wird...

PCRE Regex erkennt man den Begrenzern am Anfang und Ende des Pattern. Das kann jedes beliebige Zeichen sein, muss aber am Anfang und Ende gleich sein und sollte nicht im Suchstring vorkommen. Zudem sind PCRE Regex BIT-Sicher. Das bedeutet, wenn ein Angreifer in die URI \77 schreibt, meint er damit ein M. Bei herkomlichen Regex wird darauf nicht geachtet und man kommt um eine Whitelist kaum herum, falls es wirklich sicher sein soll.

Falls du z.B. bei normalen Regex den Teilstring '<script>' verbietest, schreibt der Angreifer einfach '\60\115\99\114\105\112\116\62' und umgeht somit die einfachere POSIX Regex. Das selbe gilt übrigens auch für Suchmuster die nach '<script>' suchen, aber '<ScRiPt> geliefert bekommen. Also aufpassen das man den Pattern wirklich sauber aufsetzt und alle Möglichkeiten durchspielt und wirklich nur das zulässt, was benötigt wird.

verstecken
anzeigen
 Spoiler
Hierbei ist es wichtig zu wissen, das ein ^ vor dem Suchstring z.B.
~[^A-Z] als "NICHT A bis Z" gewertet wird, nur
~^[A-Z] gilt als Platzhalter für "1. Zeichen".

Das gleiche gilt für das $ am Ende:
[9]$~ bedeutet es muss eine "9" am Ende des Strings stehen
[9$]~ jedoch bedeutet "9 ODER $" in beliebiger Anzahl!

Beide Varianten haben auch gleich eine fiese Falle mitgebracht! Hier gilt jeweils gesamte Menge als Suchstring und nicht nur das letzte Zeichen:
~^[A-Z]~
~[9]$~

Wenn nur eine Prüfung auf das erste oder letzte Zeichen vollzogen werden soll, hilft das:
~^[A-Z]{1}.~
~.[9]{1}$~

Letztes ist ganz praktisch um einem Parameterpaar zwei Steuerzeichen mitzugeben. So kann z.B. 'page=+20' im Skript ganz anders verrechnet werden wie z.B. 'page=20+' oder 'page=§20' oder 'page=20', obwohl immer mit dem selben Wert gerechnet wird.
zum Lesen den Text mit der Maus markieren

Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von »Thuroc« (23. September 2009, 19:33)


ProK1991

Foren Legende

  • »ProK1991« ist der Autor dieses Themas

Beiträge: 3 188

Registrierungsdatum: 20. Juli 2006

Wohnort: 64331 Weiterstadt

Beruf: Schulbankwärmer

  • Nachricht senden

5

Donnerstag, 24. September 2009, 08:43


PHP-Quelltext

1
2
3
4
5
<?php
$ram = array();
$befehl 'cat /proc/meminfo';
system($befehl$ram);
?>


Das ergibt wieder eine ausgabe von alleine o.O Hab ich was falsch eingestellt irgendwo oder is das einfach so?
Systeme: Asus Eee 1000H, HP 6715s, Vaio PCG-C1XD, Musikbox, Wall-PC, Home-Server

Der Gästezugriff auf dieses Forum wurde limitiert. Insgesamt gibt es 11 Beiträge in diesem Thema.
Um sie alle lesen zu können müssen Sie sich vorher registrieren.