Nous utilisons JCaptcha pour un outil captcha dans une petite application que mon équipe est en train d'écrire. Cependant, juste pendant le temps de développement (sur une petite équipe - 4 d'entre nous), nous avons rencontré un certain nombre de mots de malédiction et d'autres mots potentiellement offensifs pour les captchas réels. Existe-t-il un moyen de filtrer les mots potentiellement offensants afin qu'ils ne soient pas présentés à l'utilisateur?Existe-t-il un moyen de filtrer les mots offensants de Jcaptcha?
Répondre
J'ai passé du temps à télécharger JCaptcha et à regarder la source. Fondamentalement JCatpcha fonctionne comme chaque captcha là-bas en dehors de ReCaptcha. D'où ce que vous voulez est trivial.
JCaptcha utilise le concept très simple d'un WordGenerator, qui est et de l'interface:
public interface WordGenerator {
String getWord(Integer length);
String getWord(Integer length, Locale locale);
}
Ignorons localisation.
utilisation typique est comme ceci:
WordGenerator words = ...
WordToImage word2image = new SimpleWordToImage();
ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
pixCaptcha = factory.getImageCaptcha();
Dans leurs tests unitaires, nous pouvons voir, à des fins de test:
WordGenerator words = new DummyWordGenerator("TESTING");
WordToImage word2image = new SimpleWordToImage();
ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
pixCaptcha = factory.getImageCaptcha();
Notez que nous avons ENTIER contrôle sur la "WordGenerator" utilisé .
est ici un (travail, entièrement fonctionnel) générateur de mot que je viens d'écrire:
private static final Random r = new Random(System.currentTimeMillis());
public String getWord(final Integer length) {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
final int rnd = r.nextInt(52);
final char c = (char) (rnd < 26 ? 'a' + rnd : 'A' + (rnd-26));
sb.append(c);
}
return sb.toString();
}
Il génère au hasard « mots » comme ceux-ci:
fqXVxId
cdVWBSZ
zXeJFaY
aeoSeEb
OuBfzvL
unYewjG
EhbzRup
GkXkTyQ
yDGnHmh
mRFgHWM
FFBkTLF
DvCHIIT
fDmjqLH
XMWSOpa
muukLLN
jUedgYK
FlbWARe
WohMMgZ
lmeLHau
djHRqlc
Notez que si vous préférez « vrais mots » (comme reCaptcha, mais reCaptcha utilise un mot réel pour un autre objectif altogheter - parce qu'il aide à numériser/OCRing livres!) ce n'est pas un problème, il suffit de changer getWord (...) pour extraire des mots d'un dictionnaire.
Maintenant, comment pouvez-vous empêcher les mots insultants d'être détectés? C'est trivial. Ici, je viens de donner un exemple (s'il vous plaît, pas de discussion sur le code, il est vraiment juste un exemple qui montre comment il pourrait être fait):
private static final Set<String> s = new HashSet<String>();
static {
s.add("f**k");
s.add("suck");
s.add("dick");
}
private static final Random r = new Random(System.currentTimeMillis());
public String getWord(Integer length) {
String cand = getRandomWord(length);
while (isSwearWord(cand)) {
cand = getRandomWord(length);
}
return cand;
}
private boolean isSwearWord(final String w) {
return s.contains(w.toLowerCase());
}
public String getRandomWord(final Integer length) {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
final int rnd = r.nextInt(52);
final char c = (char) (rnd < 26 ? 'a' + rnd : 'A' + (rnd-26));
sb.append(c);
}
return sb.toString();
}
Maintenant, si vous voulez éviter les jurons, vous probablement également veulent empêcher ceux qui sont proches de jurer des mots (par exemple "fvck" et "dikk" etc.). Ceci est encore une fois trivial:
private boolean isSwearWord(final String w) {
List<String> ls = generateAllPermutationsWithLevenhsteinEditDistanceOne(w);
for (final String cand : ls) {
if (s.contains(cand.toLowerCase())) {
return true;
}
}
return false;
}
écriture de la méthode "generateAllPermutationsWithLevenhsteinEditDistanceOne (w)" est laissé comme au lecteur exercice.
quod erat demonstrandum – SyntaxT3rr0r
@chris_l: votre problème réside dans l'incapacité de votre esprit à réaliser que lorsqu'il s'agit de sécurité, il y a une asymétrie: le «défendeur» a plus d'infos disponibles que l'attaquant. Votre randonnée entière est * exactement * identique à quelqu'un qui dirait * "PKCS ne fonctionne pas parce que vous ne pouvez pas multiplier deux nombres premiers énormes parce que vous ne pouvez pas factoriser deux nombres premiers énormes" *. Ce qui est un argument complètement circulaire qui manque * précisément * tout le pourquoi PKCS fonctionne et pourquoi Captcha fonctionne. Il DOIT ** être un moyen de vérifier qu'une réponse est correcte (ou incorrecte). Nous avons les mots info sur le serveur. – SyntaxT3rr0r
btw générant toutes les permutations qui ont un Levenhstein Edit Distance de un est plus facile que de calculer la distance d'édition elle-même. – SyntaxT3rr0r
Chaque mot est un "mot potentiellement offensant" pour quelqu'un. – Will
le point de captchas est qu'un programme ne peut pas «les lire» et deviner de quel mot il s'agit.Pas de trouver une source différente pour captchas Je pense que votre chance – Holograham
@Holograham Oui, je peux être contraint d'utiliser JCaptcha, malheureusement, sauf si je peux trouver un autre outil que je peux emballer et nous permet de faire les vérifications de notre propre chef serveur. Nous avons également besoin de support pour l'internationalisation et la conformité 508 (fichiers audio), que JCaptcha supporte. Je fais affaire avec un groupe d'architecture très strict (soupir). J'adorerais utiliser re-captcha (qui, je crois, a déjà ses propres filtres pour ce genre de chose), mais le groupe d'architecture l'a supprimé. – elduff