Ich habe ja für meine Projekte einen Bugtracker, der mit MantisBT läuft. Den benutze ich vor allem als Notizzettel für Featureideen (aber ich freue mich auch über Bugreports). Damit dort jeder einen Fehler melden kann, habe ich den anonymen Zugriff aktiviert. Dummerweise hat das wohl ein Spambot mitgekriegt und hat im 30min Takt immer längere Kommentare hinterlassen. Nachdem ich das dann (am nächsten Morgen) auf meinem iPod gesehen hatte (WAS? 20 Emails???) habe ich erst mal die anonymen Kommentare deaktiviert, doch auf längere Sich musste eine andere Lösung her: Capchas.
Leider hat Mantis das ganze nicht eingebaut, so dass ich selber aktiv werden musste. Natürlich hat auch Mantis einen Bugtracker, und dort hat auch schon jemand einen Featurewunsch geäußert. Jemand anderes hat dann festgestellt, das Mantis doch schon Captchas unterstützt: Wenn man einen neues Account erstellt muss man Buchstaben erraten.
Genug der Vorrede: Wie baut man nun Captchas für Kommentare und Bugreports ein?
Kurze Antwort: Man wendet den Patch an, den ich zu dem Featurewunsch gepostet habe.
Lange Antwort: Es müssen 4 Dateien geändert werden: In zwei muss die Eingabemaske eingefügt werden, in die anderen zwei die Validierungslogik. Wie fangen mit der Datei „bug_report.php“ an. (Alle Dateien finden sich im direkt im Mantis-Ordner) Hier wird nach Zeile 80 der folgende Code eingefügt:
// begin stone captcha check for anon user if (current_user_is_anonymous()) { $f_captcha = gpc_get_string( 'captcha', '' ); $f_public_key = gpc_get_int( 'public_key', '' ); $f_captcha = strtolower( trim( $f_captcha ) ); $t_key = strtolower( substr( md5( config_get( 'password_confirm_hash_magic_string' ) . $f_public_key ), 1, 5) ); if ( $t_key != $f_captcha ) { trigger_error( ERROR_SIGNUP_NOT_MATCHING_CAPTCHA, ERROR ); } } // end of stone captcha check for anon user
Noch mal zur Kontrolle: Der Code muss an die Stelle des Kommentars (nur falls sich die Datei in einer neuen Version mal ändert…)
if ( access_has_project_level( config_get( 'roadmap_update_threshold' ), $t_bug_data->project_id ) ) { $t_bug_data->target_version = gpc_get_string( 'target_version', '' ); } //Hier kommt der Code hin # if a profile was selected then let's use that information if ( 0 != $t_bug_data->profile_id ) { if ( profile_is_global( $t_bug_data->profile_id ) ) {
Weiter geht es mit der Datei „bugnote_add.php“. Hier kommt der gleich Code in die Zeile 40:
$f_time_tracking = gpc_get_string( 'time_tracking', '0:00' ); $f_bugnote_text = trim( gpc_get_string( 'bugnote_text', '' ) ); //Und auch hier kommt der Code hin $t_bug = bug_get( $f_bug_id, true ); if( $t_bug->project_id != helper_get_current_project() ) {
Jetzt fehlt nur noch folgender Code, der das Eingabefeld ausgibt:
<?php //begin stone's captcha for anon login if (current_user_is_anonymous()) { ?> <tr class="row-1"> <td class="category"> <span class="required"> * </span><?php echo lang_get( 'signup_captcha_request' ) ?>: </td> <td> <?php print_captcha_input( 'captcha', '' ) $t_key = mt_rand( 0,99999 ); ?> <img src="make_captcha_img.php?public_key=<?php echo $t_key ?>"> <input type="hidden" name="public_key" value="<?php echo $t_key ?>"> </td> </tr> <?php } //end of stone's captcha for anon login?>
Der kommt in der Datei „bug_report_page.php“ in die Zeile 515:
<label><input <?php echo helper_get_tab_index() ?> type="checkbox" id="report_stay" name="report_stay" <?php check_checked( $f_report_stay ) ?> /> <?php echo lang_get( 'check_report_more_bugs' ) ?></label> </td> </tr> //Auch hier kommt Code hin <tr> <td class="left"> <span class="required"> * <?php echo lang_get( 'required' ) ?></span>
Und zu guter Letzt kommt das ganze auch noch mal in der „bugnote_add_inc.php“ in die Zeile 74:
</tr> <?php } ?> //... (ich muss nichts mehr schreiben, oder?) <?php if ( config_get('time_tracking_enabled') ) { ?> <?php if ( access_has_bug_level( config_get( 'time_tracking_edit_threshold' ), $f_bug_id ) ) { ?>
Wichtig: Unbedingt hinter <?php } ?> einfügen!
Jetzt sollten die anonymen Benutzer erst das Captcha lösen müssen, bevor sie Bugs melden oder Kommentare abgeben können. Seit dieser Änderung habe ich keinen Spam mehr. Wer möchte, das diese Patch in die nächste Mantisversion kommt kann sich gerne im Bugtracker dafür aussprechen (oder das Feature sponsern) 😉
Man sollte mal einen Patch in Form einer php-Datei dafür schreiben. Du weißt schon, so einen Installer den man mit dem Browser ausführt und der dann die Files ändert. Müsste ja machbar sein.
Würd ich ja machen, ich hab nur leider keinen blassen Schimmer von php 😉
Hui, du hast Ideen 😉
Findest du das anwenden einer Diffdatei zu aufwendig?
Per php ist das ziemlich einfach:
shell_exec(‚patch datei.php < Datei.diff); Blöd nur, das kein Hoster das aufrufen von Shellbefehlen erlaubt...