Wie kann ich verhindern, dass PHP-Code eingegeben werden kann?
Nils
- php
0 Sönke Tesch0 Nils0 AllesMeins0 Stefan Bechtold0 Nils
0 wahsaga
0 Tobias0 Andavos0 Nils
Hi,
ich habe ein GB. Daher habe ich Inputfelder in die der User Daten eingeben kann ... Wie kann ich verhindern, dass dort irgendein PHP Code eingegeben werden kann um meine Seite zu beschädigen?
HTML Code kann man ja auch mit htmlentities() "blocken"...
Danke für eure Antworten
Nils
ich habe ein GB. Daher habe ich Inputfelder in die der User Daten eingeben kann ... Wie kann ich verhindern, dass dort irgendein PHP Code eingegeben werden kann um meine Seite zu beschädigen?
Indem Du die Daten als Daten behandelst und nicht als PHP-Code. Sowas per include() einzubinden ist eine ganz extrem dusselige Idee, benutze echo() und dergleichen.
Falls Du bereits echo() verwendest: PHP-Code wird auf dem Server ausgeführt und nur das, was was PHP-Skript _ausgibt_, wird an den Browser gesendet. Kein einziger Browser bekommt also jemals etwas von Deinen Skripten zu Gesicht. Und falls es doch einer bekommen sollte, kann er mangels PHP-Interpreter nichts damit anfangen.
Gruß,
soenk.e
Hi,
ich glaube du verstehst das falsch ... Ich meine wenn jemand in mein Eingabefeld irgendnen PHP-Code eingibt anstatt nen Text für das GB, dann wird der ausgeführt ... wenn jemand z.b. nen code für ne weiterleitung in das Feld schreibt, dann wird der Code ausgeführt sprich wird die Seite weitergeleitet. Wie kann ich das verhindern? Mit htmlentities kann man auch halt verhindern, dass HTML Code ausgeführt wird ... Ich suche dergleichen für PHP Code...
Danke
Nils
Hiho,
nein wird er nicht. Sollte er jedenfalls nicht. Wenn doch dann hast du einen unglaublich dicken Patzer in deinen Script gemacht (zum Ausgeben include verwendet oder eval() oder sowas) und kannst zumindest die Ausgabe komplett neu schreiben, wenn nicht das ganze Script... Alles andere wäre nur Flickenschusterei und wird dieses Loch nur unzureichend abdichten...
Marc
Nils du solltest die Daten aus deinem Formular so abfangen:
<?php
$text = trim($text); // Deine Feld sollte name="text" heißen!!!
if(!get_magic_quotes_gpc()) {
$text = addslashes($text);
}
// SEND TO DATABASE...
?>
Wenn du die Daten wieder aus der Datenbank ausließt solltest du wie folgt vorgehen:
<?php
$text = ...; // GET FROM DATABASE
if(!get_magic_quotes_gpc()) {
$text = stripslashes($text);
}
echo $text;
?>
Wenn du das so hast, dann kann der auf keinen FALL das PHP Script ausführen, sorry...
Gruß
Stefan
Hi,
so habe ich das leider net..
Mein Code ist folgender:
Guestbook.php:
[...]
// Hier ist das Eingabeformular
<hr>
<?php
$verbindung = mysql_connect("localhost","menager","");
$v = "SELECT * FROM gb ORDER BY ID DESC";
$ergebnis = mysql_query($v,$verbindung);
If (mysql_num_rows($ergebnis) > 0) {
while($row = mysql_fetch_object($ergebnis)) {
echo "<b><u>",$row->ID,". Eintrag:</b> Eingetragen am ",$row->Datum," um ",$row->Zeit,"</u><br>","<img src="Bilder/kopf.JPG">"," <u>",$row->Name,"</u> ","<img src="Bilder/brief.JPG">"," ","<a href="mailto:",$row->Email,"">",$row->Email,"</a>"," ","<img src="Bilder/hp.JPG"> ","<a href="http://",$row->Homepage,"" target="_blank">",$row->Homepage,"</a>","<br><br>",$row->Text,"<br><br><hr>"; }
}
else {
echo "Keine Einträge vorhanden";
}
mysql_close($verbindung);
?>
Hier der Code der Datei gb.php:
<body bgcolor="#BECCD8" link="#8A9FB2" alink="#8A9FB2" vlink="#8A9FB2">
<?php
If ($_POST['new_name'] <> "" AND $_POST['new_input'] <> "") {
$new_user = $_POST['new_name'];
$email = htmlentities($_POST['new_email']);
$hp = $_POST['new_hp'];
$input = nl2br($_POST['new_input']);
$datum = date('Y-m-d');
$time = date('H:i:s');
$host = "localhost";
$user = "";
$pw = "";
$verbindung = mysql_connect($host,$user,$pw) or die("Konnte Verbindung nicht herstellen");
mysql_select_db("menager_de_db",$verbindung) or die("Konnte Datenbank net auswählen");
$var = "INSERT INTO gb (Name, Email, Homepage, Text, Datum, Zeit) VALUES ('$new_user', '$email', '$hp', '$input', '$datum', '$time')";
$eintrag = mysql_query($var,$verbindung) or die(mysql_error());
mysql_close($verbindung);
echo "<center>Vielen Dank für ihren Eintrag im Gästebuch!</center>";
echo "<br><br><br><br>";
echo "<center><a href='guestbook.php'>Hier geht's zurück zum Gästebuch</a></center>";
}
else {
echo "Name und Text müssen eingegeben werden! Bitte füllen sie die Felder aus";
echo "<br><br><br><br>";
echo "<center><a href='guestbook.php'>Hier geht's zurück zum Gästebuch</a></center>";
}
?>
</body>
Wenn da irgendwelche Sicherheitslücken dergleichen sind...könnt ihr mir die evtl nennen?
Danke
Nils
Hi,
schicke einfach alles wie oben bereits vorgeschlagen durch htmlentities() - dann sind auch <? in unleserliche >? verwandelt worden und die Sache ist gegessen. HTML-Code hat in einem GB sowieso nix verloren, baue einfach ein bisschen UBB ([b] etc.) ein.
Sicherheitslücken: Vielleicht eine IP-Sperre? Könntest du evtl. machen, wenn du mit so bösen Besuchern rechnest, die PHP-Code in's GB schreiben
$_POST['new_name'] <> "" - was isn das für'n Stil? Vergleiche werden so geschrieben: $_POST['new_name'] != "". Scheinst wohl vorher VB oder so was programmiert zu haben
E7
// PS: Das mit dem Self-Code finde ich eine lustige Idee.
// ss:) zu:) ls:[ fo:| de:> va:( ch:~ sh:( rl:( br:> js:{ ie:{ fl:{ mo:}
Hi,
was für ne IP Sperre? Wie mach ich das? Weil man hat ja immer ne neue IP wenn man restartet ...
Danke
Nils
was für ne IP Sperre? Wie mach ich das? Weil man hat ja immer ne neue IP wenn man restartet ...
Ja, aber für die Zeit wo man nicht restartet => also besser eine neue verbindung ins internet aufbaut, hat man diesselbe und glaube keiner reconnected nur um in dein GB zu schreiben ;o) aber ein SPAM wenns nicht drin ist, ist schon lustig *gg*
Legt dir eine Tabelle an in der du die IPs erfasst die sich eingetragen haben mit einem timestamp. Dann prüfst du vor dem eintragen ob der user innerhalb der letzten 15mins, 1hour, 1 day sich schon mit der ip eingetragen hat und gut ist die sache... sinnvoller wert ist meines erachtens 30 sek oder 1 minute.
Gruß
stefan
Hi,
die Idee ist gar net so schlecht ... Dann wär Spam geklärt.. Aber wenn ich alle benutzereingaben mit htmlentities() "bearbeite" dann wird auch kein PHP Code ausgeführt, wenn er eingegeben wird?
Weil n Freund der von sowas Ahnung hat meinte htmlentities() ist nur für html code und für PHP Code gibts was anderes... Er meint jedenfalls, Ahnung zu haben
Danke
Nils
Du könntest theoretisch auch den ganzen teil zwischen <?php und ?> rausfiltern, aber warum??? lass die leute doch mal dumm darstehen wenn die schmarrn machen wollen :-)
durhc htmlentities wird doch einfach das start-tag vom php code außer kraft gesetzt... mach dir kein kopf über leute die dir so etwas sagen sondern lieber über die die dir sagen wie es besser geht ;o)
es gibt übrigends, als tipp, viele freie gästebücher, wo du dir evtl auch mal den code ansehen kannst ...
gruß
Stefan
Hi,
dann wandele ich alle entities um *g* in allen feldern ;D und dann kann meiner mehr php code eingeben... und dann mach ich noch ne IP sperre gegen spam
Naja, ich danke allen, die in diesem thread mir geholfen haben *g*
DANKE
Nils
Hallo
Hi,
dann wandele ich alle entities um *g* in allen feldern ;D und dann kann meiner mehr php code eingeben...
Naja, eingeben kann man schon, ausgeführt wird es bloß nicht. ;-)
Noch eine Möglichkeit: strip_tags()
http://www.php.net/manual/de/function.strip-tags.php
Tschö, Auge
$_POST['new_name'] <> "" - was isn das für'n Stil? Vergleiche werden so geschrieben: $_POST['new_name'] != "". Scheinst wohl vorher VB oder so was programmiert zu haben
Ich glaube man könnte fast jede Zeile hier bemängeln *g* diese Liste wird zu lange ;o) Eleganter wäre auch zum beispiel ein if(empty(...)) gewesen, aber naja, Recht hast du e7, schön blöder stil *g*
Gruß
Stefan
Hi,
wie jede Zeile bemängeln ... ? *heul* ^^ Ist da soviel unelegant?? Oder auch falsch?
Danke
Nils
Oh ja, da sind einige Sicherheitslöcher, aber dazu fehlt mir grad die Lust die alle rauszumachen *g*
Solltest dir mal eins überlegen:
-> Was kann / darf der User eingeben? = ALLES!
-> Was willst du erreichen? = Dass alles als Text angezeigt wird!
-> Was musst du diesbezüglich tun? JS filtern und HTMLEntities umwandeln. Wenn du das tust wird das Anfangstag von <? auch umgewandelt und als <? ausgegeben!
Ich weiß auch nicht warum du mysql_fetch_object verwendest. Benutze an dieser stelle bitte mal mysql_fetch_array, dann kannst du mit $row['Text'] zugreifen. vielleicht denkt er ja deswegen dass es code sein und kein text, weil es ein object ist??? *grübel* *g* denk einfach mal über ein paar dinge nach und du solltest vor einem script dir genau überlegen was du willst dun dann die funktionen raussuchen die du benutzen könntest, nachlesen obs dafür noch andere funktionen gibt und das evtl mal miteinander vergleichen, was für dich besser/effektiver ist...
Gruß
stefan
Hi,
der User soll doch seinen Text da eingeben.. von daher kann er ja alles eingeben wenn man es so will ....
Ich versteh jetzt net ganz was du meinst..
Danke
Nils
Hi,
der User soll doch seinen Text da eingeben.. von daher kann er ja alles eingeben wenn man es so will ....
Ich versteh jetzt net ganz was du meinst..
Mein Text für dein GB lautet <script language="JavaScript">window.close()</script>
Verstehst du jetzt was er meint?
Marc
Hallo,
Mein Text für dein GB lautet <script language="JavaScript">window.close()</script>
Fehlerhaft in allen Teilen, hier fehlt das Type-Attribut... ;-)
Gruß
Kurt
Hallo!
Kannst Du mir mal verraten welcher Spezialist da mit PHP irgendeine Weiterleitung veranstalten will? Oder wie man überhaupt irgendwelchen PHP-Code ausführen kann? Das geht nicht.
Ich glaube Du verwechselst hier was, Javascript könnte das Problem gewesen sein, damit kann man solche bösen Dinge machen, zumindest mit diesem Code.
Aber da Du es ja inzwischen eingesehen hast dass man auch den TEXT schützen sollte(und nicht nur den, Du musst _jedes_ Feld welches der Benutzer mit Daten füllt welches dann später ausgegeben wird(Text, Name, email, Homepage....) entsprechend mit htmlentities() bearbeiten, sonst können Leute mit Deinem Gästebuch veranstalten was sie wollen.
Eine Gefahr PHP-Code auszuführen hat zu keinem Zeitpunkt bestanden. Und selbst wenn das so wäre, alle "workarounds" die hier beschrieben wurden (alles zw. <?php ?> löschen...), egal wie ausgefuchst würde das immer eine erhebliche Sichertheitslücke darstellen, da Du vielleicht irgendeine Kleinigkeit vergisst. Und IP-Sperren bringen auch herzlich wenig, sie können bestimmte Dinge erschweren, aber nicht wirklich irgendwovor schützen.
Grüße
Andreas
hi,
ich glaube du verstehst das falsch ...
nein, du hast Sönke nicht verstanden.
Ich meine wenn jemand in mein Eingabefeld irgendnen PHP-Code eingibt anstatt nen Text für das GB, dann wird der ausgeführt ...
wenn jemand z.b. nen code für ne weiterleitung in das Feld schreibt, dann wird der Code ausgeführt sprich wird die Seite weitergeleitet.
dann hast du bei der ausgabe irgendetwas grundlegendes falsch gemacht, vom konzept her.
da wir aber deine ausgabe/konzept nicht kennen, gibt es dazu nicht viel mehr zu sagen.
gruss,
wahsaga
Hallo,
um PHP-Code auszuführen muss er ja mit <?php beginnen und mit > beendet werden.
Also durchsuche den eingegeben Text doch einfach nach < und > und ersetzte sie durch < und >
Dann wird das ganze wie Text behandelt und nicht wie ein Teilprogramm.
Tschau
Tobias
Hallo,
einfach die PHP Befehle ersetzten.
Mit so nem Befehl (Name vergessen ^^) geht das:
$text = str_replace("<?php", "", $eingabe);
Sieht dann zwar nicht schön aus, geht aber auch so
Ne andere Möglichkeit kenn ich nicht.
MFG
Andavos
Hi Andavos,
die Idee find ich gut ;D aber was ist wenn er nur <? eingibt *g* damit kann ja auch PHP anfangen... Wenn ich alle <? ersetze, wird dann auch das <? in <?php ersetzt?
Danke
Nils