验证/清理和 OOP

Validation / sanitization and OOP

不确定标题是否提供了足够的信息,面团我想知道什么是 best-practice 和创建 object-oriented 库时的最佳设计模式 - "client" 是否应该负责清理发送到该 "black box" 库的数据,或者该库是否应该提供一套工具来防止恶意攻击。

我举个例子: 假设我们正在构建一个 open-source 库,它提供与一个名为 fooCompany 的虚构服务的集成,该服务提供 REST API。 我们的库现在需要向这些 API 发出请求并为其提供一些数据,对于我们的示例,我们以身份验证令牌为例。

最简单的代码可能看起来像这样:

class fooCompany {
  private $apiToken;

  public function __construct($apiToken) {
    $this->apiToken = $apiToken;
  }

  public function send() {
    $ch = curl_init('https://fooCompany.xx/api/send');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Authorization: Bearer ' . $this->apiToken
    ));

    $data = curl_exec($ch);
    curl_close($ch);
  }
}

我们可以看到,如果使用我们库的客户端应用程序不能足够好地保护 apiToken,它的应用程序现在将容易受到 header 注入攻击。

谢谢。

我想对于这类问题没有简单的解决方案。基本上你所描述的是一个你可以——也可以不——添加到你的 "product" 中的功能。据我了解,这根本与 oop 无关。这是您必须做出的战略决策。那 - 当然 - depends:

作为图书馆作者,您应该经常问自己您的图书馆将在何处、何时、为何以及由谁使用。

一般来说,人们在想到图书馆时都会有一定的期望,当然他们也会很懒惰。

简洁、可靠、有文档记录、底层核心的防错接口几乎总是会受到高度赞赏。客户端代码将自动获得质量并且更易于维护。每个人都喜欢这样。作为库的作者,您总是比库的大多数用户更了解 "the fictitious service called fooCompany"。你可以在几分钟内解决问题。其他人可能需要几天时间。

显然这需要你做很多工作...

(另外)显然,与安全相关的事务是显而易见的:如果您已经预料到会发生某些事情,那么您当然应该在这里付出一些努力。

鲁棒性原则说:做事要保守,对别人的期望要开明。


您询问了设计模式:清楚地识别您的库中客户端代码应该显式 use/call 的部分。那就是publicapi。其他一切都被认为是 internalcore。理想情况下,内部的东西根本不应该暴露给客户(如果可能的话)。

通过拆分事情,您可以专注于不同的目标。内部部分技术性很强,预计会经常更改。如果您愿意,它可以完成繁重的工作。 public api 还有其他优先事项。它应该方便、易于理解并且考虑到(向后)兼容性。这样您就可以进行某些根本不需要修改客户端代码的更改。

此外,如果您发布和维护某些内容,请遵循 semantic versioning 的规则。人们会喜欢的。