【问题标题】:Where should we put data validation in a website?我们应该将数据验证放在网站的什么位置?
【发布时间】:2012-08-02 14:26:16
【问题描述】:

我浏览了互联网上的许多主题和/或问题以寻找明确的答案,但到目前为止还没有得到任何答案。

部分问题已经得到解答(除非你告诉我这是错误的)。数据验证应该在客户端和服务器端完成。客户端通知用户无效数据并卸载服务器和服务器以防止任何类型的攻击。

不过,双向验证可能是一项乏味的任务,我想知道是否有某种方法可以做到这一点,这样您就不会有太多重复的代码。

我还想知道其他一些事情...我有一个表,其中的行包含该行的(数据库的)id。在每一行的末尾,我有一个删除按钮,可以将其从 html 中删除,我的 JSON 对象包含我的值数组,并被发送到要从数据库中删除的 ajax 调用(2 个表之间的链接)。

这不安全(在互联网等不安全的环境中),我知道。我总是可以检查客户端以查看 id 是否只是数字,如果是,则检查服务器端是否存在。但是谁告诉我用户没有进入调试器并反转了 2 行并最终删除了不应该的行?拥有我的 id 并避免人们倒置它们的最佳方式是什么?

任何建议表示赞赏

【问题讨论】:

  • 您应该始终在服务器端验证数据。如果您不想在客户端也这样做,那么您可以编写服务器端验证以向用户返回错误消息,而不是执行操作,尽管不是 PHP 开发人员我不知道这有多容易将是实施。

标签: php javascript validation


【解决方案1】:

数据验证应该在客户端和服务器端完成。

在客户端恕我直言,实际上并不需要这样做。但是很高兴能够在提交数据之前通知用户。所以我称它为pre。

不过,双向验证可能是一项乏味的任务,我想知道是否有某种方法可以做到这一点,这样您就不会有太多重复的代码。

因为 PHP 是服务器端,而 javscript 是客户端,所以要防止代码重复并不容易。我知道有一种方法是使用xhr requests。这样你就可以在javascript(客户端)中使用php验证了。

在每一行的末尾我有一个删除按钮,可以从 html 中删除它

请告诉我你正在使用CSRF protection。 :-)

我总是可以检查客户端以查看 id 是否只是数字,如果是,则检查服务器端是否存在。

为了防止恶意sql注入,你应该use prepared statements and parameterized queries

【讨论】:

  • 我觉得最好两边都做。您始终可以在客户端进行更简单的验证。
  • “请告诉我你正在使用 CSRF 保护。:-)”我会确定的。我已经在几乎所有地方都在使用 prep 语句。我只使用 POST 并且通常使用 strip_tags 并修剪输入的数据。但我想知道的是,如果数据是有效的但只是与另一个有效值反转,它可能会搞砸数据库值或类似的东西。有没有办法防止呢?
  • @Rayfloyd “如果数据有效但仅与另一个有效值反转,它可能会搞砸数据库值或类似的东西”您可以为此实现 ACL
【解决方案2】:

验证应始终在服务器上完成。客户端验证只是为了方便用户,从安全的角度来看并不是绝对必要的(除非它打开了 XSS 安全漏洞)。

除此之外,您应该清理从用户那里收到的每一个输入。在输入通过完整性检查后(例如,如果有文本应该有数字),您应该进行权限测试(用户是否具有执行请求的操作的适当权限? em>)

完成后,就可以实际执行交易了。

【讨论】:

    【解决方案3】:

    由于已经发布了其他答案,我建议您专用一个可以调用 Utility 的实用程序类,并且您可以在其中存储许多有用的函数来检查服务器端的数据类型和内容,即使您'将在客户端和服务器端进行一些很好的验证,至少您的代码将更具可读性和可管理性。

    创建和管理您自己的实用程序类的另一个好处是您可以轻松地在所有项目中使用它们。

    例如,实用程序类可以包含各种方法,从验证某个字段是否在特定值范围内,或者它不包含特殊字符(使用正则表达式)等等......您的高级实用程序方法将侧重于防止脚本插入,如前所述的 sql 注入。

    总而言之,您只需完成一次工作并从中受益,我敢肯定您不想开始检查年龄字段是否为负数或您从头开始执行的每个项目。使用 Ajax 和 XHR 可以成为服务器端代码和客户端代码之间的桥梁,有助于统一验证并避免重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2012-01-19
      • 2023-03-11
      • 1970-01-01
      • 2011-10-01
      • 2012-11-12
      • 1970-01-01
      相关资源
      最近更新 更多