Script
Marco
- php
0 Vinzenz Mai0 Marco0 Vinzenz Mai
Hallo,
ich habe ein problem mit einem script. das ist ein witze portal. das findet man hier:
http://www.webhilfe.info/downloadsystem/index.php?mekat=Eigene_Scripts&user_sort_top=&down_id=6
das script benötigt php und mysql. ich habe das script installiert. es fuktioniert nur nicht. er hat die tabellen in der db erstellt. und das script lässt sich auch öffnen. nur kann ich auf nichts klicken. also irgendwo muss ein fehler sein.
hier ist es auf meiner seite.
http://www.send-sms-4-free.de/whwitzeportal/index.php
egal wo man rauf klickt. er lädt dann kurz die seite. zeigt mir aber immer nur die startseite an.
habe alle datei hochgeladen. die tabellen sind auch erst worden.
habe das verscuht nochmal zu installieren aber erfolglos. das problem besteht weiterhin.
ich hoffe mir kann jemand sagen woran das liegt.
ich danke euch für eure hilfe.
ps: über google finde ich keine hilfe dazu
vieleicht hat ja jemand kurz zeit um das zu installieren. um zu gucken ob das problem auch bei sich auf taucht
wünsche euch noch ein wunderschönes we
mfg maeggi
Hallo Marco,
habe alle datei hochgeladen. die tabellen sind auch erst worden.
habe das verscuht nochmal zu installieren aber erfolglos. das problem besteht weiterhin.ich hoffe mir kann jemand sagen woran das liegt.
so wie es aussieht, verläßt Du Dich auf register_globals = on, eine Einstellung
die bereits seit Jahren standardmäßig nicht mehr so gesetzt wird, siehe http://www.php.net/manual/de/security.globals.php.
Ich habe nirgendwo einen Zugriff auf $_GET['action'] gesehen, aber Du greifst gleich auf die Variable $action zu ...
Freundliche Grüße
Vinzenz
so wie es aussieht, verläßt Du Dich auf register_globals = on, eine
also bei mir in der /etc/php4/apache2/php.ini steht
register_globals = Off
mein safemod ist auf off liegt es vieleicht daran?
safe_mode = Off
mfg maeggi
Hallo
also bei mir in der /etc/php4/apache2/php.ini steht
register_globals = Off
sag' ich doch :-)
Schreibe Dein Skript um, so dass es mit register_globals = Off zurecht kommt.
Nochmals:
Woher kommt die Variable $action?
Wo weist Du dieser Variablen einen Wert zu?
Freundliche Grüße
Vinzenz
okay.
das ist nicht mein script, also ich habe das script nicht geschrieben. das habe ich von da
http://www.webhilfe.info/downloadsystem/index.php?mekat=Eigene_Scripts&user_sort_top=&down_id=6
Schreibe Dein Skript um, so dass es mit register_globals = Off zurecht >>kommt.
Nochmals:
Woher kommt die Variable $action?
Wo weist Du dieser Variablen einen Wert zu?
puh. leider habe ich da überhaupt keine kenntnisse drine.
also kann ich das leider nicht so umschreiben. kann man das nicht irgendwie noch anders machen? ausser register_globals = Off
auf ON zustellen oder umzuschreiben?
mfg marco
Hello,
Schreibe Dein Skript um, so dass es mit register_globals = Off zurecht >>kommt.
Um es zu TESTEN, ob es daran liegt, kannst Du ggf. NUR FÜR DAS EINE SCRIPT Register_Globals auf on stellen. Das sollte dann aber nicht so bleiben, wenn Du weißt, woran es liegt.
Dafür benötigst Du Override-Rechte für das Verzeichnis in dem das Script liegt. Dann kannst Du mit einem Eintragb in einer .htaccess-Datei im Verzeichnis
<Files scriptname.php>
php_value register_globals 1
</Files>
die Einstellung ändern.
oder eigentlich richtig:
<Files scriptname.php>
php_flag register_globals on
</Files>
Zweiteres versteht aber nicht jede Serverversion.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
ich habe es geteste. wenn ich Register_Globals auf on stelle.
funkioniert das script. also liegt es an Register_Globals= Off.
ich würde das ja gerne umschreiben das script aber das kann ich leider nicht. würde auch gerne Register_Globals auf on stellen. aber das ist mir viel zu unsicher.
mfg marco
Hallo
ich habe es geteste. wenn ich Register_Globals auf on stelle.
funkioniert das script. also liegt es an Register_Globals= Off.
sag' ich doch :-) Ich hab' in den Code geschaut!
Zusätzlich scheint sich das Skript darauf zu verlassen, dass die Magic Quotes
aktiviert sind, insgesamt sieht es so aus, als habe der Ersteller keine
Ahnung davon, wie man Daten in einer MySQL-Datenbank speichert.
Das Skript ist jedenfalls anfällig für SQL-Injection. Ich würde es nicht einsetzen :-)
Bitte teste doch einmal die Eingabe von
O'Brien
als Name.
Freundliche Grüße
Vinzenz
Das Skript ist jedenfalls anfällig für SQL-Injection. Ich würde es nicht einsetzen :-)
kann ich das nicht irgendwie noch schützen?
Bitte teste doch einmal die Eingabe von
O'Brien
als Name.
was meinst du denn damit?
mfg marco
Hallo Marco,
kann ich das nicht irgendwie noch schützen?
sicher geht das. Es läuft aber irgendwie auf "komplett neu schreiben" heraus.
Bitte teste doch einmal die Eingabe von
O'Brien
als Name.
was meinst du denn damit?
Du hast es doch nach Toms Anleitung lauffähig bekommen.
Trage einen Witz ein. Gib' als Name O'Brien ein. Alternativ kannst Du auch
einfach ein einfaches Anführungszeichen im Witztext einfügen.
Sind die Magic Quotes bei Deinem Server ausgeschaltet (was eine gute Einstellung
ist), dann crasht das Skript :-) Sind sie eingeschaltet, dann wird der Witz
eingetragen.
Freundliche Grüße
Vinzenz
sicher geht das. Es läuft aber irgendwie auf "komplett neu schreiben" heraus.
schreibst du es dann für mich neu? :)
Bitte teste doch einmal die Eingabe von
O'Brien
also der witz wird eingetragen. ohne probleme
Hello,
sicher geht das. Es läuft aber irgendwie auf "komplett neu schreiben" heraus.
schreibst du es dann für mich neu? :)
Sollte das jetzt ein Witz werden? :-)
Wir können Dir sicher dabei helfen, dass Du das selber hinbekommst, aber dafür musst Du natürlich die Grundlagen von PHP drauf haben. Hattest Du eigentlich mal das Tutorial von Quake durchgearbeitet?
http://tut.php-quake.net/
Das wäre der Stand, den Du brauchst, um Dein Script neu schreiben zu können.
Deine Scripte haben verschiedene Krankheiten.
weil Magic_Quotes eingeschaltet ist, müssten die Maskierungen ()
aus den Importdaten ($_GET, $_POST, ...) wieder entfernt
werden. Alternativ Magic_Quotes ausschalten.
Alle Variablen suchen, auf die zugegriffen wird, obwohl sie
nicht deklariert/definiert wurden. Die meisten davon kommen
dann vermutlich vom Client. Diese sollten dann umgeschrieben
werden auf $_GET['variablenname'], $_POST['variablenname'], ...
Daten für Datenbankzugriffe müssen escaped werden
Eine Fehlerbehandlung muss eingebaut werden
Trennung von Eingabe-, Verarbeitungs-, Ausgabe-Teil im Script
wird dringend angeraten.
Die Form der Scripte könnte besser sein, sodass man sie auch
verstehen kann beim Lesen. Das ist aber für die Funktion sekundär.
Alle Ausgaben müssen für den HTML-Kontext vorbereitet werden
$zu = "<a href="index.php?action=kat&katid2=$katid2&page=".$i2."">< zurück</a>";
Da müssen die &-Zeichen als & geschrieben werden
print ($tpl);
da müssen sicher auch html-eigene Zeichen ersetzt werden.
wenn alle Scripte in einem Verzeichnis liegen, sollte die
"config.php" wenigstens umbenannt werden in ".config.php", also
mit führendem Punkt. Dann sorgt bei ausgefallenem PHP-Parser
(hoffentlich) der Webserver noch dafür, dass die Datei nicht
ausgeliefert wird.
Nach Datenbank-Queries sollte man hinterher auch das Resultset
wieder freigeben, wobei das bei diesem Script wohl noch keine
Probleme geben wird mit dem Speicher. Am Scriptende wird es ja
automatisch gemacht. Angewöhnen sollte man sich sowas aber nicht.
alle Templates müssen auf valides HTML überprüft werden.
anfangen mit der Dateie header.htm
Es fehlen Document-Type und Angaben zur Codierung
Es könnte CSS eingeführt werden
Das ist erstmal das, was mir beim Durchsehen so aufgefallen ist.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
hallo,
puh, das ist ja ne ganze menge arbeit. dazu brauch ich ja wochen, bis das script fertig ist.
also ich glaube das lasse ich lieber. wenn das html gewessen wäre, würde ich das in angriff nehmen. da ich html besser kann als php. php behersche ich so gut wie garnicht.
dann werde ich mir wohl ein neues script suchen müssen.
ich danke euch aber trotzdem für eure schnelle und gute hilfe.
wünsche euch noch ein wunderschöne we
mfg maeggi
hallo,
also ich habe jetzt die ganze nacht und ganzen tag daran gewerckelt. bekomme aber eine fehlermeldung.
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/sms/whwitzeportal/index.php on line 9
hier mal die index.php
index.php alt
<?php
require ("global.php");
if($action == "") $action = "kat";
if($action == "kat") {
if($katid2 == "") {$text_bit = "Bitte wähle Links eine Kategorie aus!";
eval("\$tpl->out(\"".$tpl->get("index")."\");");
exit; }
$i = 1;
$rows = mysql_query("SELECT * FROM ".$prefix."log where kat = $katid2 && free = 0");
$rows = mysql_num_rows($rows);
$proseite = $anzpropage;
$seiten=ceil($rows/$proseite);
$start=$_GET['page'] * $proseite;
$ende = $start + $proseite;
if ($ende>$row) { $ende = $row; }
$db->query("SELECT * FROM ".$prefix."log where kat = $katid2 && free = 0 LIMIT $start,$proseite");
while($row = $db->fetch())
{
$autor = $row['autor'];
$zeit = date("d.m.Y", $row['time']);
$text2 = nl2br($row['text']);
$text2 = $text2;
$witzcolor = ($i % 2) ? "$tbg" : "$tbg2";
$i++;
eval("\$text_bit .= \"".$tpl->get("text_bit")."\";");
}
if ($_GET['page']>0) {
$i2=$_GET['page']-1;
$zu = "<a href=\"index.php?action=kat&katid2=$katid2&page=".$i2."\">< zurück</a>";
}
else $zu = "";
if ($_GET['page']<$seiten) {
$i2=$_GET['page']+1;
$vor = "<a href=\"index.php?action=kat&katid2=$katid2&page=".$i2."\">weiter></A>";
}
else $vor = "";
eval("\$tpl->out(\"".$tpl->get("index")."\");");
}
//Witze eintragen
if($action == "insert") {
if($uweon == 1){
$ameldung = "Funktion vom Admin deaktiviert";
eval("\$tpl->out(\"".$tpl->get("meldungen")."\");");
exit; }
$db->query("SELECT * FROM ".$prefix."log where katid != ''");
while($row = $db->fetch())
{
$kategorie2 = $row['kategorie'];
$katid3 = $row['katid'];
eval("\$insert_bit .= \"".$tpl->get("insert_bit")."\";");
}
if($step != "eintrag")
{
$eingetragen1 = "";
}
else
{
if($name == "") {$fehler1 = "Fehler: Bitte wähle einen Namen!";
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
exit; }
if($katid3 == "") {$fehler3 = "Fehler: Keine Kategorie ausgewählt!";
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
exit; }
if($witz == "") {$fehler2 = "Fehler: Kein Witz eingetragen!";
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
exit; }
$time = time();
$witz = htmlspecialchars($_POST['witz']);
$name = htmlspecialchars($_POST['name']);
$db->query("INSERT INTO ".$prefix."log VALUES ('', '', '$einkat', '$time', '$witz', '$name', '', '1', '')");
$eingetragen1 = "<b>Witz erfolgreich hinzugefügt</b>";
}
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
}
if($action == "impressum") {
$db->query("SELECT * FROM ".$prefix."options");
$db->fetch();
$impressum = nl2br($db->record['impressum']);
eval("\$tpl->out(\"".$tpl->get("impressum")."\");");
}
if($action == "kontakt") {
$db->query("SELECT * FROM ".$prefix."options");
$db->fetch();
$email = $db->record['email'];
eval("\$tpl->out(\"".$tpl->get("kontakt")."\");");
}
if($action == "gb") {
eval("\$tpl->out(\"".$tpl->get("gb")."\");");
}
?>
hier die index.php neu
<?php
require ("global.php");
if($_GET['action'] == "") $action = "kat";
if($action == "kat") {
if($_GET['katid2'] == "") {$text_bit = "Bitte wähle Links eine Kategorie aus!";
eval("\$tpl->out(\"".$tpl->get("index")."\");");
exit; }
$i = 1;
$rows = mysql_query("SELECT * FROM ".$prefix."log where kat = $_GET['katid2'] && free = 0");
$rows = mysql_num_rows($rows);
$proseite = $anzpropage;
$seiten=ceil($rows/$proseite);
$start=$_GET['page'] * $proseite;
$ende = $start + $proseite;
if ($ende>$row) { $ende = $row; }
$db->query("SELECT * FROM ".$prefix."log where kat = $_GET['katid2'] && free = 0 LIMIT $start,$proseite");
while($row = $db->fetch())
{
$autor = $row['autor'];
$zeit = date("d.m.Y", $row['time']);
$text2 = nl2br($row['text']);
$text2 = $text2;
$witzcolor = ($i % 2) ? "$tbg" : "$tbg2";
$i++;
eval("\$text_bit .= \"".$tpl->get("text_bit")."\";");
}
if ($_GET['page']>0) {
$i2=$_GET['page']-1;
$zu = "<a href=\"index.php?action=kat&katid2=$_GET['katid2']&page=".$i2."\">< zurück</a>";
}
else $zu = "";
if ($_GET['page']<$seiten) {
$i2=$_GET['page']+1;
$vor = "<a href=\"index.php?action=kat&katid2=$_GET['katid2']&page=".$i2."\">weiter></A>";
}
else $vor = "";
eval("\$tpl->out(\"".$tpl->get("index")."\");");
}
//Witze eintragen
if($_GET['action'] == "insert") {
if($uweon == 1){
$ameldung = "Funktion vom Admin deaktiviert";
eval("\$tpl->out(\"".$tpl->get("meldungen")."\");");
exit; }
$db->query("SELECT * FROM ".$prefix."log where katid != ''");
while($row = $db->fetch())
{
$kategorie2 = $row['kategorie'];
$katid3 = $row['katid'];
eval("\$insert_bit .= \"".$tpl->get("insert_bit")."\";");
}
if($step != "eintrag")
{
$eingetragen1 = "";
}
else
{
if($name == "") {$fehler1 = "Fehler: Bitte wähle einen Namen!";
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
exit; }
if($katid3 == "") {$fehler3 = "Fehler: Keine Kategorie ausgewählt!";
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
exit; }
if($witz == "") {$fehler2 = "Fehler: Kein Witz eingetragen!";
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
exit; }
$time = time();
$witz = htmlspecialchars($_POST['witz']);
$name = htmlspecialchars($_POST['name']);
$db->query("INSERT INTO ".$prefix."log VALUES ('', '', '$einkat', '$time', '$witz', '$name', '', '1', '')");
$eingetragen1 = "<b>Witz erfolgreich hinzugefügt</b>";
}
eval("\$tpl->out(\"".$tpl->get("einsenden")."\");");
}
if($_GET['action'] == "impressum") {
$db->query("SELECT * FROM ".$prefix."options");
$db->fetch();
$impressum = nl2br($db->record['impressum']);
eval("\$tpl->out(\"".$tpl->get("impressum")."\");");
}
if($_GET['action'] == "kontakt") {
$db->query("SELECT * FROM ".$prefix."options");
$db->fetch();
$email = $db->record['email'];
eval("\$tpl->out(\"".$tpl->get("kontakt")."\");");
}
if($_GET['action'] == "gb") {
eval("\$tpl->out(\"".$tpl->get("gb")."\");");
}
?>
ich bekomme aber eine fehlermeldung.
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/sms/whwitzeportal/index.php on line 9
ich hoffe ihr könnt mir da weiter helfen. ich finde den fehler nicht.
mfg maeggi
Hello,
also ich habe jetzt die ganze nacht und ganzen tag daran gewerckelt. bekomme aber eine fehlermeldung.
Du fängst am falschen Ende an mit den Änderungen für Dein Script
1. Error_Reporting auf E_ALL einstellen
das geht entweder in der .htaccess-Datei
php_value error_reporting 6143
siehe auch http://de3.php.net/manual/en/function.error-reporting.php
Wie Du es auf einzelne Files beschränken kannst, weißt Du ja schon.
Würde ich aber nicht machen, lieber sauber Coden
2. Mit Hilfe der nun erscheinenden Notices alle Variablen finden, die nicht im Script
selbst definiert werden, sondern von außen kommen. Diese in $_POST[], $_[GET] usw.
umbauen, je nachdem, aus welcher Quelle sie stammen müssen.
Immer mit
if (isset($_POST['variable'])) ## oder eben $_GET ...
nachfragen, ob der Wert überhaupt existiert
Erst, wenn Du dies Arbeit in allen Scripten erledigt hast, lohnt es sich, weiterzumachen.
Wenn Du schon die .htaccess bearbeitest, kannst Du auch gleich noch reinschreiben
php_value magic_quotes_gpc 0 ## oder
php_flag magic_quotes_gpc off ## wenn das funktioniert
Ab diesem Zeitpunkt ist aber Deine Datenbank gefährdet, wenn das Script öffentlich zugänglich ist oder Du selber dummes Zeug übergibst im Request. Die Datenbankabfragen müssen dann also dringend mit
mysql_real_escape_string(..., $connection)
http://de3.php.net/manual/en/function.mysql-real-escape-string.php
abgesichert werden
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom