有没有办法隐藏最终用户的JavaScript函数?

时间:2011-05-02 21:10:07

标签: javascript html ajax function

我想用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");
          }
      });
  }

如您所见,我必须将数据部分赠送给最终用户。但我想用隐藏的功能加密它然后在服务器上解密它所以可能没有人可以发送和恶意代码到服务器只是因为该代码在解密后没有任何意义,如果没有正确加密。但我必须隐藏用户的功能或使功能仅适用于我?

感谢您的帮助/想法

6 个答案:

答案 0 :(得分:15)

您无法隐藏JavaScript代码。它被下载到客户端并在那里执行。无论你想要什么,你都可以对它进行模糊处理,深入内部,但确定的用户仍然可以找到它。您的安全性确实需要在服务器上,您可以完全控制,而不是在客户端,您根本无法控制。

确保对/actions/dboss/newteacher.php的呼叫已获得授权,并确认它们来自服务器上的有效来源。通过默默无闻的安全不是安全。

答案 1 :(得分:4)

没有。你可以通过缩小代码和那种东西来混淆它们,但是你永远不应该假设你的javascript是不可读的。

您需要验证并清理服务器端上任何用户提交的数据。

答案 2 :(得分:1)

不,抱歉这是不可能的。您放入javascript的所有内容最终都会对用户可见。无论您如何努力缩小/混淆代码,只需安装FireBug,密码就会像用气球一样弹出用户眼睛。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以使用类似Google Closure之类的内容来混淆Javascript代码,但我真的会考虑为什么您需要首先隐藏它,因为它们会弄乱自己的数据。只要您不依赖于对服务器端功能有效的数据(例如将输入直接注入SQL),您应该没问题。

答案 5 :(得分: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>

显然,这仅适用于一次性密钥。