Originally posted by RamonaS
View Post
Index 0 aus array entfernen?
Collapse
X
-
Comment
-
$_SERVER['SCRIPT_NAME'] ist meist sicherer. Prüfe vor der Verwendung ob das auf deinem System auch so ist.
Aber wie schon gesagt: Enfach weglassen wäre das Einfachste.
Comment
-
Und beide nur brauchbar, wenn es auch eine direkte Beziehung URL <-> Scriptname gibt.Originally posted by combie View Post$_SERVER['SCRIPT_NAME'] ist meist sicherer.
REQUEST_URI, ggf. zerlegt, ist manchmal als Alternative brauchbar.I don't believe in rebirth. Actually, I never did in my whole lives.
Comment
-
Hallo,
Ok die vorschläge schein sich ja ganz vielfältig zu sein.
Ich würde das mal von der anderen seite angehen, also Frage zu Punkt 2 von combie:
>2. PHP_SELF ermöglicht u.U. XSS Attacken
Was für Schaden kann man jetzt hier überhaupt anrichten?ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Comment
-
-
Ähmm nicht kaputt, aber ich befasse mich weniger mit schlechtigkeites dieser art...auf was menschen für ideen kommen - fantastisch!Originally posted by combie View PostDein Google kaputt?
Cross-Site Scripting ? Wikipedia
Ok ich lese mir das mal durch, scheint aber ne komplizierte sache zu sein.
Im notfall erlaube ich in eingabefelder nur die zeichen die man da drin wirklich braucht.ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Comment
-
Gehe prinzipiell immer davon aus, dass alles, was nicht unter deiner Kontrolle steht, böse sein kann. Und was der Benutzer auf seiner Seite im Browser (oder mit anderer Software) macht, kannst du nicht kontrollieren, somit erwarte immer das Schlimmste.Originally posted by RamonaS View PostÄhmm nicht kaputt, aber ich befasse mich weniger mit schlechtigkeites dieser art...auf was menschen für ideen kommen - fantastisch!
Wer im Internet gutgläubig ist, handelt sehr fahrlässig. Es gibt 99,9% "ordentliche" Menschen und 0,1% "böse" Menschen. Und diese 0,1% haben sich zur Aufgabe gemacht, die 99,9% auszunehmen. Logischerweise sind die auch nicht ganz blöd und probieren das zuerst bei denen, die "schwach" erscheinen. Wenn du also eine öffentliche (!!!) Webseite betreibst, dir aber um Sicherheit keine Gedanken machst, bist du "schwach" und somit ein leichtes und einfaches Angriffsziel.
Comment
-
Genau so eine Antwort hatte ich erwartet.Originally posted by RamonaS View PostNaja, ich hab eigentlich keine daten von der zeit als timestamp noch kürzer als 10 zeichen war.
Das "unvermeidlich" bezog sich einerseits darauf, dass mir diese Lösung als erstes eingefallen ist (bevor ich auf die Suche nach Lösungen mit den str_schlagmichtot-Funktionen gegangen bin); und andererseits darauf, dass man so eine Lösung wohl von mir erwartet (hätte)....aber ich werde die "unvermeidliche preg_replace()-Lösung" von dir zum einsatz bringen.
Das lernt man mit der Zeit. Der RegEx ist doch eigentlich ganz simpel: Ein bisschen Patternmatching -- keinmal bis vielmal ein fast beliebiges Zeichen außer "|" und danach ein "|" -- und davor eine Verankerung am Stringanfang "\A".Ich muß dir allerdings gestehen, die regex sind für mich noch viel schlimmer als mit arrays rum zu handieren.
Aber nur durchs Dranrumfummeln lernt man, wie sie funktionieren.Ich lass die dann gleich so denn wenn ich da dran fummel tut sie garantiert nicht mehr.
Ganz offensichtlich nicht, denn es liefert ein Array zurück, wir wollten doch aber mit echo eine Zeichenkette ausgeben, oder hab ich was übersehen?Originally posted by wahsaga View PostDas ist in so einem simplen Fall keine gute Idee.
explode leistest hier ganz simpel das gewünschte.
Das es sicher schneller als preg_split() ist, ist eine andere Sache.
Schön, dass du die Pauschalaussage mit "i.a.R." abgeschwächt hast.Reguläre Ausdrücke sind i.a.R. kostenintensiver als einfache Stringfunktionen.
Ich hab das jetzt mal durchgetestet:
Die Variante mit preg_replace() läuft im Schnitt ca. 30 Prozent langsamer als die mit explode(). Kostenintensiv ist was anderes.PHP Code:$zt = '1234567890|gaga|gogo|tralafitti'; // teststring
// 1 100_000
// durchlauf durchläufe durchläufe
// in ms in ms pro s
list (, $out) = preg_split('/\|/', $zt, 2); // 0.004 377.204 265108
preg_replace('/\A[^|]*\|/', '', $zt); // 0.003 330.124 302916
list (, $out) = explode('|', $zt, 2); // 0.002 248.582 402281
substr($zt, strpos($zt, '|') + strlen('|')); // 0.002 234.148 427080
substr($zt, strpos($zt, '|') + 1); // 0.002 174.253 573878
Kommen wir nun von der Geschwindigkeit zur Schönheit. Die liegt bekanntlich im Auge des Betrachters und ist daher schwerer messbar ... :-P
Ich habe mal die schon gegebenen Vorschläge eingearbeitet:Originally posted by RamonaS View Post@fireweasel
So ich hab das jetzt so gemacht:
Würdest du sagen das dieser scriptteil jetzt perfekt ist oder nur zu 100% ok?PHP Code:if(isset($_GET['uo']) and $_GET['uo']=="s") # Link wurde geklickt
{echo "<br /><br />";
$arr=explode("\n",file_get_contents($_SERVER["DOCUMENT_ROOT"]."/useronline.txt"));
foreach($arr as $line)
{echo "<br />".preg_replace('/\A[^|]*\|/','',$line),"\n";} # Ganze Zeile anzeigen, ausser Arayy Index 0
}
else
{echo "<a href='".$_SERVER['PHP_SELF']."?uo=s'>(".$all.")</a>";}
unset($dx,$arr,$line,$zt);
So in etwa würde ich das machen. Es gibt da sicher immer noch Verbesserungsmöglichkeiten, aber um die umzusetzen, müsste man mehr über das gesamte Script wissen. Was mir vor allem nicht gefällt, sind die ganzen festverdrahteten Zeichenketten. Wer sowas mal an andere Dateinamen, Pfade oder CGI-Parameter anpassen muss, darf fleißig das ganze Script umkrempeln. Viele (Quelltext-)Editoren bieten zu diesem Zweck in ihren Search-n-Replace-Dialogen übrigens Reguläre Ausdrücke an. Auf diese Weise kann man die auch üben.PHP Code:define('cgi_user_online', 'uo');
// ...
function blarg() {
// ...
$file_user_online = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'useronline.txt';
$url_self = $_SERVER['PHP_SELF']; // oder ein sinnvollerer Wert
// ...
// empty () funktioniert fast immer
// Ausnahme: '0' gehoert zu den erwuenschten Benutzereingaben
if (!empty ($_GET[cgi_useronline])) {
echo '<br /><br />';
// Datei zeilenweise in Array einlesen
// Leerzeilen werden ausgelassen
// Zeilenumbrueche entfernt
$arr = file($file_useronline, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
if (empty ($arr)) {
// Datei konnte nicht gelesen werden oder war leer, also brechen wir hier ab
return false;
}
foreach ($arr as $line) {
// entfernt das erste Feld des "Datensatzes" und Trennzeichen "|"
echo '<br />', preg_replace('/\A[^|]*\|/', '', $line), "\n";
}
}
else {
echo sprintf(
'<a href="%s"?%s=s>(%s)</a>',
htmlspecialchars($url_self, ENT_QUOTES),
cgi_user_online,
htmlspecialchars($all)
);
}
// ...
return true; // oder ein sinnvollerer Rueckgabewert
}
Offenes Auge? Oder meintest du eher ein offenes Ohr?Für änderungsvorschläge hab ich immer ein offenes auge.
Naja, immer noch besser als ein offenes Bein ...
Last edited by fireweasel; 05-07-2009, 00:13.
Comment
-
Ganz zum Anfang des Threads hiess es:Originally posted by fireweasel View PostGanz offensichtlich nicht, denn es liefert ein Array zurück, wir wollten doch aber mit echo eine Zeichenkette ausgeben, oder hab ich was übersehen?
Das mit dem Array kam hier höchstvermutlich daher, dass es schon explode genutzt wurde - aber eigentliches Anliegen wahr wohl, von einer vorliegenden Zeile nur den Rest ab einer bestimmten Position auszugeben.Ich möchte per echo den inhalt aller array-elemente ausgeben, ausser dem ersten elemend - index 0
Und je nachdem, wie einfach diese Position bestimmbar ist, wären hier weder RegEx noch explode meine erste Wahl, sondern simple Zeihenkettenfunktionen (wie strpos und substr).I don't believe in rebirth. Actually, I never did in my whole lives.
Comment
-
Zitat: Was macht ihr da an stelle von PHP_SELF ?
Da wollte ich nochmal nachhacken:Originally posted by combie View PostIch?
Einfach nur weglassen.
Soviel ich weiß ist das nicht valide, ausserdem ist das doch genau so gefährlich als vorher, ainschläußen kann man dort auch fremden code, oder?
<a href="">Link</a>
<a href="#">Link</a>
Beide varianten sind laut w3c in xhtml nicht zuläßig, ein link muß auch eine eindeutige linkadresse beinhalten!ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Comment
-
Wo hast du denn die Info her?Originally posted by RamonaS View Post<a href="">Link</a>
<a href="#">Link</a>
Beide varianten sind laut w3c in xhtml nicht zuläßig,
Ein leeres href/action-Attribut wird automatisch zur Adresse, von der das Dokument angefordert wurde, aufgelöst.ein link muß auch eine eindeutige linkadresse beinhalten!
Wo soll denn etwas eingeschleust werden, wenn gar nichts ausgegeben wird?ausserdem ist das doch genau so gefährlich als vorher, ainschläußen kann man dort auch fremden code, oder?
Hast du verstanden, worauf XSS beruht ...?
(Davon abgesehen verstehe ich die Panik, die einige hier machen, was Werte wie PHP_SELF, REQUEST_URI etc. angeht, nicht.
Vernünftig kontextgerecht behandelt stellt keiner davon eine XS-Gefahr dar.)I don't believe in rebirth. Actually, I never did in my whole lives.
Comment
-
Was ist da nicht valide?Soviel ich weiß ist das nicht valide,
Das action oder href Attribut MUSS vorhanden sein, aber es darf leer bleiben!
Dann aber nicht mehr über PHP_SELF.ainschläußen kann man dort auch fremden code, oder?
Besser eine Tür mehr zu, als eine mehr offen. 
Nach entsprechnder Ausbildung, bei bestimmungsgemäßer Anwendung und mit richtiger Schutzkleidung ist eine 70cm 3.8PS Kettensäge auch recht ungefährlich.Vernünftig kontextgerecht behandelt stellt keiner davon eine XS-Gefahr dar.
Aber das alles ist bei RamonaS offensichtlich nicht gegeben.Last edited by combie; 06-07-2009, 15:39.
Comment
Comment