我正在使用JsfCaptcha来尝试进行离线验证码验证。虽然有一种方法可以验证“用户输入的内容与验证码图像显示的内容相匹配”,但我很难打印出服务器指出的正确解决方案。我以为这很容易完成,但是对我而言,无法解决。这是我使用图书馆的方式:
import botdetect.web.jsf.JsfCaptcha;
[...]
@ManagedBean
@RequestScoped
public class MySampleBean implements Serializable {
private JsfCaptcha captcha;
private String captchaCode;
getters for above two fields
[...]
setters for above two fields
[...]
public boolean checkInputMatches() {
if (!this.captcha.validate(captchaCode)) {
return true;
}
return false;
}
}
方法checkInputMatches()演示了库如何验证用户是否输入了正确的验证码解决方案。为了调试目的,我现在要注销的是解决方案(如果用户输入了错误的值)。可能是这样的:
final String solution = captcha.getCorrectSolutionToCaptcha();
起初,我浏览了所有公共获取者,但没有一个人公然向我提供所需的数据。在尝试了所有方法之后,我沿着jdgui路线走了,在那里我对库进行了反编译,并试图寻找一种可以为我提供这些数据的解决方案/方法。
可悲的是,JsfCaptcha类在5-6个基本类扩展级别之下,具有大量受保护/私有方法。显然,非常繁琐且不必要的寻找非常简单的事情。
是否可以打印出根据其进行验证的实际JsfCaptcha值?
答案 0 :(得分:0)
我终于设法通过修改javassist的字节码来解决Botdetect library的问题。我之所以这样做,是因为我找不到用于访问实际验证码解决方案的任何吸气剂方法。显然,这不是一个干净的解决方案,但鉴于您只想调试代码以确定您输入的代码为何与后端服务器所拥有的代码不匹配,这是一个解决方案。现在,在没有更清洁的替代方法不需要字节码操作之前,我将把它作为一种解决方案。以下是我玩过的版本的详细信息,可以使它起作用:
botdetect-4.0.beta3.5jar
botdetect-jsf20-4.0.beta3.5.jar
botdetect-servlet-4.0.beta3.5.jar
当执行checkInputMatches()方法以验证验证码时,相对于所提到的jar,该结构在后端执行:
Step 1: ( botdetect-jsf20-4.0.beta3.5.jar )
com.captcha.botdetect.web.jsf.JsfCaptcha ->
public boolean validate(String paramString)
Step 2: ( botdetect-servlet-4.0.beta3.5.jar )
com.captcha.botdetect.web.servlet.Captcha ->
public boolean validate(String paramString)
Step 3: ( botdetect-jsf20-4.0.beta3.5.jar )
com.captcha.botdetect.internal.core.CaptchaBase ->
public boolean validate(String paramString1, String paramString2, ValidationAttemptOrigin paramValidationAttemptOrigin, boolean paramBoolean)
Step 4: ( botdetect-jsf20-4.0.beta3.5.jar )
com.captcha.botdetect.internal.core.captchacode.CodeCollection ->
public final boolean a(String paramString1, String paramString2, Integer paramInteger, boolean paramBoolean, ValidationAttemptOrigin paramValidationAttemptOrigin)
Step 5: Observe $3 ( third argument from Step 4 ) to show the actual code.
这是使用jdgui拍摄的照片,通过它我得出了以下结论:
请牢记这一点,当使用javassits(我在Tomcat上使用javassist-3.18.1-GA.jar)执行代码时,可以按照以下方法打印出该值:
@ManagedBean(eager = true)
@ApplicationScoped
public class CustomBean implements Serializable {
private static final long serialVersionUID = 3121378662264771535L;
private static Logger LOG = LogManager.getLogger(CustomBean.class.getName());
@PostConstruct
public void initialize() {
try {
final ClassPool classPool = new ClassPool(ClassPool.getDefault());
classPool.insertClassPath(new ClassClassPath(this.getClass()));
classPool.insertClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
final CtClass codeCollectionClass = classPool
.get("com.captcha.botdetect.internal.core.captchacode.CodeCollection");
if (!codeCollectionClass.isFrozen()) {
final CtMethod aMethod = codeCollectionClass.getDeclaredMethod("a",
new CtClass[] { classPool.get("java.lang.String"), classPool.get("java.lang.String"),
classPool.get("java.lang.Integer"), classPool.get("boolean"),
classPool.get("com.captcha.botdetect.internal.core."
+ "captchacode.validation.ValidationAttemptOrigin") });
aMethod.insertAfter("System.out.println(\"Botdetect-DEBUG: entered-captcha: \" + "
+ "$1 + \"; expected-captcha: \" + $3 + \";\" );");
codeCollectionClass.toClass();
} else {
LOG.error("Frozen class : Unable to re-compile BotDetect for debugging.");
}
} catch (final Exception e) {
LOG.error("unable to modify the bot detect java code", e);
}
}
}
给出此输入和挑战:
您在日志中收到这样的消息:
Botdetect-DEBUG: entered-captcha: U33aZ; expected-captcha: U49a6;