首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法过滤掉Jcaptcha中的攻击性词汇?

有没有办法过滤掉Jcaptcha中的攻击性词汇?
EN

Stack Overflow用户
提问于 2010-04-01 03:41:53
回答 1查看 2.6K关注 0票数 5

我们在我的团队正在编写的一个小应用程序中使用JCaptcha作为验证码工具。然而,就在开发期间(在我们4个人的小团队中),我们遇到了一些脏话和其他可能冒犯实际验证码的词。有没有一种方法可以过滤掉潜在的攻击性词汇,使它们不会呈现给用户?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-01 23:21:30

我花时间下载了JCaptcha并查看了源代码。基本上,除了ReCaptcha之外,JCatpcha的工作方式就像所有的验证码一样。因此,你想要的是微不足道的。

JCaptcha使用了非常简单的WordGenerator概念,即and接口:

代码语言:javascript
复制
public interface WordGenerator {
    String getWord(Integer length);
    String getWord(Integer length, Locale locale);
}

让我们忽略本地化。

典型用法如下:

代码语言:javascript
复制
WordGenerator words = ...
WordToImage word2image = new SimpleWordToImage();
ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
pixCaptcha = factory.getImageCaptcha();

在他们的单元测试中,我们可以看到,出于测试目的:

代码语言:javascript
复制
    WordGenerator words = new DummyWordGenerator("TESTING");
    WordToImage word2image = new SimpleWordToImage();
    ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
    pixCaptcha = factory.getImageCaptcha();

请注意,我们在"WordGenerator“上使用了整个控件。

这是我刚刚写的一个(工作的,全功能的)单词生成器:

代码语言:javascript
复制
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();
}

它生成随机的“单词”,如下所示:

代码语言:javascript
复制
fqXVxId
cdVWBSZ
zXeJFaY
aeoSeEb
OuBfzvL
unYewjG
EhbzRup
GkXkTyQ
yDGnHmh
mRFgHWM
FFBkTLF
DvCHIIT
fDmjqLH
XMWSOpa
muukLLN
jUedgYK
FlbWARe
WohMMgZ
lmeLHau
djHRqlc

请注意,如果您更喜欢“真正的单词”(比如reCaptcha,但reCaptcha将真正的word用于另一种用途--因为它有助于扫描/阅读书籍!)这不是问题,只需更改getWord(...)从字典中随机挑选单词。

现在,你如何防止带有侮辱性的词语被使用呢?这是微不足道的。这里我只给出一个例子(请不要争论代码,这只是一个例子,展示了它是如何实现的):

代码语言:javascript
复制
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();
}

现在,如果你想防止脏话,你可能也想阻止那些接近脏话的词(例如"fvck“和"dikk”等)。这再一次是微不足道的:

代码语言:javascript
复制
 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;
}

"generateAllPermutationsWithLevenhsteinEditDistanceOne(w)“方法的编写留给读者作为练习。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2555966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档