如何限制连接到 GCDWebServer 中允许的 IP

Posted

技术标签:

【中文标题】如何限制连接到 GCDWebServer 中允许的 IP【英文标题】:How to limit connections to allowed IP's in GCDWebServer 【发布时间】:2016-10-05 14:21:58 【问题描述】:

我正在玩GCDWebServer 类(太棒了!)并且想知道是否可以通过远程 IP 限制允许的连接。

server.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self, processBlock: request in

    let remote = request.remoteAddressString.substringToIndex(request.remoteAddressString.lastIndexOf(":")!)
    let local =  request.localAddressString.substringToIndex(request.localAddressString.lastIndexOf(":")!)

    print("\(remote) vs \(local)")
    if remote == local 
        return nil
    

    //Forbidden
    return GCDWebServerResponse(statusCode: 403);

)

我希望上面会起作用,但它不是,我的意思是当 IP 不同时它会发送 403 Forbidden,否则它会以:

[DEBUG] Connection aborted with status code 500 on socket 13

谁能帮我解决这个问题?

附:以下也不起作用

    server.addDefaultHandlerForMethod("GET",
                                      requestClass: GCDWebServerRequest.self,
                                      processBlock: request in

    print(request.remoteAddressString)
    print(request.localAddressString)

    let remote = request.remoteAddressString.substringToIndex(request.remoteAddressString.lastIndexOf(":")!)
    let local =  request.localAddressString.substringToIndex(request.localAddressString.lastIndexOf(":")!)

    print("\(remote) vs \(local)")
    if remote == local 
        return GCDWebServerResponse(statusCode: 200)
    
    //Forbidden
    return GCDWebServerResponse(statusCode: 403);
)

【问题讨论】:

【参考方案1】:

GCDWebServer.hGCDWebServerProcessBlock

该块必须返回 GCDWebServerResponse 或出错时返回 nil,这将导致向客户端返回 500 HTTP 状态代码。

【讨论】:

你是说我应该在成功时(例如有效 ip)不返回 nil 但例如GCDWebServerResponse(statusCode: 200)? 是的,您应该返回响应。返回 nil 将导致 500 错误响应,这不是您想要的。 我按照建议做了,但屏幕上什么也没有出现,页面没有加载,当我删除这个server.addDefaultHandlerForMethod 然后它可以工作(但来自任何 IP):( 如果您使用多个处理程序,您的 IP 检查将无法按预期工作。我认为您期望从处理程序的进程块返回 nil 会调用下一个处理程序。这不是它在 GCDWebServer 中的工作方式。如果 IP 检查代码在处理程序的进程块中,那么您需要在应用程序的每个处理程序中都有此代码。 你能告诉我一个关于如何阻止网络通信来自不允许的 IP 的例子吗?

以上是关于如何限制连接到 GCDWebServer 中允许的 IP的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本字段中允许的最大输入值限制为 10? [复制]

限制表单输入文本字段中允许的字符数

php数组键中允许的字符?

php中允许的内存大小为33554432字节耗尽(尝试分配43148176字节)

如何解决需要比 SQL 中允许的更长的列名?

无法使用服务帐户授权连接到自己的 GAE 端点 API