如何使用OpenSSL在Swift中防止由于错误输入d2i_X509_REQ_bio而导致致命错误

Unome

内容:

我有以下代码将数据加载到BIO中,然后获得一个X509Req:

    let reqBIO = BIO_new(BIO_s_mem())
    let result = BIO_write(reqBIO, (reqData as NSData).bytes, Int32(reqData.count))
    let x509ReqContainer: UnsafeMutablePointer<X509_REQ> = d2i_X509_REQ_bio(reqBIO, nil)
    BIO_free(reqBIO) 

当输入是预期的base64编码DER时,此代码非常有用。但是,如果我传递base64Encoded垃圾字符串,它会炸毁并且很丑陋,并引发致命错误。

所以我的问题是:

  1. 我可以调用OpenSSL中的某种方法来确定BIO是否可以安全地发送到d2i函数,以便在这种情况下可以正常地失败
  2. 有什么办法可以迅速捕捉到致命错误吗?(我猜不是)
  3. 还有其他方法可以验证我的base64字符串是否包含CSR
马丁·R

简短版本: d2i_X509_REQ_bio()无效输入不会“引发错误”。它只是返回一个空指针。崩溃的原因是您(可能是无意间)强行打开了Swift中的可选组件。

较长版本: C函数

X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **x);

在无效输入上返回空指针。此C函数映射为Swift

func d2i_X509_REQ_bio(...) -> UnsafeMutablePointer<X509_REQ>!

使用“隐式展开的可选”(IUO)作为返回类型,并且空指针表示为nilIUO几乎等同于“常规”(强)可选,唯一的区别是,如果类型检查器需要,则可以将其强制展开。这就是作业发生的情况

let x509ReqContainer: UnsafeMutablePointer<X509_REQ> = d2i_X509_REQ_bio(reqBIO, nil)

因为该变量被声明为非可选。如果C函数由于输入无效而返回空指针,则Swift将Optional.nil被解包,并且程序会因运行时错误而终止。

解决方案:将可选绑定与if let(或guard let结合使用,并让编译器自动推断类型:

if let x509ReqContainer = d2i_X509_REQ_bio(reqBIO, nil) {
    // success ...
} else {
    // failed ...
}

备注:您可以Data使用

let result = reqData.withUnsafeBytes {
    BIO_write(reqBIO, $0.baseAddress, Int32($0.count))
}

而不是将其强制转换为NSData

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Monolog记录Symfony2中的PHP致命错误

来自分类Dev

如何修复由于远程git repo错误而导致的Jenkins错误

来自分类Dev

是什么导致DynamoDB UpdateItem在Swift中出现致命错误?

来自分类Dev

错误:由于信号导致命令失败:分段错误:11

来自分类Dev

OpenSSL :: X509 :: Certificate显示错误域的证书

来自分类Dev

如何避免由于舍入错误而导致的NaN

来自分类Dev

错误:执行gem时(OpenSSL :: X509 :: StoreError)

来自分类Dev

OpenSSL x509证书:使用X509_add1_ext_i2d()添加扩展

来自分类Dev

在Swift中使用Regex进行简单搜索时,如何避免由于搜索字符串中的特殊字符而导致错误?

来自分类Dev

BIO_do_connect导致段错误

来自分类Dev

为什么由于索引超出范围而导致致命错误?

来自分类Dev

如何防止由于SSL错误而终止

来自分类Dev

生成自签名证书时Req中的OpenSSL错误

来自分类Dev

由于具有动态PHP输入的SQL查询,PDO异常导致致命错误

来自分类Dev

由于libstdc ++而导致的错误

来自分类Dev

避免使用`new $ className()`导致致命错误?

来自分类Dev

OpenSSL Windows:req中的错误

来自分类Dev

OpenSSL :: X509 :: Certificate显示错误域的证书

来自分类Dev

错误:执行gem时(OpenSSL :: X509 :: StoreError)

来自分类Dev

Swift中executeFetchRequest致命错误

来自分类Dev

如何解决由于bash中的浮动值导致的错误?

来自分类Dev

由于无快速而导致致命错误

来自分类Dev

OpenSSL x509证书:使用X509_add1_ext_i2d()添加扩展

来自分类Dev

isDaylightSavingTimeForDate导致致命错误

来自分类Dev

由于出现信号而导致命令失败:分段错误11-Xcode 8 Swift 3

来自分类Dev

由于使用1.x前缀分支而导致的Git错误

来自分类Dev

如何防止用户输入的错误值存储在变量中?

来自分类Dev

由于输入数据中的空行而导致索引错误

来自分类Dev

由于 C 中的大型 2D 数组导致的分段错误

Related 相关文章

  1. 1

    使用Monolog记录Symfony2中的PHP致命错误

  2. 2

    如何修复由于远程git repo错误而导致的Jenkins错误

  3. 3

    是什么导致DynamoDB UpdateItem在Swift中出现致命错误?

  4. 4

    错误:由于信号导致命令失败:分段错误:11

  5. 5

    OpenSSL :: X509 :: Certificate显示错误域的证书

  6. 6

    如何避免由于舍入错误而导致的NaN

  7. 7

    错误:执行gem时(OpenSSL :: X509 :: StoreError)

  8. 8

    OpenSSL x509证书:使用X509_add1_ext_i2d()添加扩展

  9. 9

    在Swift中使用Regex进行简单搜索时,如何避免由于搜索字符串中的特殊字符而导致错误?

  10. 10

    BIO_do_connect导致段错误

  11. 11

    为什么由于索引超出范围而导致致命错误?

  12. 12

    如何防止由于SSL错误而终止

  13. 13

    生成自签名证书时Req中的OpenSSL错误

  14. 14

    由于具有动态PHP输入的SQL查询,PDO异常导致致命错误

  15. 15

    由于libstdc ++而导致的错误

  16. 16

    避免使用`new $ className()`导致致命错误?

  17. 17

    OpenSSL Windows:req中的错误

  18. 18

    OpenSSL :: X509 :: Certificate显示错误域的证书

  19. 19

    错误:执行gem时(OpenSSL :: X509 :: StoreError)

  20. 20

    Swift中executeFetchRequest致命错误

  21. 21

    如何解决由于bash中的浮动值导致的错误?

  22. 22

    由于无快速而导致致命错误

  23. 23

    OpenSSL x509证书:使用X509_add1_ext_i2d()添加扩展

  24. 24

    isDaylightSavingTimeForDate导致致命错误

  25. 25

    由于出现信号而导致命令失败:分段错误11-Xcode 8 Swift 3

  26. 26

    由于使用1.x前缀分支而导致的Git错误

  27. 27

    如何防止用户输入的错误值存储在变量中?

  28. 28

    由于输入数据中的空行而导致索引错误

  29. 29

    由于 C 中的大型 2D 数组导致的分段错误

热门标签

归档