有没有办法将 JavaScript 函数隐藏在最终用户不可见?

3

我想使用jQuery的ajax调用,例如:

function addnewteacher(){
      $.ajax({
          type: "POST",
          url: "/actions/dboss/newteacher.php",
          data: "uname=" + $("#newteacheruname").val() + "&upass=" + $("#newteacherupass").val() + "&name=" + document.getElementById("newteachername").value + "&surname=" + document.getElementById("newteachersurname").value + "&mobile=" + document.getElementById("newteachermobile").value + "&email=" + document.getElementById("newteacheremail").value,
          success: function(html){
              $("#response").html(html);
              $("#response").dialog("open");
          }
      });
  }

如您所见,我需要将数据部分提供给终端用户。但是我想使用隐藏函数对其进行加密,然后在服务器上进行解密,这样可能就没有人可以向服务器发送恶意代码,因为如果未经正确加密,则该代码在解密后毫无意义。但是我必须隐藏函数使其对用户不可见,或者仅让该函数只对我起作用?
感谢任何帮助/想法。

1
由于您正在使用jQuery,因此可以将诸如document.getElementById("newteachername").value的调用替换为$("#newteachername").val() - Matt Greer
3
无论你如何混淆,任何使用Firebug的人仍然可以看到表单提交。 - Mike Robinson
顺便提一下,你应该链式调用你的代码:$("#response").dialog("open"); 因为现在你让它两次搜索 #response(#newteacherupass 也是同样的情况,但你需要将其存储在变量中,因为不能链式调用)。 - xavierm02
加密应该用于防止窃听,而不应该用于检查数据的来源。这就是签名的作用:http://en.wikipedia.org/wiki/Digital_signature。如果您希望服务器能够检查消息来自可信客户端,则需要签名,而不是加密。 - Mike Samuel
6个回答

17

JavaScript代码无法隐藏。它会被下载到客户端并在那里执行。您可以混淆它,将其推得很深,但是一个决心坚定的用户仍然可以找到它。您的安全性确实需要在服务器上,那里您拥有完全控制权,而不是在客户端上,那里您根本没有控制权。

请确保对/actions/dboss/newteacher.php的调用已经得到授权,并且验证这些调用来自于服务器上有效来源。安全性不应该建立在混淆之上。


+1 表示第一次回答正确和完整,而不是先发布简短的内容,然后在窗口内进行编辑。 :) - Richard Marskell - Drackir

5

不可以。你可以通过代码压缩等方式混淆它们,但永远都不要假设你的JavaScript代码是无法阅读的。

你需要在服务器端验证和清理任何用户提交的数据。


1
抱歉,这是不可能的。你在 JavaScript 中输入的所有内容最终都会对用户可见。无论你如何努力地压缩/混淆代码,只要安装FireBug,密码就会像气球一样弹出到用户眼前。

1

JavaScript能做的一切都可以由用户完成。即使你认为没有人会理解你的代码,他也不必这样做。他只需要执行它并查看它给出了什么。JavaScript应该仅用作使UI更方便的方式,而不能用于保护任何内容。基本上,您想要的不是在JavaScript中编写密码并在用户输入时检查它,而是要将编写的密码发送到服务器,服务器要么返回“是”,要么返回“否”。 如果您使用JavaScript检查表单,则必须在服务器端重新检查它,因为JavaScript可能已被禁用等。 JavaScript本身不安全(当然是客户端语言)。


0

你应该尝试隐藏密钥,而不是签署内容的函数。

我见过许多JS系统都会做类似这样的事情:

<script>// Runs first
(function () {
  // Look for a key in the URL like 'http://mysite.com/my/path?my=params#;key=abcd...
  var key = document.location.hash.match(/;key=([^;]+)/)[0];
  // Make sure other code on the page can't retrieve the key.
  // This is analagous to a program zeroing out its argv to prevent
  // key retrieval via /proc.
  document.location = "#";  // Does not cause reload.

  // define signature algo and export to whatever scope is appropriate.
  ...
})();
</script>

显然,这仅适用于单次使用的密钥。


0

您可以使用像GoogleClosure这样的工具来混淆JavaScript代码,但我建议您首先搞清楚为什么需要隐藏代码,因为这可能会破坏自己的数据。只要不依赖于数据有效性进行服务器端功能开发(例如将直接输入注入SQL),那就没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接