·
编程学习 ·
82905
在提交表单时,为了防止自动程序提交,一般提供有验证码。
一般都是在提交表单后在服务器端检测验证码是否正确,如错误则阻止表单提交。
为了提高体验,有的在Form的submit前使用ajax来提前检测验证码是否正确。
这样还要请求服务器,就想何不使用如下方法,来实现js在客户端验证。
步骤
页面加载时,加载验证码图片,和验证码密码。
验证码密码在服务器端生成,生成规则为 md5(验证码+固定随机码) 来生成。固定随机码只是为了防止md5暴力破解。
客户端在提交表单前使用js检测验证码是否正确。方法为:将用户输入的验证码加上固定随机码 在js使用md5运算后,与验证码密码比较,如不一样则验证码错误。阻止提交表单。
原理
此方法的核心原理就是利用了md5唯一性和无法反向破解的特性。
举一反三,此种方法也可验证其他用户输入。可能还可应用到 修改密码,验证密保等等。
可能你还很糊涂,不知道怎么表达清楚。举个实例。
实例
1 生成验证码 [5u6t9f]
2 将验证码存储在服务器端的session中,并生成 验证码密码[332AWGD] = md5(验证码[5u6t9f]+固定随机码[21EC2020])
3 客户端加载页面,页面中包含根据验证码生成的验证图片、验证码密码[332AWGD]、固定随机码[21EC2020]
4 提交表单前js通过同样算法 计算验证码密码=md5(用户输入验证码+固定随机码[21EC2020]) 计算出 新的验证码密码和系统的验证码密码[332AWGD]比较就可知道验证码是否正确了。
注意:此种方法只是为了优化用户体验,因为高手可跳过JS验证,所以在服务器端还必须对用户输入的验证进行检测。
应优先使用isinstance()而非type()做类型判断,因isinstance()遵循MRO、支持继承与ABC,体现鸭子类型哲学;type()仅判别直接类型,适用极少数需严格身份校验的场景。 用isinstance()而不是type() 直接比较type(obj)==SomeClass在绝大多...
最稳妥方式是用os.path.getmtime()获取文件修改时间戳,与time.time()比较判断是否超7天;遍历需过滤子目录、隐藏文件及非日志后缀;删除前启用dry-run预览,捕获PermissionError和FileNotFoundError异常,逐个安全删除。 用os.path.get...
最可靠判断是否在虚拟环境的方法是比较sys.prefix与sys.base_prefix:若二者不等,则处于激活的虚拟环境(含conda);若相等,则为系统Python或未激活环境;PyInstaller等场景需用getattr防base_prefix缺失。 用sys.prefix判断是否在虚拟环境...
Scrapy中所有Item均经同一pipeline入口,需用isinstance判断类型分流;必须yieldItem实例而非dict;多pipeline需按序启用且各自守门;process_item必须显式return。 Scrapy中多个Item必须共用同一个pipeline入口 Scrapy的p...
hasattr仅能判断属性是否存在,无法区分方法与普通属性;可靠检测可调用方法需三步:hasattr检查存在性、getattr获取值、callable核验可调用性。 hasattr能判断方法是否存在,但不能区分方法和普通属性 直接用hasattr(obj,"method_name")只能告诉你这个名...
验证码降噪不能只靠单一中值滤波,二值化须避开全局阈值127;因非均匀噪声致MedianFilter模糊细笔画,推荐RankFilter(3,5)并辅以point去噪。 直接说结论:验证码降噪不能只靠单一中值滤波,二值化必须避开全局阈值(threshold=127),否则80%以上的干扰线和粘连字符会...
滑块验证码不能用requests直接绕过,因其依赖前端拖动轨迹、加速度等行为验证,服务端校验token是否由真实拖动生成;cv2识别缺口需三步:用高对比度背景图、干净缺口模板、TM_CCOEFF_NORMED匹配;识别后还需模拟真实拖动行为,否则仍失败。 滑块验证码为什么不能用requests直接绕...
直接用django-simple-captcha会登录失败,因其验证码仅参与表单校验,不自动接入Django认证流程;authenticate()不识别captcha_0/captcha_1字段,须在视图中先调用form.is_valid()校验验证码,再用clean_data中的用户名密码执行au...