- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,用户可以在其中输入不同的 url 以与不同的服务器通信。
Apple App Transport Security 在允许用户输入 URL 方面有点像噩梦。
我现在知道的选择:
最好让我的用户输入一个 url,然后确定 ATS 是否失败。如果失败,最好提示用户让他们知道服务器不安全,然后在他们确认后以编程方式添加异常。
所以问题是,我能否以编程方式更改 ATS 设置并向 ATS 添加异常(exception)?
最佳答案
在这种情况下,我认为您误解了 ATS 的目的,但有一些规定可以做您想做的事。 ATS 并不是为了有条件地验证而设计的,而是为了在所有(或至少指定的子集)网络连接上强制执行一组特定于操作系统的最佳实践。对于大多数简单的应用程序来说,这已经足够了,因为它们访问有限数量的高度可见的站点或它们控制的站点。在您的情况下,您可能需要验证功能来提示用户是否可以连接到不安全的站点,或者是否可以对配置错误的站点使用内部或托管白名单。
我有一个应用程序,还允许连接到任意服务器,特别是那些可能由不同组织设置的服务器,因此可能对升级周期和安全性有非常不同的看法。对于这种设置,白名单样式(Apple 的默认设置)并不真正合适,因为我们需要灵 active 来支持安全性较差的网站(或者至少是自签名证书,直到人们更多地使用 Let's Encrypt)。
出于我们的目的,我们对 ATS 使用黑名单样式。基本上我们知道我们控制的网站和知名网站将具有更高的安全级别,因此我们强制 ATS 对这些网站执行强制措施。对于所有其他站点,ATS 被禁用,允许使用非 SSL 和配置不当的 SSL。
为了执行您自己的检查,您需要实现 NSURLSessionDelegate
并使用 URLSession:didReceiveChallenge:completionHandler:
自行决定有效性SSL/TLS 连接。
在处理程序内部,您基本上可以执行您认为适当的任何验证,并且由于它有一个 completionHandler
block ,您甚至可以在继续之前提示用户。
我们使用此方法允许用户在显示证书详细信息后进行选择,并将其用于某种形式的证书固定。在固定情况下,我们基本上保存站点证书的指纹,并使用它来确定用户是否确定了该站点(比使用站点名称安全得多,因为用户验证权限或证书而不仅仅是 URL )。
为了完整起见,当我在上面提到“黑名单样式”时,我特指使用 NSAllowsArbitraryLoads
来 YES
,并使用 NSExceptionDomains
特别列出您知道应该安全的域(例如您自己的服务器或众所周知的服务)。这涉及到将异常表中的条目的 NSExceptionAllowsInsecureHTTPLoads
设置为 NO
。
关于ios - 是否可以以编程方式修改 ATS 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271364/
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 Stack Overflow 的 on-topic。 4年前关闭。
假设我有一个列表 xs。如何在 ATS 中编写以下循环样式: foreach x in xs do process(x) 最佳答案 您可以使用旧的 DIY 风格(也:经典的 ATS 风格),也就是说,
在开头加上:从 ATS 网站学习 ATS。 尝试从列表中提取记录时,一旦我尝试引用记录变量,就会在下面的 x4.a 上收到类型错误。 那么为什么会失败 - x4 不知道它有记录吗? typedef a
我知道可以使用 libc/math 中的 sqrt 函数来完成它: staload Math = "libats/libc/SATS/math.sats" val sqrt2 = $Math.sqrt
我可以像堆栈一样使用列表,但是在 ATS 中创建队列的正确方法是什么?例如,假设我有以下伪代码: val xs = queue_create() val () = xs.enqueue(1) val
例如,如何在 ATS 中构造一个数组,其中包含从 A 到 Z 的所有大写字母?在 C 中,这可以按如下方式完成: char *Letters() { int i; char *cs = (
例如,我正在 ATS 中寻找一个示例,该示例或多或少地执行以下 C 代码的功能: int *theMultable[10][10]; void theMultable_initialize() {
例如,如何构造一个包含所有数字的列表:0、1、2、3、4、5、6、7、8 和 9。 最佳答案 您可以使用 val xs = ($list {int} (0, 1, 2, 3, 4, 5, 6, 7,
基本上,我正在寻找或多或少相当于以下 C 代码的东西: int theGlobalCount = 0; int theGlobalCount_get() { return theGlobalCount
假设我想对列表中的整数求和。我可以通过在列表上应用初始值为 0 的 reduce 运算符和加法函数来做到这一点。 ATS中reduce算子叫什么名字? 最佳答案 “reduce”这个名字有点含糊。它可
这里有两段代码我认为是等效的,除了第二段的行数比它应该多: fun move_ul {i:nat} ( p: int(i) , ms: list0(Int) ): list0(Int) = if
我经常在 ATS 中看到使用 case、case+ 或 case- 形成的 case 表达式。有什么区别? 最佳答案 如果表达式不详尽,使用 case 会发出警告,case+ 会产生错误,而 case
我知道如何使用 patsopt 和 atscc2js 将 ATS 代码编译成 JS 代码: patsopt -d foo.dats | atscc2js -o foo_dats.js 我是否需要为 a
例如,如何在 ATS 中编写 x 的 10 次幂的表达式?我尝试了 x^10 和 x^^10,但都没有奏效。 最佳答案 ATS 中整数和浮点值的取幂运算符是 ** ,如 implement main0
当使用像 list_map 这样的高阶函数时,需要构建闭包函数并将它们作为参数传递。之后,构建的闭包就变成了垃圾。有没有办法在调用堆栈上构建这样的闭包函数(以便在调用后自动释放它们)? 最佳答案 正如
main0 函数的类型是什么? 我正在编写 gtk3 库。但是 g_application_run() 函数需要 argv。当然,ATS语言可以在main0函数上使用argv。但是类型是什么? 最佳答
有时,我会看到如下代码: var foo = lam@(x: int): int => ... lam@ 是什么意思? lam 和 lam@ 有什么区别? 最佳答案 在内存方面,lam 创建一个盒装闭
这是日期格式化程序设置: let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.tim
我想得到下面的结果但不使用 at语法,因为它在 Safari 中不受支持,我很难使用它。有谁知道任何方法?先感谢您! #content { background-color: black; h
也许我可以使用这样的脚本文件: 现在在 -f script_file 但是如何将参数分配给脚本。 最佳答案 at 没有 -f 开关。你可以像下面这样使用它: echo "sh script.sh" |
我是一名优秀的程序员,十分优秀!