在将按钮添加到 jQuery UI 对话框时,如何防止有人更改或避免我的 JavaScript 逻辑?

Posted

技术标签:

【中文标题】在将按钮添加到 jQuery UI 对话框时,如何防止有人更改或避免我的 JavaScript 逻辑?【英文标题】:How can I prevent someone from altering or avoiding my JavaScript logic when adding buttons to jQuery UI dialog? 【发布时间】:2014-05-04 02:09:38 【问题描述】:

我正在使用基于某些权利逻辑的 jQuery UI 对话框和 I am adding buttons to the dialog in javascript。 (如果我有资格,我会从我的服务器端 AJAX 调用中传入一个布尔值,然后根据该标志显示不同的按钮。)

让我担心的是,是什么阻止了某人使用像 Firebug 这样的开发人员工具并在执行检查的行上放置一个断点,或者更改标志或拖动以跳过该权利检查。

所以我的问题是专门针对在 jQuery UI 对话框中添加按钮(因为它不像你可以从服务器端添加按钮,因为它是一个 jQuery 插件),但我想它突出了围绕任何权利逻辑的更普遍的观点在客户端是“脆弱的”。因此,如果围绕这一点有任何一般的最佳实践,我会感兴趣(但仍在寻找我的具体示例的答案)。

注意:我还在 POST 上进行服务器端权利检查作为备份,所以我仍然受到“保护”,但我仍然担心上述问题。

【问题讨论】:

【参考方案1】:

没有什么能阻止人们修改客户端代码,这是不可避免的。

但是,您可以添加“服务器端”类型的按钮,您只需使用 AJAX 调用检索一个字符串,这恰好是一个添加按钮的 JavaScript 函数。并且在客户端对那个字符串执行eval(),它将执行检索到的JS函数并添加按钮。此外,您可以通过这种方式传输整个 JavaScript 代码,因此客户端无法跳过任何内容,因为所有内容都在 eval() 中执行。

一个简单的例子:

服务器端函数返回

string banana= "alert('test');";
return banana;

客户端会这样做

eval(response.d);

这是一个理论上的例子:FIDDLE

【讨论】:

这是正确的方法。 不要在客户端存储任何授权逻辑,而是在服务器上检查它(基于身份验证数据)并从服务器返回相关的 UI 相关代码。它不会像 Banana 所说的那样使客户端操作成为不可能,但至少会阻碍它们。 确实如此。从技术上讲,人们可以在从 ajax 调用中检索字符串并在评估之前对其进行调整后中断,但这使得它不值得付出努力,人们可能不会打扰。【参考方案2】:

您无法控制客户端会对您的脚本执行什么操作,也无法控制他们将对您的服务器发出什么请求。您必须将后端 API(而不是 JS 客户端)设计为用户和系统之间的“门控机制”。最好不要将 JS 视为系统的一部分,而应将其视为一个单独的客户端,作为 API 的参考实现。

但是,如果您希望至少让用户难以弄乱您的代码,您可以使用 Closure 之类的东西来缩小和连接您的 JS 脚本。

【讨论】:

正如我提到的,bankend API 确实在服务器端验证权利,但我也认为在客户端添加这个逻辑给用户一个更明确的体验是好的(而不是让它看起来像他们有能力做某事,然后点击保存,它返回一个错误说“你没有保存权限”)【参考方案3】:

正如其他人所建议的那样,由于您指出的原因,您无法在客户端上实施安全性。您可以使用基本身份验证,或尝试设置基于令牌的方法。

【讨论】:

以上是关于在将按钮添加到 jQuery UI 对话框时,如何防止有人更改或避免我的 JavaScript 逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

jquery-ui-dialog - 如何挂钩到对话框关闭事件

如何删除 jQuery-ui 对话框标题栏?

单击按钮时防止jquery ui打开第二个对话框

如何设置与不同按钮相关的jQuery UI对话框定位?

如何移动 jQuery UI 对话框上的关闭按钮?

jQuery UI 对话框按钮图标