Zum Inhalt springen

Captcha für mm_forum User Registration möglich?

Erstellt am 26. Januar 2008 · 5 Antworten · letzte Antwort am 2. Februar 2008

Tags: Frontend-Benutzer, Sicherheit, Frage

latschma ·

Ist jemandem eine Lösung bekannt um Captcha in die User Registration des MM_Forums einzubauen?

Mit dem MM-Forum ist es jetzt wunderbar still mit den Forum Spammern. Allerdings tragen sich deren Registration-Bots ununterbrochen als neue User ein. Da möchte ich noch gerne Captcha eingebaut haben bevor ein neuer User die Registrierung abschicken kann.

Grüße

m.​helmich ·

Hallo,

in der aktuell im Repository verfügbaren Version ist bereits Captcha-Unterstützung eingebaut. Zwar funktioniert der SVN-Download zur Zeit nicht, dies wird jedoch in nächster Zeit behoben.

Martin

JimmyBlue ·

Hallo latschma!

Ich habe bei meiner Installation des grandiosen mm_forums Captcha erfolgreich eingebunden, läuft alles. Habe allerdings in der letzten Version - also glaube 0.1.2 - installiert und dann nochmal upgegradet. Vielleicht gehts jetzt einfacher...

Also: Änderungen in class.tx_mmforum_pi2.php durchführen:

1. function validate($marker) sieht bei mir so aus:

function validate($marker)
	{
		$marker["fehler"] = 0;

		$this->data['username'] = trim($this->data['username']);
		$this->data['password'] = trim($this->data['password']);

		if(is_array($this->data)){
			while(list($k,$v)=each($this->data)) {
				if($k !="username" AND $k !="password"){
					$this->data[$k] = htmlspecialchars($v);
				}
			}
		}


		$marker["###VALUE_username###"]			= $this->data['username'];
		$marker["###VALUE_password###"]			= "";
		$marker["###VALUE_password_again###"]	= "";
		$marker["###VALUE_name###"]				= $this->data['name'];
		$marker["###VALUE_beruf###"]			= $this->data['beruf'];
		$marker["###VALUE_address###"]			= $this->data['address'];
		$marker["###VALUE_interessen###"]		= $this->data['interessen'];
		$marker["###VALUE_www###"]				= $this->data['www'];
		$marker["###VALUE_email###"]			= $this->data['email'];
		$marker["###VALUE_msn###"]				= $this->data['msn'];
		$marker["###VALUE_yim###"]				= $this->data['yim'];
		$marker["###VALUE_aim###"]				= $this->data['aim'];
		$marker["###VALUE_icq###"]				= $this->data['icq'];
        $marker["###VALUE_skype###"]			= $this->data['skype'];  

		/*
		 * Check username
		 * A username must be at least 3 characters long and has a maximum length of 30 chars.
		 * There must be no invalid chars.
		 */
		if ((strlen($this->data['username']) < $this->conf['username_minLength']) || (strlen($this->data['username']) > $this->conf['username_maxLength'])) {
			$marker["###ERROR_username###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.usernameLength');
			$marker["fehler"] = 1;
		}
        if (preg_match_all("/[^".preg_quote($this->conf['username_allowed'])."]/i",$this->data['username'],$matches)) {
			$matches[0] = array_unique($matches[0]);
            $marker["###ERROR_username###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.usernameChars').' ('.implode(', ',$matches[0]).')';
			$marker["fehler"] = 1;
			$marker["###VALUE_username###"] = str_replace('"','&quot;',$marker['###VALUE_username###']);
		}

		// Checks if username already exists in database
		if (!$marker["fehler"]) {
			$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
				'*',
				'fe_users',
				'username LIKE "'.$this->data['username'].'" AND deleted=0 AND pid='.$this->conf['userPID']
			);
			if ($GLOBALS['TYPO3_DB']->sql_num_rows($res)) {
				$marker["###ERROR_username###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.usernameExists');
				$marker["fehler"] = 1;
			}
		}

		// Validate email address
		if (!tx_mmforum_pi2::validate_email($this->data["email"])) {
			$marker["###ERROR_email###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.emailInvalid');
			$marker["fehler"] = 1;
		}
		// Check if email address already exists in database
		else
		{
			$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
				'email',
				'fe_users',
				'email="'.$this->data['email'].'" AND deleted=0'
			);
			IF ($GLOBALS['TYPO3_DB']->sql_num_rows($res) >= 1) {
				$marker["###ERROR_email###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.emailExists');
				$marker["fehler"] = 1;
			}
		}

		// Check password
		if ($this->data["password"] != $this->data["password_again"]) {
			$marker["###ERROR_password###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.passwordMismatch');
			$marker["fehler"] = 1;
		}

		if (strlen($this->data['password'])<6) {
			$marker["###ERROR_password###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.passwordLength');
			$marker["fehler"] = 1;
		}

		if (strlen($this->data['name'])<1) {
			$marker["###ERROR_name###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.nameNone');
			$marker["fehler"] = 1;
		}
        
        // CAPTCHA-Abfrage
        if (t3lib_extMgm::isLoaded('captcha'))  {
                                session_start();
                                $captchaStr = $_SESSION['tx_captcha_string'];
                                $_SESSION['tx_captcha_string'] = '';
                        } else {
                                $captchaStr = -1;
                        }
                       
                        if($this->data['captchaResponse'] != $captchaStr) {
                                $marker["###ERROR_captcha###"] = '<br>&nbsp;&nbsp;&nbsp;'.$this->pi_getLL('error.captcha');
                       			$marker["fehler"] = 1;
                        } else {
                                $valid_captcha = true;
                        }               
                   

		return $marker;
	}

2. function makeMarker() muss ebenfalls geändert werden und sieht nachher so aus:

function makeMarker()
	{
		$marker = array();

		$marker["###ERROR_username###"]			= "";
		$marker["###ERROR_password###"]			= "";
		$marker["###ERROR_name###"]				= "";
		$marker["###ERROR_email###"]			= "";
		$marker["###HIDDENFIELDS###"]			= "";
		
        
		$marker["###ERROR_captcha###"]			= "";
	

		$marker["###VALUE_username###"]			= $this->data['username'];
		$marker["###VALUE_password###"]			= $this->data['password'];
		$marker["###VALUE_password_again###"]	= $this->data['password_again'];
		$marker["###VALUE_name###"]				= $this->data['name'];
		$marker["###VALUE_beruf###"]			= $this->data['beruf'];
		$marker["###VALUE_address###"]			= $this->data['address'];
		$marker["###VALUE_interessen###"]		= $this->data['interessen'];
		$marker["###VALUE_www###"]				= $this->data['www'];
		$marker["###VALUE_email###"]			= $this->data['email'];
		$marker["###VALUE_msn###"]				= $this->data['msn'];
		$marker["###VALUE_yim###"]				= $this->data['yim'];
		$marker["###VALUE_aim###"]				= $this->data['aim'];
		$marker["###VALUE_icq###"]				= $this->data['icq'];
        $marker["###VALUE_skype###"]			= $this->data['skype']; 


        if (t3lib_extMgm::isLoaded('captcha')){
        $marker["###CAPTCHA###"] 				= $captchaHTMLoutput = '<img src="'.t3lib_extMgm::siteRelPath('captcha').'captcha/captcha.php" alt="" />';
             } else {
        $marker["###CAPTCHA###"]				= '';
            }

		return $marker;
	}

3. und das muss dann natürlich noch ins Template der User-Reg:

<p>###CAPTCHA###<br /><br />
       <input type="text" name="tx_mmforum_pi2[reg][captchaResponse]" value=""> <span class="error">###ERROR_captcha###</span></p>

Ich hoffe das hilft Dir weiter

LG
Christian

latschma ·

Funktionierte sofort beim Einbau in den Code vom mm_forum Version 0.1.4 . Die Extension Captcha hatte ich bereits hochgeladen.

In die Template /typo3conf/ext/mm_forum/res/tmpl/default/fe_user_reg/fe_user_registrierung.html
habe ich den von Dir angegebenen Code vor der Zeile
<p>###HIDDENFIELDS###
eingegeben.
Habe den Code folgendermassen mit "label" eingegeben, damit Captcha mit Eingebefeld im selben Format wie die darüberliegenden Felder sind:

<p><label for="captcha">###CAPTCHA###</label>
             <input type="text" name="tx_mmforum_pi2[reg][captchaResponse]" value="" /> <span class="error">###ERROR_captcha###</span></p>

Vielen Dank!

Nachtrag:
Jetzt ist Ruhe mit den Log-in Spammern.