代码之家  ›  专栏  ›  技术社区  ›  Biswanath

不允许从地址栏调用javascript函数

  •  3
  • Biswanath  · 技术社区  · 17 年前

    我在一个在线游戏网站工作。有一些事件调用了一个javascript函数,该函数对回调有一些操作。

    像这样,

     <input type="button" onclick="changeSomething"/>
    
    
     function changeSomething() {
             /// some call back, which changes something 
     }
    

    现在,任何知道这一点的人都可以从浏览器的地址栏中调用changesomething,这是我不想要的。

    很可能有人会这么做,但我想允许。

    有没有办法防止这种情况发生?

    谢谢。

    另外,我试过了,但还不确定我是否解释得很好。如果你没有得到什么,请告诉我。

    5 回复  |  直到 16 年前
        1
  •  4
  •   John Topley    17 年前

    你将永远无法得到100%的保护,从任何技术,你尝试。这是一场输的比赛。

    已经说过,接近目标的一种方法是完全删除onclick属性,并通过javascript绑定您的单击处理程序(即“changesomething”):

    HTML:

    <input id="foo" type="button" />
    

    JS:

    addEvent(document.getElementById("foo"), 'click', function() {
        /// some call back, which changes something
    })
    

    然后回调就变成匿名的(例如不再有“changesomething”函数)。这些邪恶的用户如果不知道它的名字就不能直接呼叫它!

    这项技术还有很多方法,但我们不会提及这些方法,以免给邪恶的人一些想法:)

    (btw addevent只是用于添加事件处理程序的示例库函数。我相信你有机会得到一个。如果没有 here you go )

        2
  •  3
  •   Jack Ryan    17 年前

    我认为你对此无能为力。客户机可以在自己的浏览器中运行他们想要的任何东西。唯一要做的就是验证服务器端的所有内容。这是所有Web编程中的一个重要概念。客户端代码可以自由修改,应该作为额外的检查来加快速度,而不是安全方法。

        3
  •  1
  •   rfunduk    17 年前

    你必须在你接受请求的任何后端处理这个问题。假设您只给用户 doSomething() 在某些情况下,您可能在数据库中(或任何其他地方)有这些信息。

    不要担心被调用的javascript(不可能是这样),并在后端进行与前端相同的检查。这样你就可以简单地忘记保护你的前端,因为你无论如何都不能…但您仍然可以阻止恶意用户 doSomething 当他们不应该的时候。

    如果你需要进一步澄清我的意思,请告诉我,但是我需要更多关于你的应用架构的细节。

        4
  •  0
  •   PhiLho    17 年前

    任何“解决方案”都将和禁用网页中的右键单击一样有效…对于后一个问题,我找到了至少十几个解决方法,包括在Opera中查看页面!

    如果禁用此选项,则可以使用Firebug、GreaseMonkey,甚至一些动态修改HTML的代理,更不用说使用页面的本地副本等。

        5
  •  -2
  •   Diodeus - James MacFarlane    17 年前

    您可以通过传递一个ID来检查单击的来源:

    <input id="good' type="button" onclick="changeSomething(this.id)"/>
    
     function changeSomething(myId) {
       if(myId!='good') {
        return;
      }
    
     //......code
    }
    

    修订为:

    <input id="good' type="button" onclick="changeSomething(this)"/>
    
         function changeSomething(myId) {
           if(myId.id!='good') {
            return;
          }
    
         //......code
        }