Blog
tags: news software deutsch opensource cbBlog
Permalink: https://musicchris.de/blog?id=73&langopt=english
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
2) 0815
18.Jan.2017 21:34
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
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
(Aber das Feld "E-Mail-Adresse" sollte vielleicht nicht unbedingt "Benachrichtigung" heißen.)
5) tux.
19.Jan.2017 10:01
> 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
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
8) tux.
19.Jan.2017 10:08
9) tux.
19.Jan.2017 10:10
10) chris_blues
19.Jan.2017 10:14
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
12) tux
19.Jan.2017 10:22
13) chris_blues
19.Jan.2017 10:24
14) chris_blues
19.Jan.2017 10:26
15) chris_blues
19.Jan.2017 10:33
Gute Idee! Mal sehen, wie ich da so'ne Checkbox dazugebastelt bekomme...
16) chris_blues
19.Jan.2017 10:36
17) tux.
19.Jan.2017 10:39
18) chris_blues
19.Jan.2017 10:46
Edit: BBtags... hm, warum nicht. Schreib ich mir auf die Liste.
19) chris_blues
19.Jan.2017 11:08
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
21) tux.
19.Jan.2017 11:24
> 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
23) chris_blues
19.Jan.2017 13:40
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
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
26) Tux.
19.Jan.2017 15:37
27) chris_blues
19.Jan.2017 15:38
Mal kieken, was die Warnung schon wieder will...
28) chris_blues
19.Jan.2017 17:39
<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
30) chris_blues
19.Jan.2017 18:03
schlägt nie fehl, egal wieviele $rows zurückkommen.
31) Tux.
19.Jan.2017 18:04
32) chris_blues
19.Jan.2017 18:17
33) chris_blues
19.Jan.2017 18:23
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
Hier mal ein paar Tests:
[quote]:
Die Verschachtelung von den BBtags geht nicht so richtig.... :(
[code]:
35) Tux.
20.Jan.2017 18:30
36) Tux.
20.Jan.2017 18:30
37) chris_blues
20.Jan.2017 18:32
Edit:
Bin ja auch doof! Jetz gehts! 😀
38) chris_blues
20.Jan.2017 18:46
[code]if ($codeBlock != "terminated") { kill("bb_parser"); }
39) chris_blues
20.Jan.2017 19:57
Ausgangslage:
40) Tux.
20.Jan.2017 20:00
41) chris_blues
20.Jan.2017 20:05
Edit:
nee, das wars nicht... *weitersuch*
Edit2:
Habs gefunden, nicht m sondern s wird gebraucht:
42) chris_blues
20.Jan.2017 20:16
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
Sieht gut aus! 😉
44) chris_blues
21.Jan.2017 20:53
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
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?
Gruß
Julius
46) Julius
22.Jan.2017 03:07
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
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
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
50) chris_blues
22.Jan.2017 16:55
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
neueBB-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
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
Ich werd mal beigehen und deine Tags gerade rücken. Moment...
BTW:
Hübsch!!! 😲
53) chris_blues
22.Jan.2017 18:18
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
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
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!
Das werd ich heute mal noch ausprobieren! Klingt zu einfach um wahr zu sein! 😈
Na ich hab den CacheControl jetzt erstmal auf 0sec gesetzt gehabt. Ich probier grad mal, ob er jetzt die Expires respektiert...
Jenau! Da muß ich mir noch irgendwas überlegen, wie ich das kaputtkriege...
Na ma sehn...
56) Julius
22.Jan.2017 20:32
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
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
So siehts jetzt beispielhaft in der blog.php aus:
und so in der postcomment.php:
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 diesesstripcslashes()
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
Das Problem war die Collation! Das stand die ganze Zeit auf
utf8_bin
und hätte, um Emojis händeln zu können aufutf8mb4_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
😈
61) chris_blues
23.Jan.2017 17:24
.htaccess
mit in die Wurzel des Blogs gelegt mit: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
Test
[url=https://musicchris.de" onload="javascript:alert('Hallo Welt!');]XSS![/url]
=> XSS! =>63) chris_blues
24.Jan.2017 13:44
<b>Test</b>
[url=https://musicchris.de" onclick="alert('Hallo Welt!')]XSS[/url]
=> XSS
=>
😏 => ?
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: