Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 谁负责检查数据的有效性?_Language Agnostic - Fatal编程技术网

Language agnostic 谁负责检查数据的有效性?

Language agnostic 谁负责检查数据的有效性?,language-agnostic,Language Agnostic,我不清楚是来电者还是被来电者有责任检查数据的合法性 被调用方是否应该检查传入的参数是否不应为null,并满足一些其他要求,以便被调用方方法能够正常、成功地执行,并捕获任何潜在的异常?或者这是调用方的责任?用户端(客户端)和提供者端(API)验证 客户应该这样做,因为这意味着更好的体验。例如,为什么网络往返只是为了被告知您有一个坏的文本字段 供应商应做到这一点,因为他们不应该信任客户(例如XSS和中间人攻击)。你怎么知道请求没有被拦截?验证一切 有几个级别的有效: 所有必填字段均存在,格式正确。这

我不清楚是来电者还是被来电者有责任检查数据的合法性

被调用方是否应该检查传入的参数是否不应为
null
,并满足一些其他要求,以便被调用方方法能够正常、成功地执行,并捕获任何潜在的异常?或者这是调用方的责任?

用户端(客户端)和提供者端(API)验证

客户应该这样做,因为这意味着更好的体验。例如,为什么网络往返只是为了被告知您有一个坏的文本字段

供应商应做到这一点,因为他们不应该信任客户(例如XSS和中间人攻击)。你怎么知道请求没有被拦截?验证一切

有几个级别的有效

  • 所有必填字段均存在,格式正确。这是客户端验证的内容
  • #1加上字段之间的有效关系(例如,如果存在X,则需要Y)
  • #1+2+业务有效:满足所有业务规则,以便正确处理

  • 只有提供者方可以执行#2和#3。

    验证数据是被调用方的责任。这是因为只有被调用方知道什么是有效的。这也是一个很好的安全实践。

    对于API,被调用方应始终进行适当的验证,并对无效数据抛出描述性异常

    对于任何具有IO开销的客户端,客户端也应该进行基本验证…

    很好。。。视情况而定

    如果您能确定如何处理被叫方内部的无效数据,那么就在那里进行处理

    如果您不确定(例如,因为您的方法非常通用,并且在一些不同的地方和方式中使用),那么让调用者决定

    例如,假设一个DAO方法必须检索某个实体,但您没有找到它。你能决定是否抛出一个异常,也许回滚一个交易,或者只是认为它可以吗?
    在这种情况下,完全由调用方决定如何处理它。

    它也需要位于客户端和服务器端(被调用方和调用方)

    客户:

  • 这是最有效的一个
  • 客户端验证将减少对服务器的一个请求
  • 以减少带宽流量
  • 时间消耗(如果它有来自服务器的延迟响应)
  • 服务器:

  • 不相信用户界面数据(由于黑客)
  • 大部分后端代码将被重用,因此我们不知道数据是否为空,等等,。因此,我们需要在被调用方和caler方法上进行验证
  • 总的来说, 1.若数据来自UI,那个么最好在UI层进行验证,并在服务器层进行双重检查。 2.若数据传输在服务器层本身,我们需要在被调用方上进行验证,为了进行双重检查,我们还需要在调用方上进行验证


    谢谢

    打电话的人和被叫人之间应该有一种叫做合同的东西。如果输入数据在指定的值中,被调用方确保它做了正确的事情。他仍然应该根据这些规范检查输入数据是否正确。在Java中,您可以抛出一个
    InvalidArgumentException

    调用方还应在合同规范范围内工作。他是否应该检查他移交的数据取决于具体情况。理想情况下,您应该以一种不需要检查的方式对调用方进行编程,因为您确信数据的有效性。如果是用户输入,则无法确定其是否有效。在这种情况下,你应该检查它。如果你不检查它,你至少必须处理异常并做出相应的反应。

    这都是关于“合同”的。这是一个被调用方,它决定哪些参数是好的或不好的。 您可以在文档中输入“null”参数无效,然后抛出
    NullPointerException
    InvalidArgumentException
    就可以了

    如果返回null参数的结果有意义,请在文档中说明。通常这种情况是一种糟糕的设计-创建一个参数较少的重写方法,而不是接受null

    只记得抛出描述性异常。根据经验法则:

  • 如果调用方传递了错误的参数,与文档中描述的参数不同(即null、id<0等),则抛出未经检查的异常(
    NullPointerException
    InvalidArgumentException
  • 如果调用方传递了正确的参数,但可能存在导致无法处理调用的预期业务案例-您可能希望抛出一个选中的描述性异常。例如,对于
    getpermissionsfourser(Integer userId)
    调用方传递
    userId
    不知道是否存在这样的用户,但它是非空整数。您的方法可能会返回权限列表或调用
    UserNotFoundException
    。它可能是已检查的异常
  • 如果根据文档,参数是正确的,但它们会导致处理内部错误-您可能会抛出未经检查的异常。这通常意味着您的方法未经过良好测试;-)
    被叫方有责任检查其接收的数据是否有效。未能执行此任务几乎肯定会导致软件不可靠,并使您面临潜在的安全问题

    话虽如此,如果您控制了客户机(调用方)代码,那么您还应该在那里至少执行一些验证,因为这将带来更好的总体体验


    一般来说,尽可能早地发现数据中的问题,这样会减少后续工作中的麻烦。

    我将从不同的角度来看待这个问题。在包含的应用程序中工作时,调用者和被调用者都在同一代码中。然后,被调用方的合同所要求的任何验证都应由被调用方完成

    你写了一首赋