PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : addslashes will auf webserver nicht


sysop
27.09.2005, 18:41:24
ich habe mir eine kleine funktion gebastelt, die mir php-code highlightet, was auch recht gut funktioniert. nun muss ich in meiner funktion mit addslashes zuerst mal backslashes hinzufügen, da die textausgabe mit sripslashes backslashes wieder entfernt (jaja, ist etwas umständlich, ich weiss). lokal auf einem apache2 funktioniert das script, schiebe ich das file hoch, kann ich machen, was ich will, es will einfach addslashes nicht annehmen. kann das an den php einstellungen liegen ?

c4
27.09.2005, 18:45:42
Unwahrscheinlich. Zeige mal den Code.

Handelt es sich um Code, der auf der Platte liegt, oder der irgendwo eingegeben wurde?

sysop
27.09.2005, 19:04:54
ich habe jetzt sogar fiolgendes versucht:


function phphighlite($code)
{
$code = adonebslash($code);
$code = str_replace("<br>", "\n", $code);
$code = str_replace("<br />", "\n", $code);
$code = trim(demutate($code));
$code="<?PHP\n".$code."\n?>";
$ziff = count_lines($code);
$maxhoch2 = (count_lines($code) * 13)+35;
if($maxhoch2 > 210) $maxhoch2 = 210;

ob_start();
$oldlevel=error_reporting(0);
highlight_string($code);
error_reporting($oldlevel);
$buffer = ob_get_contents();
ob_end_clean();

return '<font size="2"><b>php:</b></font><br>&nbsp;<div style="overflow:auto; width:100%; height:'.$maxhoch2.'px;"><table align="center" cellpadding="0" cellspacing="1" width="100%"><tr><td><table cellpadding="4" cellspacing="1" width="100%" bgcolor="black"><tr><td bgcolor="#FFFFFF"><nobr>'.$buffer.'</nobr></td></tr></table></table></div>';
}

// Backslashes hinzuf?gen
function adonebslash($text) {

$text = str_replace("\\\\\"","\\\\\\\\\"",$text);
$text = str_replace("\\\"","\\\\\"",$text);
$text = str_replace("\\","\\\\",$text);
$text = str_replace("\"","\\\"",$text);

// $text = addslashes($text);
return $text;
}


eine krücke, ich weiss, aber auch das klappt nicht.

c4
27.09.2005, 19:07:39
Bevor ich mir den Code anschaue: warum nimmst Du nicht einfach highlight_string() oder highlight_file()?

sysop
27.09.2005, 19:12:49
zuerst mal sorry, da war noch ein stripslashes zuviel im code (ich fummle gerade ;-))

das ganze liegt in einem textfile eines file basierenden forum. da ich die möglichkeit php hervorzuheben nutzen möchte wird das ganze über code-buttons gemacht, wem erzähle ich das, ihr kennt das ja.

der teil, der per [ php]text[ /php] eingebettet ist soll hervorgehoben werden.

ps
ach ja, wie gesagt, lokal funktioniert es, auf dem webserver aber nicht

c4
27.09.2005, 19:16:02
Zitat:
"Bevor ich mir den Code anschaue: warum nimmst Du nicht einfach highlight_string() oder highlight_file()?"

xabbuh
27.09.2005, 19:17:02
Und was genau spricht jetzt dagegen highlight_string() zu verwenden?

sysop
27.09.2005, 19:25:11
verwende ich ja allerdings in der funktion.

ach ja, der upb-code sieht so aus:
$text = preg_replace("#\[phpcode\](.+?)\[\/phpcode\]#esi","phphighlite('\\1')",$text);

xabbuh
27.09.2005, 19:59:41
Wie sah dein Code denn aus, als du noch addslashes() verwendet hast? Wofür pufferst du die Ausgabe innerhalb der Funktion?

sysop
27.09.2005, 20:04:03
statt des adonebslash habe ich einfach addslashes verwendet.
die pufferung hat sich deshalb ergeben, da es einige leute gibt, auf deren webspace es ohne puffer nicht funktioniert hat.

du meinst, der puffer könnte etwas damit zu tun haben ?

xabbuh
27.09.2005, 21:04:31
statt des adonebslash habe ich einfach addslashes verwendet.
Möglicherweise wurden die hinzugefügten Backslashes von demutate() oder count_lines() entfernt?

die pufferung hat sich deshalb ergeben, da es einige leute gibt, auf deren webspace es ohne puffer nicht funktioniert hat.
Da liefen aber nicht zufällig noch alte PHP-Versionen < 4.2, in denen der optionale zweite Parameter von highlight_string() nicht existierte?

sysop
27.09.2005, 21:47:54
das demutate verwandelt htmlspecialchars teilweise wieder zurück und entfernt backslashes, das ist richtig. deshalb möchte ich ja zuerst die backslashes hinzufügen, da sie durch demutate wieder entfernt werden (ist also unterm strich null).

die php-version ist nicht kleiner 4.2 es ist genaugesagt PHP Version 4.3.1 leider bekomme ich ohne den puffer eine fehlermeldung
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /srv/www/htdocs/mn/upb/functions.php on line 1783

der backslash wird also irgendwie murksig interpretiert. beim puffern habe ich mit dem selben code keinen fehler.

haltet mich bitte nicht für ungeduldig, aber mein problem ist eigentlich nicht der code selber, sondern vielmehr die tatsache, das ich es lokal fehlerfrei angezeigt bekomme, bei allinkl. habe ich aber das problem, dass mir immer wieder die backslashes abgeschnitten werden.

der erste screenshot ist lokal, der zweite wenn die datei hochgeladen wird. beide male der selbe code, unterschiedliche ausgabe.

xabbuh
27.09.2005, 23:15:45
das demutate verwandelt htmlspecialchars teilweise wieder zurück und entfernt backslashes, das ist richtig. deshalb möchte ich ja zuerst die backslashes hinzufügen, da sie durch demutate wieder entfernt werden (ist also unterm strich null).
Warum lässt du dann nicht einfach den Aufruf von stripslashes() in demutate() weg?

haltet mich bitte nicht für ungeduldig, aber mein problem ist eigentlich nicht der code selber, sondern vielmehr die tatsache, das ich es lokal fehlerfrei angezeigt bekomme, bei allinkl. habe ich aber das problem, dass mir immer wieder die backslashes abgeschnitten werden.
Hast du dir sowohl lokal als auch auf dem Webspace den Text mal vor dem Aufruf von phphighlite() ausgeben lassen? Bestehen möglicherweise hier schon Unterschiede?

sysop
28.09.2005, 00:33:47
das weglassen habe ich auch schon probiert, mit dem selben efrfekt, die ausgabe ist unterschiedlich.

der text, den ich lokal verwende ist ein backup des originals (also mit ftp heruntergeladen). bei neuen texten die ich über das textarea eingabe und in der vorschau ansehe besteht auch der unterschied (siehe die screenshots vom post oben, das sind neueingaben).

irgendwie muss ich ja fast lachen, wenn es nur nicht so traurig wäre ;-)

ich gehe über meinen proxy ins netz, da habe ich schon den cache geleert und auch mit einem anderen pc habe ich es versucht. ich selber werkele auf einer linux-maschine, habe mich über windows auf meinen rechner verbunden und nochmal auf meiner domain probiert. immer das selbe. ich denke mal, ich habe nun alle fehlerquellen durch...

das scheint mir die mystik in der edv zu sein...

ich danke jedenfalls für die viele mühe.

meikel (†)
28.09.2005, 01:17:26
das scheint mir die mystik in der edv zu sein...
Falsch. Da Du es aber nicht für nötig erachtet hattest, die erforderlichen Infos für Dein Problem zu liefern (Link auf das phpinfo von BEIDEN Servern), nehme ich mal an, daß Du den Fehler offenbar selber finden willst.

Ansonsten ist das Handling von magic_quotes_gpc in Verbindung mit highlight_string() absolut keine Hürde. Wäre das anders, gäbe es sicher auch in diesem Forumscript keine PHP Quelltextanzeige.

Die Bedeutung solcher Variablen hat man zu wissen und man fragt die Config vorher ab, wenn man keine Schönwetterscripte schreiben will, die nur dann funktionieren, wenn Ostern und Pfingsten auf einen Tag fallen.

sysop
28.09.2005, 01:43:23
im ersten posting frage ich explizit ob es an den php-einstellungen liegen kann, was für sehr unwahrscheinlich gehalten wird und quasi verneint wird. daher keine links.

selber lösen, klar würde ich das gerne selber lösen, bevor ich frage versuche ich das immer, stehe nur derzeit recht intensiv auf der leitung und frage deshalb hier nach, was es sein könnte.

einen link auf phpinfo() von localhost ? ;-))
den link zu einer infodatei auf dem webserver, gerne php_info() (http://www.mn-portal.de/fportal/testmn.php)

wenn du mir noch sagen könntest, welchen teil du brauchst, poste ich meine phpinfo vom localhost auch gerne hier her. die textdatei sieht etwas sehr unschön und unleserlich aus, aber auch das mache ich.

meikel (†)
28.09.2005, 05:21:12
im ersten posting frage ich explizit ob es an den php-einstellungen liegen kann, was für sehr unwahrscheinlich gehalten wird und quasi verneint wird. daher keine links.
Solche Auskünfte sind falsch, wenn sich das selbe Script auf unterschiedlichen Installationen unterschiedlich verhält.

den link zu einer infodatei auf dem webserver, gerne php_info() (http://www.mn-portal.de/fportal/testmn.php)
Huch? PHP 4.3.1? Bist Du Masochist? Alles was kleiner als 4.3.4 ist, kannste in die Tonne treten.

Welche PHP Version verwendest Du local?
wie lauten die Einstellungen von magic_quotes_* ?

sysop
28.09.2005, 19:27:49
magic_quotes sind alle off (also gleich wie auf dem webserver) runtime steht auf 30 (standard glaube ich).

lokal verwende ich auch 4.3.1.

was macht beim highlight denn den unterschied zwischen 4.3.1 und 4.3.4 b.z.w. wo liegt der unterschied beim file-management ? die scripte sind alle filebased also ohne datenbank.

was hat diese version mit masochismus zu tun ??

xabbuh
28.09.2005, 21:11:05
das weglassen habe ich auch schon probiert, mit dem selben efrfekt, die ausgabe ist unterschiedlich.
Worin genau besteht der Unterschied?

sysop
28.09.2005, 21:44:48
ich bin aber auch zu blöd, vor lauter checken den wald vor lauter bäumen nicht zu sehen, ich komme mir jetzt echt blöde vor.

beim herumprobieren habe ich meine php.ini immer wieder angepasst um das zum laufen zu bringen, mit dem resultat, magic_quotes_gpc ist bei mir auf ON, am webserver auf OFF. ich habe so viel herumgesucht, dass ich schon alles durcheinander gebracht habe. am webserver muss ich es also auf on bringen, dann sollte es gleich sein.

lässt sich das mit einem @ini_set('magic_quotes_gpc', "ON"); bewerkstelligen ?

entschuldigt das durcheinander, aber manchmal muss man wohl besser eine nacht drüber schlafen.

danke für die hilfe und die geduld.

ps.
die katastrophe mit der php-version würde mich aber doch noch interessieren.

xabbuh
28.09.2005, 22:20:58
lässt sich das mit einem @ini_set('magic_quotes_gpc', "ON"); bewerkstelligen ?
Wie du hier (http://de2.php.net/manual/en/ini.php#ini.list) nachlesen kannst, könntest du theoretisch magic_quotes_gpc direkt in deinem Script aktivieren. Sinnvoller wäre es aber wohl mit get_magic_quotes_gpc() (http://www.php.net/get_magic_quotes_gpc) ob die Einstellung aktiv ist und entsprechend addslashes() zu verwenden bzw. nicht zu verwenden.

Nachtrag: Da hatte ich mich verguckt. magic_quotes_gpc() ist nicht mehr im PHP-Script veränderbar.

meikel (†)
28.09.2005, 22:24:55
lässt sich das mit einem @ini_set('magic_quotes_gpc', "ON"); bewerkstelligen?
Nein.

magic_quotes_gpc "1" PHP_INI_PERDIR PHP_INI_ALL in PHP <= 4.2.3.
magic_quotes_runtime "0" PHP_INI_ALL
magic_quotes_sybase "0" PHP_INI_ALL

Teste, ob Du PHP Config Befehle in .htaccess verwenden darfst.

Falls nein (Servererror 500):
Provider nerven. Laß Dich nicht abwimmeln. Sowas ist absolut keine Arbeit.

Falls ja:
php_flag magic_quotes_gpc 1
php_flag magic_quotes_runtime 0
php_flag magic_quotes_sybase 0

ps.
die katastrophe mit der php-version würde mich aber doch noch interessieren.
Naja, die Bugliste der Versionen vor 4.3.4 war schon recht beachtlich.

Aktuell ist PHP 4.4.0. Der Compiliervorgang dauert max. 5'. Ein Provider, der selbst dazu zu faul oder zu blöd ist, seiner Kundschaft eine aktuelle PHP Version bereitzustellen, sollte definitiv gemieden werden. Es gibt genug Provider. Kein Grund also, sich so einen auszusuchen, der nur Rechnungen schreiben kann aber sonst keine Ahnung hat.

sysop
29.09.2005, 00:42:13
die .htaccess hilft.

danke nochmal und sorry, für das chaos :-)

meikel (†)
29.09.2005, 03:18:59
... und sorry, für das chaos :-)
Naja, mit der Zeit weiß man schon, nach was man suchen muß. Da ich schreibfaul bin - also keine Lust, die jeweils benötigten Variablen aufzutippern, will ich immer einen Link auf das phpinfo haben.

Zusatztip (siehe Ergänzung von xabbuh!):
magic_quotes_gpc = 1 maskiert mit addslashes() alle GET/POST/ ### COOKIE ### Variablen. Falls Du aber vorhast, solche Werte in eine DB zu stopfen, mußt Du aus Gründen der Sicherheit das addslashes() zurücknehmen und stattdessen mysql_escape_string() verwenden, weil MySQL auf mehr Zeichen als ' und " allergisch reagiert.
Beispiel:
if (get_magic_quotes_gpc())
{
$_POST['var'] = stripslashes($_POST['var']);
# usw.
}
$_POST['var'] = mysql_escape_string($_POST['var']);
# usw.

xabbuh
29.09.2005, 13:25:25
magic_quotes_gpc = 1 maskiert mit addslashes() alle GET/POST Variablen.
Nicht nur $_GET und $_POST sondern auch $_COOKIE.