Blog

tags: news software deutsch opensource cbBlog


18.Jan.2017 17:31 - last update: 19.Jan.2017 03:15

cbBlog mit Emailbenachrichtigung bei Kommentaren

Nach langer Pause tut sich mal wieder was am Blog. Und zwar kann man jetzt mit einer Emailadresse kommentieren. Die wird nicht weiter angezeigt, bewirkt aber, daß man sich benachrichtigen lassen kann, wenns neue Kommentare gibt.

Freiwillige sind herzlich zum Testen und Vorschlagen von Verbesserungen eingeladen.

ToDo

Bislang ist das ein "One-way-opt-in", was bedeutet, sobald man diese Email-Adresse angibt, bekommt man auf folgende Kommentare die Benachrichtigung. Ich beabsichtige dies als "double-opt-in" zu erweitern. Also so, daß man erst eine Bestätigung per email absetzen muß. Das erhöht die Sicherheit auf beiden Seiten. Ich hoffe so, nicht so schnell auf irgendwelchen Spamblacklists zu landen, und möglichst niemanden mit unerwünschter Post zu behelligen. Außerdem kann dann nicht mehr jemand Fremdes irgendeine Emailadresse (ab)bestellen, die er gar nicht besitzt.
[ done ]

Auch möchte ich mal die Kommentare nach Faden sortieren können. So daß man direkt auf einen bestimmten Kommentar antworten kann, und diese Antwort dann auch richtig einsortiert erscheint.

Außerdem plane ich noch ein Trackbacksystem zu implementieren. Das wird aber vermutlich noch etwas dauern. Einen kleinen Gedankenaustausch gab es bereits dazu...

Download hier: https://github.com/chris-blues/cbBlog




comments

1) onli

18.Jan.2017 19:52

Dann ist das jetzt ein erster Testkommentar.

2) 0815

18.Jan.2017 21:34

Bei <a href="https://github.com/chris-blues/cbBlog/blob/master/postcomment.php" target="_blank">https://github.com/chris-blues/cbBlog/blob/master/postcomment.php</a> baust du ja in Zeile 141 den INSERT und verwendest einige Variablen ungefiltert:
z.B.:
{$_POST["affiliation"]}', '{$_POST["answerTo"]}'
Während du andere entsprechend filterst:
$queryemail = mysqli_real_escape_string($concom, $email);

Bin jetzt bei weitem kein php nerd, und ein POST Request lässt sich beliebig manipulieren, bist du dir sicher, dass die Geschichte sicher gegenüber SQL-Injections ist?

Bastel gerade auch an meinem Blog, bei mir ist das backend sqlite, deswegen auch mein gesteigertes Interesse an deinem Post ;).

3) chris_blues

18.Jan.2017 23:18

Erstens: Ich freue mich sehr über eure Kommentare. (Hab mal den einen von Dir wieder entfernt - er schien identisch) 😇

Bin jetzt bei weitem kein php nerd

Ich auch nicht! :o) Trotzdem machts Laune!

Zum MySQLi:
Ja, hab ich vorhin auch hin- und herüberlegt. Das sind eigentlich Werte, die der normale User gar nicht zu sehen bekommt. Ein bösartiger Angreifer könnte <i>allerdings</i> böse Dinge damit tun. Danke für den Hinweis! Ich merke, ich muß da meine Standardparanoia noch etwas hochschrauben. Fazit: Es macht durchaus Sinn alle Felder zu escapen via mysqli_real_escape_string(). Werd ich gleich mal umsetzen! <span class="notes">[ done ]</span>

Jruß
chris

P.S. sagt auch gerne mal was zu den Benachrichtigungsmails, die ihr nun bekommen solltet! Ist alles nur so'n erster Entwurf...

P.P.S. Aaargh! Jetzt habe ich deinen ersten Kommentar gelöscht, 0815, und vermutlich war das der mit deiner Adresse. Du wirst also wohl keine Benachrichtigung erhalten haben... Sorry, falls ich das übersehen habe! Da mußt Du dich wohl nochmal anmelden.

4) tux.

19.Jan.2017 10:00

\o/

(Aber das Feld "E-Mail-Adresse" sollte vielleicht nicht unbedingt "Benachrichtigung" heißen.)

5) tux.

19.Jan.2017 10:01

Oh:

> Notice: Undefined variable: debug in /customers/e/7/c/musicchris.de/httpd.www/blog/postcomment.php on line 30 Notice: Undefined variable: debug in /customers/e/7/c/musicchris.de/httpd.www/blog/postcomment.php on line 35 Notice: Undefined variable: debug in /customers/e/7/c/musicchris.de/httpd.www/blog/postcomment.php on line 55 Data looks good!
Seems to be the first post

Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /customers/e/7/c/musicchris.de/httpd.www/blog/postcomment.php on line 185 Notice: Undefined offset: 3 in /customers/e/7/c/musicchris.de/httpd.www/blog/postcomment.php on line 227
Detected new subscriber!

Verification mail

(...)
Verification mail was not sent!
Hash entered into database - awaiting verification.

6) chris_blues

19.Jan.2017 10:03

Moin!

Email-Adresse fand ich so undeutlich. Viele Kommentarsysteme erheben ja eine Emailadresse, ohne sie tatsächlich zu benötigen. Da bekommt man oft auch keine Benachrichtigungen. Was wäre denn Dein Vorschlag?
"E-Mail-Adresse"?

Jruß
chris

7) tux.

19.Jan.2017 10:08

"E-Mail-Adresse: (optional, um zu weiteren Kommentaren benachrichtigt zu werden)"

8) tux.

19.Jan.2017 10:08

Ob ich wohl jemals eine Mail erhalten werde? :D

9) tux.

19.Jan.2017 10:10

Was macht eigentlich "zeige themenferne Beiträge" oben rechts? Ein Link ist das nicht.

10) chris_blues

19.Jan.2017 10:14

LOL, ja! Hab ich auch grad gesehen. Hab den ganzen Debug-Kram vergessen abzustellen.

"E-Mail-Adresse: (optional, um zu weiteren Kommentaren benachrichtigt zu werden)"

Leuchtet schon ein. Werd ich mal hochladen.

Du solltest nur eine mail bekommen - für diesen Kommentar hier. Deine eigenen Kommentare werden nicht an dich versandt. An alle anderen schon. Für jeden Kommentar eine mail.

Dieser offtopic-Schalter blendet als Offtopic markierte Kommentare ein und aus. Beispiel: <span class="offtopic">Das hier hat gar nüschts mit dem Thema zu tun und ist auch sonst total überflüssig</span>

11) tux.

19.Jan.2017 10:20

Ah, verstehe. Wäre es nicht irgendwie sinnvoller, wenn daneben ein Häkchen erschiene? So sieht man den aktuellen Status gar nicht. Und wie markiere ich hier was als Off-Topic?

12) tux

19.Jan.2017 10:22

Übrigens stand da "Verification mail was not sent!" und tatsächlich kam bisher keine.

13) chris_blues

19.Jan.2017 10:24

Ein User könnte das irgendwie andeuten, wenn er sich selbst des offtopics bezichtigte. Ansonsten darf nur Onkel Admin echte HTML entities schreiben. Generell wird erstmal alles escaped: z.Bsp. <span clas="offtopic>das hier</span> müßte ich als admin erst noch "aktivieren", so wie ich es mit dem Link oben bei 0815 gemacht habe. den <a>-tag hab ich von Hand dazu gemacht.

14) chris_blues

19.Jan.2017 10:26

Hoppla! Keine verifizierungspost? Was ist denn da schon wieder. Ich dachte, ich hätte alle Fallen gefunden... Mit anderen Worten hast du jetzt auch gar keine Benachrichtigungen bekommen?

15) chris_blues

19.Jan.2017 10:33

Ah, verstehe. Wäre es nicht irgendwie sinnvoller, wenn daneben ein Häkchen erschiene? So sieht man den aktuellen Status gar nicht.

Gute Idee! Mal sehen, wie ich da so'ne Checkbox dazugebastelt bekomme...

16) chris_blues

19.Jan.2017 10:36

So, ich hab mal den Debugscreen wieder dauerhaft geschaltet. Kannst Du mir mal den Inhalt in eine mail posten?

17) tux.

19.Jan.2017 10:39

HTML-Tags wären kacke. Vielleicht [OT]...[/OT]?

18) chris_blues

19.Jan.2017 10:46

Verdampft! Ich find das Problem nicht! Bei mir gehts wunderbar!

Edit: BBtags... hm, warum nicht. Schreib ich mir auf die Liste.

19) chris_blues

19.Jan.2017 11:08

Ich lass den Debug screen erstmal an. Falls Du nochmal testen würdest, schicks mir doch bitte nochmal.

Ich muß mal los... 😞

Großes Dankeschön schonmal!

<span class="notes">Ich hab deine Adresse mal von Hand eingetragen, damit du dir mal so'ne email ansehen kannst.</span>

20) Martin

19.Jan.2017 11:23

Gleich mal testen. E-Mail Benachrichtigungen sind etwas was ich bei isso leider noch vermisse.

21) tux.

19.Jan.2017 11:24

Obwohl: Nicht schön.

> Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /customers/e/7/c/musicchris.de/httpd.www/blog/postcomment.php on line 188 Already registered, or not registered at all...

22) Martin

19.Jan.2017 12:05

Ich erhalte keine Benachrichtigungen, den Errorlog hatte ich dir schon geschickt.

23) chris_blues

19.Jan.2017 13:40

Danke für die zahlreichen Tests!
Onli, deine mail, bzw die Links darin, werd ich mir in Ruhe mal zu Gemüte führen! Jetzt steht erstmal diese dusselige Bestätigungsmail aufm Programm.
Was ich nicht begreife ist, daß es bei mir klappt, und bei euch nicht. Was ist bei euch anders als bei mir?

Edit: ok, hab mich mal mit einer externen Adresse eingetragen und auch keine Bestätigungsmail bekommen. Da scheint der Server komisch zu sein! Interne Adressen werden akzeptiert, externe nicht...

24) chris_blues

19.Jan.2017 14:26

Ich glaub ich habs gefunden! Es lag daran, daß ich ein tatsächliches Emailkonto hier haben muß (for die FROM: Adresse). Intern scheint die Regelung etwas lockerer zu sein, daher ists mir erstmal gar nicht aufgefallen.

Wenn ihr es jetzt nochmal probieren würdet, sollte es gehen - hoffe ich zumindest. 😁

Edit:
@tux: ich hab deine Adresse mal wieder rausgenommen, dein alter Hash ist aber noch drin.

<s>Ansonsten geh ich jetzt mal SQLinjections jagen...</s> Erledigt. Es sollte jede query escaped sein...

25) Tux.

19.Jan.2017 15:35

Ich ignoriere dich!

26) Tux.

19.Jan.2017 15:37

Die PHP-Warnung nervt.

27) chris_blues

19.Jan.2017 15:38

Na super! scheint ja endlich geklappt zu haben! 😎

Mal kieken, was die Warnung schon wieder will...

28) chris_blues

19.Jan.2017 17:39

Warum zum Geier bekomme ich hier keinen vernünftigen vergleich hin??? Ich flipp aus!
<pre><code>$numberSubscriptions = mysqli_num_rows($result);
if ($numberSubscriptions == "" or
strlen($numberSubscriptions) < 1 or
$numberSubscriptions == NULL or
$numberSubscriptions == "0" or
$numberSubscriptions == "0")
{ $numberSubscriptions = 0; }
if ($numberSubscriptions < 1) ...
</code></pre>

29) Tux.

19.Jan.2017 18:00

Unter welchen Umständen sollte mysqli_num_rows denn bitte einen String zurückgeben?

30) chris_blues

19.Jan.2017 18:03

Das ist die pure Verzweiflung! Ich kapier nicht, was ich da für einen eigenartigen Wert zurückbekomme. Der Vergleich:
if ($numberSubscriptions < 1)

schlägt nie fehl, egal wieviele $rows zurückkommen.

31) Tux.

19.Jan.2017 18:04

Leseempfehlung: var_dump

32) chris_blues

19.Jan.2017 18:17

Ok, mysqli_num_rows gibt NULL zurück. Lustigerweise immer! egal wieviele rows tatsächlich anliegen. 😕

33) chris_blues

19.Jan.2017 18:23

Au Backe! Schon wieder so spät! Ich muß los! Der Stand der Dinge ist hier:
https://github.com/chris-blues/cbBlog/blob/master/subscription.php#L96

Danke und bis später!

<span class="notes">Hab übrigens schonmal quick&dirty ein bißchen BBtags eingebaut: , [b], [i], [url][code], [quote] und [ot]. Syntaxüberprüfung fehlt noch...</span>

34) chris_blues

20.Jan.2017 18:28

So! Ich hoffe, ich hab das Problem mit der Verifikation zuverlässig hinbekommen. BBCode wird nun auch teilweise unterstützt.

Hier mal ein paar Tests:
[quote]:
Hab übrigens schonmal quick&dirty ein bißchen BBtags eingebaut: [b], [i], [url][code], [quote] und [ot]. Syntaxüberprüfung fehlt noch...

Die Verschachtelung von den BBtags geht nicht so richtig.... :(

[code]:
if (!filter_var($_GET["email"], FILTER_VALIDATE_EMAIL))
{ $errors = true; $error["email"]["data"] = "Not a valid email address"; }

35) Tux.

20.Jan.2017 18:30

Aufm Android ist das Textfeld jetzt kaum noch PENIS! zu sehen.

36) Tux.

20.Jan.2017 18:30

Tscha, klappt nicht.

37) chris_blues

20.Jan.2017 18:32

Komischerweise hab ich vergessen, den tag ot im parser einzufügen!

Edit:
Bin ja auch doof! Jetz gehts! 😀

38) chris_blues

20.Jan.2017 18:46

Nochn Test:
if (codeSection !contains lineBreaks) { $bb_parser = "Sorry but I'm dead now!"; }

if (codeSection contains lineBreaks)
{ $bb_parser = "Sorry but I'm dead now!"; }

[code]if ($codeBlock != "terminated") { kill("bb_parser"); }

39) chris_blues

20.Jan.2017 19:57

Hm, ich sitze gerade an der regex, um die BBtags zu parsen. Wie man oben sehen kann, werden tags mit Linebreak nicht geparst. Nu hab ich kaum Ahnung von regex! Wo muß ich jetzt \r\n|\r|\n einfügen? 😳

Ausgangslage:
preg_match_all('`[('.$tags.')=?(.*?)](.+?)[/1]`', $string, $matches)

40) Tux.

20.Jan.2017 20:00

Musste nicht, kannst auch Multi-line-Flag am Regex setzen.

41) chris_blues

20.Jan.2017 20:05

Also so hier?
preg_match_all('`[('.$tags.')=?(.*?)](.+?)[/1]`m', $string, $matches)

Edit:
nee, das wars nicht... *weitersuch*

Edit2:
Habs gefunden, nicht m sondern s wird gebraucht:
preg_match_all('`[('.$tags.')=?(.*?)](.+?)[/1]`s', $string, $matches)

42) chris_blues

20.Jan.2017 20:16

Aufm Android ist das Textfeld jetzt kaum noch zu sehen.

Hm, kannste mir da mal einen screenshot zukommen lassen? Im FF bei 330x550 sieht alles ok aus...

Edit:
Hab grad nochmal das CSS durchgecheckt und die Größen maximiert, so daß auf einem Smartphone o.Ä. der Platz maximal genutzt wird.

43) chris_blues

20.Jan.2017 21:17

Test vom Android...
Sieht gut aus! 😉

44) chris_blues

21.Jan.2017 20:53

So, es scheint erstmal alles zu gehen! 😎

Ich hätte jetzt gerne noch, daß man als Admin in den Kommentaren eine Textstelle mit Maus markieren und das per JavaScript als offtopic markieren kann. Leider ist mir dazu noch keine gescheite Idee gekommen. Da fehlt mir vermutlich nur wieder der richtige Suchbegriff... 😷

Falls da jemand eine Idee hat, würde ich mich sehr drüber freuen!

Jruß
chris

45) Julius

22.Jan.2017 02:53

Hallo Chris.

Eine Vorschau-Funktion für die Kommentare wäre ganz nett. Ich persönlich finde BBCode ziemlich umständlich und würde eher auf Markdown setzen (für PHP gibt es Parsedown und Parsedown Extra), aber das ist ja Ansichtssache :-)

Des weiteren wäre da noch die Benutzbarkeit:

1. Der Link „Tags“ oberhalb der Textarea ist Verweis, sondern löst eine Aktion aus, also lieber einen Button verwenden
2. „Tags“ kann alles heißen, ich würde „Hinweise für Formatierung“ o. ä. benutzen
3. HTML-Code zu löschen (steht so im Mouse-Over), ist keine gute Idee, lieber escapen. Test: <ironie> <img src="blabla.jpg" alt="">
4. Der Text „Smileys“ unterhalb der Textarea ist anklickbar, also sollte auch das ein Button sein
5. Warum werden die Smileys als Entity eingefügt? Mal testen, was aus ' (& a p o s ;) wird. Eine Sicherheitslücke ist das nicht unbedingt, aber für den Nutzer ungewohnt, weil er BBCode und kein HTML schreibt.
6. Die Smileys werden nicht an der Position des Cursors eingegeben.
7. Warum bietest du das Umschalten der Sprache an, wenn dann der Inhalt doch Deutsch bleibt?

Ein paar Experimente:
XSS-Test: http://javascript:alert('Test!') XSS

BBCode in Code-Blöcken?

<?php
echo "fetter Text";
?>


Gruß
Julius

46) Julius

22.Jan.2017 03:07

Noch ein paar andere Sachen:

1. Du scheinst Kommentare erst zu moderieren, das bekommt der Nutzer aber nicht mitgeteilt.
2. Die Felder „E-Mail-Adresse“ und „Website“ könntest du statt als „text“ als „email“ und „url“ auszeichnen, das hat diverse Vorteile (Syntax-Überprüfung in einigen Browsern, virtuelle Tastaturen mit den benötigten Zeichen (@ bei E-Mail und / bei URL), Vorschläge früherer Eingaben), aber keine Nachteile
3. Viele Nutzer haben bei Gravatar einen Avatar hinterlegt, die könntest du abrufen, das ganze könnte auch optional gemacht werden (Datenschutz auf Seite des Kommentators) und mittels eines Proxys (du lieferst die Avatare über deinen Server aus) schützt du auch die Besucher deiner Seite vor Tracking – oder es gibt einfach gar keine (Gr)Avatare :-)
4. Das Kommentar-Feld merkt sich nicht vorherige Eingaben nicht, das ließe sich mit LocalStorage oder – eher suboptimal – mit Cookies lösen (Daten werden dauernd unnötig bei jedem Request mitgesendet), dann muss man beim wiederholten Kommentieren nicht dauernd alles neu eingeben

47) chris_blues

22.Jan.2017 03:12

Hallo Julius!

Interessante Punkte! Ich versuch mal, der Reihe nach durchzugehen. 😀

0.1. Eine Vorschaufunktion? Joa, klingt vernünftig, werd ich mal drüber schlafen.
0.2. Markdown wäre sicher einfacher zu parsen, nur hab ich mich noch damit weiter beschäftigt. <span class="notes">Edit: Markdown sieht schon irgendwie ziemlich simpel aus, vor allem braucht man nicht auf auf die End-Tags achten. Allerdings hätte ich jetzt keine große Lust mir diese komische Syntax drauf zu drücken... Aber ich kann ja mal kucken, ob man nicht beides parsen kann, also BBCode und Markdown...</span>
1. und 4. Jo, das ist schnell gemacht, werd ich morgen mal beigehen!
2. Gute Idee! Werd ich genau so machen!
3. haste sicher selbst gesehen; der Hinweis ist noch ein Überbleibsel aus vorherigen Versionen. <span class="notes">entfernt</span>
5. Da hatte ich bisher noch keine bessere Idee. Find ich auch schade, die Smileys als Entities einzufügen, aber sonst werden sie wegescaped. Test: <span class="notes">Wenn jemand dazu ein Idee hat; immer her damit!!!</span>

48) chris_blues

22.Jan.2017 03:17

Ok, zweite Runde! 😀

1. Nein, das ist das Caching; [Ctrl]+[Shift]+[r] sollte das beheben. Ich habs mal deaktiviert. Muß ich auch nochmal Zeit investieren...
2. Gute Idee, hab ich noch gar nicht dran gedacht...
3. Naja, jetzt eine Funktion einbauen, wo ich erstmal andere Funktionen übergehen muß... Ich weiß nicht. Ich finde das ganze kommt auch ganz gut ohne Gravatare aus... [abgewählt] 😀
4. Local Storage; muß ich mir mal ankucken. Hab ich mich auch schon drüber geärgert! <span class="notes">LocalStorage ist jetzt aktiv!</span>

49) chris_blues

22.Jan.2017 03:21

Ich sehe, daß du deine Benachrichtigungen noch nicht bekommst. Ist die Email angekommen? Oder funzt da schon wieder was nicht?

50) chris_blues

22.Jan.2017 16:55

Test: &#128564; => 😴 =>

Edit:
ok, das Caching ist wieder so, wie es sein soll, und Smileys werden nach wie vor weg escaped, bzw wird, mit den richtigen Einstellungen, der query mit leerem Kommentar ausgeführt... 😟

Bonus: ein paar neue BB-Tags: [u] und [s]

Offene Punkte:
* Vorschaufunktion
* XSS muß wech! [url=javascript:alert('Hallo Welt');]musicchris.de[/url] => musicchris.de
oder besser noch: [url=https://musicchris.de onload="javascript:alert('Hallo Welt');]musicchris.de[/url] => musicchris.de
Aah! Das zweite Beispiel geht nicht! Guter Parser! 😀
* Smileys an der Cursorposition einfügen, möglichst nicht als HTML-entities!

51) Julius

22.Jan.2017 18:09

Jetzt habe ich es: Ich habe diesen Smiley 😃 nicht als Entity kodiert, da kriegt er wohl einen Schluckauf...

Also noch einmal (die vorherigen Versuche kannst du gerne löschen):

47.0.2. Einfach zu parsen als BBCode ist Markdown nicht unbedingt (dafür gibt es je fertige Parser), aber dafür ist es teilweise intuitiver und kompakter zu schreiben:

Listen (würden in entsprechendes HTML umgewandelt):

- erster Punkt
- zweiter

1. Sortierte Liste
2. zweiter Punkt

(verschachtelte) Zitate mit Antworten:

> > Blaba
> Bla?
Blub!
> nix

würde zu:
[quote]
[quote]
Blabla
[/quote]
Bla?
[/quote]
Blub!
[quote]
nix
[/quote]

47.3 Ja, aber mit Vorschau sogar ohne Absenden
47.5 In deinem Code auf Github sehe ich aber irgendwie keinen Grund dafür. Es sollte aber möglich sein, ein Smiley ist ein Unicode-Zeichen wie jedes andere...
Allgemein würde ich die Kontextwechsel anders durchführen (an einer Stelle und nicht quer über den Code verteilt):
postcomment.php:Z.153-155: Die Ersetzungen dort machen nicht unbedingt Sinn, eventuell bis auf das Vereinheitlichen der Zeilenumbrüche. Ich würde den Kommentartext wie er ist in die Datenbank einfügen, dank mysqli_real_escape_string (Text→Datenbank) ist das auch sicher und erst bei der Ausgabe an den Kontext (HTML) anpassen (htmlspecialchars→nl2br→BBCode parsen; blog.php:Z.259ff)
48.1 Mh, vielleicht die Ablaufzeit des Cache irgendwie kürzer ansetzen? Beim Client-Cache fragt der Client vor Ablauf der Zeit ja auch nicht nach, ob sich was geändert hat.
48.3 Klar, ich wollte nur die Möglichkeit aufzeigen :-)
48.4 Funktioniert aber nicht, wenn der Nutzer die Seite (ohne die Parameter) später wieder öffnet, oder er einen anderen Beitrag kommentiert. Außerdem würde ich solche Sachen nicht per GET übertragen werden, siehe Web of Trust, weil jemand die URL – ohne sie genauer anzusehen – weitergeben könnte oder irgendso ein Tracking-Addon im Browser sitzt und das ausplaudert... Haste ja erledigt, wie ich sehe.

49 Nee, ich habe nichts bekommen...

Wegen XSS: Bei dir funktioniert das nicht, weil der Content-Security-Policy-Header greift, trotzdem sollte das gefiltert werden – übrigens würde auch JaVaSCRiPt:alert('Test!') funktionieren.

Ein weiterer hinzufügenswerter BBCode wäre „tt“, um inline-Codeblöcke einfügen zu können. Z. B. [tt]javascript:alert('Blablubb')[/tt] → <code>javascript:alert('Blablubb')</code>

52) chris_blues

22.Jan.2017 18:15

Möchte mal wissen, was da passiert ist 😲
Ich werd mal beigehen und deine Tags gerade rücken. Moment...

BTW:
Blabla
Bla?
Test

Hübsch!!! 😲

53) chris_blues

22.Jan.2017 18:18

Test
Ich hab vergessen, einen mißglückten Versuch des blöden Escapings wieder rückgängig zu machen! Tztztz...

54) chris_blues

22.Jan.2017 19:05

Ich hab mal ein logging eingeführt, für alle gescheiterten mails. Kannste mal bitte nochmal probieren, ob ich vielleicht rauskriegen kann, warum da nix bei dir ankommt?

Edit:
Also ich bekomme jedes mal, solange ich nicht verifiziert bin, eine mail. Aber jedes Scheitern wird jetzt aufgezeichnet. Ich hoffe, so komm ich hinter das Problem...

55) chris_blues

22.Jan.2017 19:31

47.3 Ja, aber mit Vorschau sogar ohne Absenden

Oha, dann muß ich ja das ganze Geparse in JS nochmal bauen... Mit Absenden bräuchte ich nur nach der Parserei trennen, ob es gespeichert, oder nur geparst durchgereicht werden soll, wäre deutlich einfacher!

5. Da hatte ich bisher noch keine bessere Idee. Find ich auch schade, die Smileys als Entities einzufügen, aber sonst werden sie wegescaped. Test: Wenn jemand dazu ein Idee hat; immer her damit!!!

47.5 In deinem Code auf Github sehe ich aber irgendwie keinen Grund dafür. Es sollte aber möglich sein, ein Smiley ist ein Unicode-Zeichen wie jedes andere...
Allgemein würde ich die Kontextwechsel anders durchführen (an einer Stelle und nicht quer über den Code verteilt):
postcomment.php:Z.153-155: Die Ersetzungen dort machen nicht unbedingt Sinn, eventuell bis auf das Vereinheitlichen der Zeilenumbrüche. Ich würde den Kommentartext wie er ist in die Datenbank einfügen, dank mysqli_real_escape_string (Text→Datenbank) ist das auch sicher und erst bei der Ausgabe an den Kontext (HTML) anpassen (htmlspecialchars→nl2br→BBCode parsen: blog.php:Z.259ff)

Das werd ich heute mal noch ausprobieren! Klingt zu einfach um wahr zu sein! 😈

48.1 Mh, vielleicht die Ablaufzeit des Cache irgendwie kürzer ansetzen? Beim Client-Cache fragt der Client vor Ablauf der Zeit ja auch nicht nach, ob sich was geändert hat.

Na ich hab den CacheControl jetzt erstmal auf 0sec gesetzt gehabt. Ich probier grad mal, ob er jetzt die Expires respektiert...

Wegen XSS: Bei dir funktioniert das nicht, weil der Content-Security-Policy-Header greift, trotzdem sollte das gefiltert werden – übrigens würde auch JaVaSCRiPt:alert('Test!') funktionieren.

Jenau! Da muß ich mir noch irgendwas überlegen, wie ich das kaputtkriege...

Na ma sehn...

56) Julius

22.Jan.2017 20:32

Oha, dann muß ich ja das ganze Geparse in JS nochmal bauen... Mit Absenden bräuchte ich nur nach der Parserei trennen, ob es gespeichert, oder nur geparst durchgereicht werden soll, wäre deutlich einfacher!


Du könntest ja auch einfach einen zweiten Button einführen z. B. <button name="vorschau" value="1">Vorschau</button> und den dann im Falle des Drückens dieses Buttons beim Verarbeiten des Kommentars einfach nicht in die Datenbank eintragen, sondern anzeigen (und den Text in die Textarea packen), sondern anzeigen.

Klar kann man das auch per JavaScript machen, aber selbst meine Lieblingsforen-Software CForum (wird bei SELFHMTL eingesetzt), schickt den Text an den Server und schickt dann das HTML an den Browser (Kannste ja mal ausprobieren (aber nicht aus Versehen auf „Absenden“ drücken ;-) )) – der JS-Parser könnte sich ja anders als der auf dem Server verhalten und dann kann man die Vorschau-Funktion auch gleich weg lassen...

57) chris_blues

22.Jan.2017 23:08

Na mal sehen, wie dieses Experiment jetzt ausgeht...

Edit:
Ist schon komisch! Die Vorschaufunktion geht jetzt besser, als der INSERT... Der INSERT bricht immer dann ab, wenn z.Bsp. ein "echter" Smiley auftaucht. Lustigerweise bricht aber nicht der Query ab, sondern nur der String...

58) chris_blues

22.Jan.2017 23:23

Kann mir da jemand weiterhelfen? Mir brummt der Schädel... 😟

So siehts jetzt beispielhaft in der blog.php aus:
$previewText = htmlspecialchars(stripcslashes($_POST["text"]), ENT_QUOTES | ENT_HTML5, "UTF-8", false);
...
echo bb_parse(nl2br($previewText, false));


und so in der postcomment.php:
$search = array("\r\n", "\r");
$replace = array("\n", "\n");
$text = str_replace($search, $replace, $_POST["text"]);
...
$querytext = mysqli_real_escape_string($concom, $text);
...
echo htmlspecialchars($querytext, ENT_QUOTES | ENT_HTML5, "UTF-8");


Was hier passiert, ist, daß die Smileys in der Vorschau zu "echten" Unicode-chars werden - auch in der <textarea />. Wenn ich das jetzt posten wöllte, dann geht alles nach diesem Unicode-char flöten...
Auch gehen immer die Backslashes in z.Bsp. "\r\n" übern Jordan. Wenn ich dieses stripcslashes() aber weglasse, dann erscheinen die Linebreaks als Text, so wie hier: \n und brechen auch nicht mehr die Zeile um.

59) chris_blues

23.Jan.2017 16:26

Ha!

Das Problem war die Collation! Das stand die ganze Zeit auf utf8_bin und hätte, um Emojis händeln zu können auf utf8mb4_bin stehen müssen! Wie es aussieht enthält die Collation "utf8_bin" irreführenderweise nur einen kleinen Satz an Unicode Charakteren. ?

Deshalb hat sich die Datenbank immer verschluckt, sobald so'n Ding aufgetaucht ist.

So weit so gut! Zeit sich ranzumachen, daß die Smileys
a) als tatsächliche Smileys und
b) an der richtigen Stelle eingefügt werden.
und
c) XSS unterbinden

60) chris_blues

23.Jan.2017 16:45

Test: ?
XSS
<?php echo "Hallo Welt!n"; ?>
<input type="text" name="experiment" value=" DROP TABLE `blog-comments` ; ">

😈

61) chris_blues

23.Jan.2017 17:24

So, ich hab mal eine .htaccess mit in die Wurzel des Blogs gelegt mit:
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; connect-src 'self'; font-src 'self'; media-src 'self';"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Bin nur nicht so sicher, ob das in einem Unterverzeichnis überhaupt angenommen wird...

Nochn XSS Test:
XSS!

62) chris_blues

23.Jan.2017 17:59

<i>Test</i>
Test

<?php echo $lang; ?>


[url=https://musicchris.de" onload="javascript:alert('Hallo Welt!');]XSS![/url] => XSS! =>
<a href="##">XSS!</a>

63) chris_blues

24.Jan.2017 13:44

Test
<b>Test</b>
<?php echo "Hallo Welt!"; ?>

[url=https://musicchris.de" onclick="alert('Hallo Welt!')]XSS[/url]
=> XSS
=>
<a href="https://musicchris.de&quot; onclick=&quot;alert(&apos;Hallo Welt!&apos;)">XSS</a>

😏 => ?

post a comment








😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟😠😡😢😣😤😥😦😧😨😩😪😫😬😭😮😯😰😱😲😳😴😵😶😷🙁🙂🙃🙄🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🤐🤑🤒🤓🤔🤕🤖🤗🤘🤠🤡🤢🤣🤤🤥🤦🤧👍𝄞🌍🌹🍻🍾

privacy declaration

Your IP-address, useragent-string etc are not stored by this blog-software. Still, it is possible that the hoster of this website may store data like this. But that is beyond the scope of this blog-software. Check out this website's privacy declaration to find out more about that!

This blog-software generally doesn't store any information about you. Only if you post a comment, some data will have to be stored. You don't have to input any personal information here. Except for the comment itself, all fields are optional!
If you don't want to tells us your name, that's fine. It will be shown as 'anonymous'.
If you want to receive notifications on following comments, naturally you'll have to give us your email address. It will be stored and not be shared with anybody. If you don't want to be notified, just leave the notifications field empty.
If you want your name to be linked to your website, you'll have to give us your site's address. Otherwise leave this field empty.

This data will be stored in case you decide to post a comment here:

  • time and date of your post
  • your name (if supplied)
  • your email (if supplied)
  • your website (if supplied)
  • your comment
  • some technical information unrelated to you, like which blogpost this comment belongs to and a unique id for this comment