2010-03-31 9 views
5

हम एक छोटी सी ऐप में कैप्चा टूल के लिए जेकैप्चा का उपयोग कर रहे हैं कि मेरी टीम लिख रही है। हालांकि, केवल विकास के समय (एक छोटी टीम - हम में से 4) के दौरान, हमने वास्तविक शापों के लिए कई अभिशाप शब्दों और अन्य संभावित आक्रामक शब्दों में भाग लिया है। संभावित आक्रामक शब्दों को फ़िल्टर करने का कोई तरीका है ताकि वे उपयोगकर्ता को प्रस्तुत न हों?क्या Jcaptcha से आक्रामक शब्दों को फ़िल्टर करने का कोई तरीका है?

+3

प्रत्येक शब्द किसी को "संभावित रूप से आक्रामक शब्द" है। – Will

+1

कैप्चास का बिंदु यह है कि एक प्रोग्राम उन्हें 'पढ़ नहीं सकता' और यह पता लगा सकता है कि यह कौन सा शब्द है।कैप्चास के लिए एक अलग स्रोत खोजने के लिए मुझे लगता है कि आपकी किस्मत से बाहर – Holograham

+0

@ होलोग्राम हाँ, दुर्भाग्यवश, मैं जेकप्चाचा का उपयोग करने के लिए बाध्य हो सकता हूं, जब तक कि मैं अन्य टूल नहीं ढूंढ पाता जिसे मैं पैकेज कर सकता हूं और हमें अपने आप पर सत्यापन करने की अनुमति देता है सर्वर। हमें अंतर्राष्ट्रीयकरण और 508 अनुपालन (ऑडियो फाइल) के लिए भी समर्थन की आवश्यकता है, जो जेकप्चा समर्थन करता है। मैं एक बहुत सख्त वास्तुकला समूह (श्वास) से निपट रहा हूं। मुझे री-कैप्चा का उपयोग करना अच्छा लगेगा (जो, मेरा मानना ​​है कि इस तरह की चीज़ के लिए पहले से ही अपने स्वयं के फ़िल्टर हैं), लेकिन आर्किटेक्चर समूह ने इसे घटा दिया है। – elduff

उत्तर

5

मैंने जेसीएप्चा डाउनलोड करने और स्रोत को देखने में समय बिताया। मूल रूप से जेकैटचा रीकैप्चा के अलावा वहां प्रत्येक एकल कैप्चा की तरह काम करता है। इसलिए आप क्या चाहते हैं तुच्छ है।

JCaptcha एक WordGenerator है, जो और इंटरफ़ेस का बहुत ही सरल अवधारणा का उपयोग किया जाता है:

public interface WordGenerator { 
    String getWord(Integer length); 
    String getWord(Integer length, Locale locale); 
} 

हमें स्थानीयकरण उपेक्षा करते हैं।

विशिष्ट उपयोग इस तरह है:

WordGenerator words = ... 
WordToImage word2image = new SimpleWordToImage(); 
ImageCaptchaFactory factory = new GimpyFactory(words, word2image); 
pixCaptcha = factory.getImageCaptcha(); 

उनकी इकाई परीक्षण में हम देख सकते हैं, परीक्षण के लिए:

WordGenerator words = new DummyWordGenerator("TESTING"); 
    WordToImage word2image = new SimpleWordToImage(); 
    ImageCaptchaFactory factory = new GimpyFactory(words, word2image); 
    pixCaptcha = factory.getImageCaptcha(); 

नोट हमारे पास है कि "WordGenerator" पर समस्त नियंत्रण के लिए इस्तेमाल किया ।

यहाँ एक (काम, पूरी तरह कार्यात्मक) शब्द जनरेटर मैं सिर्फ लिखा है:

fqXVxId 
cdVWBSZ 
zXeJFaY 
aeoSeEb 
OuBfzvL 
unYewjG 
EhbzRup 
GkXkTyQ 
yDGnHmh 
mRFgHWM 
FFBkTLF 
DvCHIIT 
fDmjqLH 
XMWSOpa 
muukLLN 
jUedgYK 
FlbWARe 
WohMMgZ 
lmeLHau 
djHRqlc 

ध्यान दें कि यदि आप "वास्तविक शब्द" पसंद करते हैं:

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(); 
} 

यह इस तरह यादृच्छिक "शब्दों" उत्पन्न करता है (reCaptcha की तरह, लेकिन reCaptcha किसी अन्य उद्देश्य के लिए वास्तविक शब्द का उपयोग कर रहा है - क्योंकि यह स्कैनिंग/ओसीआरिंग पुस्तकों में मदद करता है!) यह कोई समस्या नहीं है, बस getWord (...) को किसी शब्दकोष से यादृच्छिक शब्द चुनने के लिए बदलें।

अब आप अपमानजनक शब्दों को कैसे उठाएंगे? यह तुच्छ है। यहाँ मैं सिर्फ एक उदाहरण देना (कृपया, कोड के बारे में कोई बहस है, यह वास्तव में सिर्फ एक उदाहरण से पता चलता है कि यह कैसे किया जा सकता है है):

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(); 
} 

अब अगर आप कसम शब्द को रोकने के लिए चाहते हैं, आप शायद भी शपथ लेने वाले शब्दों के करीब उन लोगों को रोकना चाहते हैं (उदाहरण के लिए "एफवीके" और "dikk" आदि)। यह एक बार फिर से मामूली बात है:

विधि की
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 (डब्ल्यू)" पाठक के लिए एक exercice के रूप में छोड़ दिया है।

+1

क्वाड एरैट प्रदर्शन – SyntaxT3rr0r

+0

@chris_l: आपकी समस्या यह महसूस करने में आपकी दिमाग की विफलता में निहित है कि जब सुरक्षा की बात आती है तो वहां एक विषमता होती है: "प्रतिवादी" के पास हमलावर के बाद अधिक जानकारी उपलब्ध होती है। आपका पूरा जुआ * बिल्कुल * किसी के समान है जो कहता है * "पीकेसीएस काम नहीं कर रहा है क्योंकि आप दो विशाल प्राइम नंबरों को गुणा नहीं कर सकते क्योंकि आप दो विशाल प्राइम नंबरों को कारक नहीं बना सकते" *। जो एक पूरी तरह से परिपत्र तर्क है जो * सटीक * पूरे बिंदु को याद कर रहा है क्यों पीकेसीएस काम करता है और क्यों कैप्चा काम करता है। वहां ** यह सत्यापित करने का एक तरीका होना चाहिए कि कोई जवाब सही है (या गलत)। हमारे पास सर्वर पर शब्द की जानकारी है। – SyntaxT3rr0r

+0

बीटीडब्ल्यू उन सभी क्रमिकरणों को उत्पन्न करता है जिनमें लेवेनस्टीन संपादित करें एक की दूरी संपादन दूरी की गणना करने से कहीं अधिक आसान है। – SyntaxT3rr0r

संबंधित मुद्दे