我们如何将验证码集成到iOS应用程序中?

16

我在谷歌上搜索了关于将Captcha集成到iOS应用程序中的方法,但没有找到任何相关的方法。 我甚至注册了reCAPTCHA并搜索了是否有适用于iOS的Captcha插件,但我在那里没有找到任何插件。 在做研究时我发现“移动应用程序不需要Captcha”,但是客户想在他的应用程序中使用Captcha,因此,我想知道:

  • 我们是否可以将Captcha集成到iOS应用程序/移动应用程序中:

    1. 如果可以:那么集成它的相关方式是什么。

    2. 如果不行:那么原因是什么。


4
向客户解释为什么它不适用于移动应用程序... - Wain
@Wain:现在我只能做到这个 :) - iShwar
1
创建一个爬取网页(包括Web应用程序)并提交表单的机器人相对简单。这就是经典CAPTCHA解决方案的用武之地。我们不需要在本地应用程序中制作验证码。为什么我们需要验证码来避免垃圾邮件,不幸的是,我听说没有机器人会在本地应用程序中发送垃圾邮件。 - Saad Chaudhry
@SaadChaudhry 很赞 (y) :) - iShwar
4
我是一名渗透测试员,有8年的工作经验,曾为国际大公司完成重要项目。我也开发过大型的网络和移动应用程序以及它们的后端服务。我在这里告诉你们,关于“验证码对于移动应用程序不必要”的传言必须停止!客户端应用程序,无论是在浏览器中使用HTML/JS还是在Android上使用APK,都与HTTP服务进行交互,而正是HTTP服务本身容易受到攻击,而不是与其交互的客户端应用程序!因此,由于这个传言,我个人已经成功地以重大方式攻击了许多API。 - SomeGuy
3个回答

4

我对这个隐藏的Webview ReCaptcha解决方案并不确定,为了使reCAPTCHA正常工作,它需要跟踪用户的行为,但是我不知道这个解决方案如何实现,因此我认为挑战会在99.99%的情况下出现。 - Waqleh
1
@Waqleh ReCapatcha 的想法是为了保护您的服务器免受垃圾邮件或不规则访问的攻击。因此,即使您将其与隐藏 WV 一起使用,它也不会对常规用户/设备显示太多。顺便说一下:我试过了,90% 的访问根本不会出现。 - Developer So far
很高兴知道它并不总是显示挑战,我没有尝试过这个库,我知道recaptcha用于阻止垃圾邮件和ddos攻击...等等。无论如何,即使它100%的时间都显示,也比根本没有好。一个更好的解决方案是使用短信验证,就像Telegram和WhatsApp等应用程序所做的那样。 - Waqleh
1
攻击总有方法可行,只要有意愿就能找到方法。虚假的数字是可以被检测出来的,Gmail、Facebook等已经能够非常高效地进行这项工作。短信验证是一个行业标准,但这并不意味着它是万无一失的。没有绝对安全的事物,你应该始终尝试在用户体验和安全之间取得平衡,否则你肯定会失去转化率。 - Waqleh
如果您想验证设备是否为移动设备,请尝试推送通知。您已经有了身份验证过程(APNS和Firebase)。 - Blind Ninja
显示剩余5条评论

-1

虽然在某些应用程序中没有必要添加验证码,因为应用程序不像网页那样容易受到机器人的攻击。因此,在我的看法中,有些应用程序并不需要添加验证码来防止机器人的攻击。但如果你确实需要嵌入验证码,可以尝试以下代码:

使用以下输出口和变量:

NSArray *arrCapElements;
IBOutlet UILabel *Captcha_label;
IBOutlet UITextField *Captcha_field;
IBOutlet UILabel *Status_label;

以及 IBActions 为:

- (IBAction)Reload_Action:(id)sender;
- (IBAction)Submit_Action:(id)sender;

在Storyboard中,为Captcha_label选择字体名称为Chalkduster 30.0。现在在viewDidLoad()中将arrCapElements分配。
arrCapElements = [[NSArray alloc]initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i",@"j",@"k",@"l",@"m",@"n",@"o",@"p",@"q",@"r",@"s",@"t",@"u",@"v",@"w",@"x",@"y",@"z",@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z", nil];

加载验证码的代码:

-(void)load_captcha{
    @try {
        CGFloat hue = ( arc4random() % 256 / 256.0 );  //  0.0 to 1.0
        CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from white
        CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from black
        Captcha_label.backgroundColor = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];
        //Captcha_label.textColor=[UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];
        NSUInteger elmt1,elmt2,elmt3,elmt4,elmt5,elmt6;
        elmt1 = arc4random() % [arrCapElements count];
        elmt2= arc4random() % [arrCapElements count];
        elmt3 = arc4random() % [arrCapElements count];
        elmt4 = arc4random() % [arrCapElements count];
        elmt5 = arc4random() % [arrCapElements count];
        elmt6 = arc4random() % [arrCapElements count];

        NSString *Captcha_string = [NSString stringWithFormat:@"%@%@%@%@%@%@",arrCapElements[elmt1-1],arrCapElements[elmt2-1],arrCapElements[elmt3-1],arrCapElements[elmt4-1],arrCapElements[elmt5-1],arrCapElements[elmt6-1]];
        //NSLog(@" Captcha String : %@",Captcha_string);
        Captcha_label.text = Captcha_string;
    }
    @catch (NSException *exception) {
        NSLog(@"%@",exception);
    }
}

重新加载操作:
- (IBAction)Reload_Action:(id)sender {

    [self load_captcha];
}

检查验证码是否正确:

- (IBAction)Submit_Action:(id)sender {

    NSLog(@"%@ = %@",Captcha_label.text,Captcha_field.text);
    if([Captcha_label.text isEqualToString: Captcha_field.text]){
        [self.view endEditing:YES];
        Status_label.text =@"Success";
        Status_label.textColor = [UIColor greenColor];
    }else{
        Status_label.text =@"Faild";
        Status_label.textColor = [UIColor redColor];
    }
}

它将会显示如下:

Demo Screen

参考来源:iOS验证码生成器


7
这不是一个验证码。它看起来像一个验证码,但并没有提供任何保护。 - user149341
2
reCAPTCHA 应该在服务器端进行验证,我在您的回答中没有看到它。 - Michael Freidgeim

-1

虽然我们在iOS上没有任何验证码的API,甚至reCaptcha也没有为iOS提供任何插件。很多人建议我不需要为移动应用程序实现验证码。我同意了,但是由于客户不能听取任何借口,我所做的就是:

  1. 简单地使用以下代码创建随机数:

    -(NSInteger)randomIntBetween:(NSInteger)min and:(NSInteger)max { return (NSInteger)(min + arc4random_uniform(max + 1 - min)); }

    将该数字放置在标签上,并要求用户在提供的文本字段中输入相同的数字。如果找到匹配项,则完成了验证码的主要部分[另一端的用户是唯一集成验证码的人类],否则我会重新生成随机数并再次将其放置在标签上,要求用户在提供的文本字段中输入相同的数字。
    最终结果将如下所示。

It Will Look Something Like This

现在这个想法可能更清晰了,只需将函数“randomIntBetween”的输出分配给显示数字的标签,当用户按下登录按钮时,验证文本字段(命名为:输入数字)中的文本是否与其左侧的标签匹配,如果匹配,则允许用户登录,否则清除文本字段和标签上的文本,然后通过调用方法“randomIntBetween:”将新的随机数分配给左侧的标签,并要求用户在输入数字文本字段中输入文本。

8
这不是CAPTCHA。它看起来像一个CAPTCHA,但并没有提供任何保护。 - user149341
3
这没用,如果有人嘲笑你的网络服务。 - Developer So far

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接