灵感的来临,没有任何预兆;灵感的消失,也不会有告别仪式;用文字记下她们吧,让灵感永存……

PyCAPTCHA 的 BUG

davies 发表于 2006 年 09 月 17 日

这两天在使用PyCAPTCHA模块的过程中发现了它的一个bug:使用PersistentFactory 来管理CAPTCHA测试用例时,一个测试用例可以多次测试成功而不会实效,这样可以人工得到答案后反复提交该答案而绕过CAPTCHA测试。

在PyCAPTCHA的已知Bug列表中已经有类似的问题:

  • PersistentFactory() is almost certainly horrible at concurrent access
  • Tests are never invalidated with PersistentStorage(), as they aren't written back to the database
  • All files in Captcha/data are installed, including silly things like .svn directories and *~

这是因为PersistentFactory使用shelve来存储测试用例,已达到进程间共享数据的目的。而它使用shelve打开文件时,默认参数writeback为False,即关闭文件时必会自动回写。如果数据在打开后的修改操作不是通过顶层的字典来进行,该修改不会被shelve发现,也不会写回到文件中,从而出现上面的问题。这个问题在shelve模块的例子中已经明确注明。

一种解决方案是在打开文件时加 writeback=True参数,每次关闭文件时都会将数据内容写回到文件中,而不管是否作了修改,会比较慢。

另一种解决方案是每次修改数据内容时都显示的进行,比如:

采用这种方法,修改BaseFactory的test()函数为:

这样在调用PersistentFactory的test()函数后就会将修改后的test内容写回到文件中,使该测试用例实效。但这种方法还存在一个问题,如果直接调用Captcha对象的testSolutions方法,仍然会存在这个问题。

本质上这是由PersistentFactory所用的shelve模块的不完备导致的,同时由于shelve模块不是多进程安全的,导致了已知BUG列表中的第一个。要从根本上解决问题,只能换用其他的序列化方法,具有多进程多线程安全并且自动回写的特点。

网友留言:

我来留言