Bad-Liste für Usernamen

radarin

Angesehenes Mitglied
Hallo Liste

Ich möchte bei der Registration von Usern verhindern, dass deren Namen unerwünschte Zeichenfolgen wie z.B. 'sex' enthalten. Dafür habe ich die Tabelle 'nouser' mit der Spalte 'name', welche die verbotenen Wörter enthällt. Nun möchte ich aber nicht einen direkten Vergleich

CODE SELECT * FROM nouser WHERE name = '$_POST[user]'


machen, da diese Variante nur einen Treffer findet, wenn die Inhalte in DB unf Formular identisch sind. Ich möchte grundsätzlich keine User deren Namen 'sex' beinhaltet. Somit sollen auch Registrationsversuche mit 'sexy', 'sexbombe' oder 'supersex' abgefangen werden. Das müsste mit LIKE und %% zu schaffen sein, aber ich krieg da die korrekte Syntax nicht hin. Hab das bis jetzt erst umgekehrt angewendet,


CODE WHERE beschreibung LIKE '%$_POST[suchwort]%'


um Bruchstücke in der DB zu finden. Kann mir hier wer weiterhelfen?
 
QUOTE (radarin @ Di 20.9.2005, 17:34)Hallo Liste

Ich möchte bei der Registration von Usern verhindern, dass deren Namen unerwünschte Zeichenfolgen wie z.B. 'sex' enthalten.
[...]
Ich möchte grundsätzlich keine User deren Namen 'sex' beinhaltet. Somit sollen auch Registrationsversuche mit 'sexy', 'sexbombe' oder 'supersex' abgefangen werden. Das müsste mit LIKE und %% zu schaffen sein, [...]

Das musst Du eigentlich genau umgekehrt machen. Du musst die Verbotenen aus der Datenbank holen und dann mit einen Regulären Ausdruck diese prüfen. Vielleicht gibt es auch einen anderen Weg, nur ich benutze diese Art:


CODE $allow_username = true;
$result = mysql_query('select * from nouser order by name asc');
while( $data = mysql_fetch_assoc($result) ) {
  if( preg_match('/^.*' . preg_quote($data['name'], '/') . '.*$/i', $_POST['user']) ){
     $allow_username = false;
  }
}

if( !$allow_username ) {
  exit('Dieser Benutzername ist nicht erlaubt!');
}




MfG Sascha Ahlers
 
Danke für Deine Vorlage. 2 kleine Fehler musste ich noch korrigieren. Die einfachen Hochkommata im Query reichten nicht aus, und die Spalte in der DB lautet anders:

CODE
$result = mysql_query("select * from nouser order by name asc");

if( preg_match('/^.*' . preg_quote($data['name'], '/') . '.*$/i',



Mit diesen beiden angepassten Zeilen funktioniert es perfekt. Besten Dank, darauf kann ich nun aufbauen...
 
QUOTE (radarin @ Mi 21.9.2005, 0:24)[...] Die einfachen Hochkommata im Query reichten nicht aus, [...]

Warum reichen die nicht aus?
blink.gif

Wozu werden dort Double Quotes benötigt?
dry.gif

- Ich selber schreibe alle SQL-Queries mit Single Quotes...


Bei den direkten datenbank-spezifischen Namen der Tabelle oder der Spalten habe ich auch kaum Rücksicht drauf genommen. ;-)
<edit>Stimmt die beiden Felder müssten gleich sein
happy.gif
</edit>


MfG Sascha Ahlers
 
Also wenn du die Abfrage mit ASP machst, dann funktioniert diese mit dem Like %% Befehl und ist in meinen Augen auch einiges schneller als wenn ich eine schlaufe durch alle unerwünschten Namen mache. (Je nachdem wird diese ja ziemlich gross sein)
wink.gif


und wenn das ja mit ASP funktioniert, sollte das auch in PHP klappen, ich würd da mal noch ein bisschen weiter suchen!

greez roman
 
Genau, und zwar so:

CODE
"...WHERE '" . $_POST[suchwort] . "' LIKE CONCAT('%',beschreibung,'%')"



...noch nicht getestet, aber müsste gehn
 
QUOTE (eVolver @ Mi 21.9.2005, 18:29)[...]

CODE
"...WHERE '" . $_POST[suchwort] . "' LIKE CONCAT('%',beschreibung,'%')"


[...]

Ich suche nach im der Spalte $_POST['suchwort'] nach dem Inhalt Wildcard(*beschreibung*), wie soll das bitte gehen?
Besonders wenn innerhalb der im Datensatz 'sex' steht und alle Wörter, die sex enthalten gefiltert werden sollen.
Beispiele: sexy, sexbombe, cybersex




QUOTE (simplehost.ch @ Mi 21.9.2005, 18:17)[...]
und wenn das ja mit ASP funktioniert, sollte das auch in PHP klappen, ich würd da mal noch ein bisschen weiter suchen!
[...]

Nebenbei noch, was hat eine Programmiersprache mit einer Datenbankabfrage zu tun, außer das die Programmiersprache auf diese zugreift?
Klar, möchte man Schleifen auch gerne vermeiden und die Last nach Möglichkeit auch auf Datenbank und Programmierseite sinnvoll aufteilen, nur funktioniert halt nicht unbedingt alles so einfach.
Man kann natürlich auch die Schleife [1] und den Ausdruck innerhalb der Datenbankabfrage durchführen, doch ist das noch sinnvoll?




QUOTE [...]
CONCAT(zeichenkette1,zeichenkette2,...)

Gibt die Zeichenkette zurück, die durch die Verkettung der Argumente entsteht. Gibt NULL zurück, wenn irgend ein Argument NULL ist. Kann mehr als 2 Argumente haben. Ein numerisches Argument wird in die äquivalente Zeichenkettenform umgewandelt:


mysql> select CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
-> NULL
mysql> select CONCAT(14.3);
-> '14.3'

[...] CONCAT_WS() steht für CONCAT mit Trennzeichen und ist eine spezielle Form von CONCAT(). Das erste Argument [...]

Quelle: MySQL: 7.3.2. Zeichenketten-Funktionen

Vielleicht liege ich ja falsch, nur kann ich wirklich nicht verstehen, wo da die bessere Lösung sein soll oder wie diese funktionieren sollte.
Auch würde ich persönlich keine Schleife innerhalb einer Datenbankabfrage stecken, solange ich diese nicht Aufgrund spezieller Anforderungen brauche.



MfG Sascha Ahlers

[1] MySQL: 18.2.12. Flow Control Constructs
 
sorry, jetzt wo ich selber ein beispiel machen wollte hab ich gemerkt, das ich vom falschen ausgegangen bin...

habe mir überlegt, das man nach dem namen "sex" sucht und die wörter sexy, sexbombe in der Datenbank stehen, dieser weg würde nämlich klappen.

so wie es radarin möchte geht es natürlich nicht mit einer SQL abfrage.

der Mensch irrt
wink.gif


und ja, eine SQL Abfrage selber hat natürlich nichts mit der Programmiersprache zu tun, aber die schreibweise wie die Abfrage gestellt wird, ist natürlich unterschiedlich und das meinte ich eigentlich...
 
Zurück
Oben