验证/清理和 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。其他一切都被认为是 internal 或 core。理想情况下,内部的东西根本不应该暴露给客户(如果可能的话)。
通过拆分事情,您可以专注于不同的目标。内部部分技术性很强,预计会经常更改。如果您愿意,它可以完成繁重的工作。 public api 还有其他优先事项。它应该方便、易于理解并且考虑到(向后)兼容性。这样您就可以进行某些根本不需要修改客户端代码的更改。
此外,如果您发布和维护某些内容,请遵循 semantic versioning 的规则。人们会喜欢的。
不确定标题是否提供了足够的信息,面团我想知道什么是 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。其他一切都被认为是 internal 或 core。理想情况下,内部的东西根本不应该暴露给客户(如果可能的话)。
通过拆分事情,您可以专注于不同的目标。内部部分技术性很强,预计会经常更改。如果您愿意,它可以完成繁重的工作。 public api 还有其他优先事项。它应该方便、易于理解并且考虑到(向后)兼容性。这样您就可以进行某些根本不需要修改客户端代码的更改。
此外,如果您发布和维护某些内容,请遵循 semantic versioning 的规则。人们会喜欢的。