在JavaScript中将用户输入编码为URL GET参数

时间:2010-10-16 22:09:04

标签: javascript hash

我正在编写一个需要维护三个属性的JavaScript函数:

  • 非常小巧轻便 - 没有外部库
  • 以能够作为GET参数传递的方式对字符串进行编码
  • 此字符串必须在目的地再次解码

实际上,它通过将用户名和密码发送到PHP页面来验证用户,然后PHP页面对其进行验证。这是通过 GET 完成的,因为我还没有找到一种执行后台跨域POST请求的方法。麻烦的是,如果用户的密码中包含“#”或类似字符,则无法正确发送。

目前为了避免这种情况,我在发送之前encode()密码字符串,这样可以毫无问题地收到密码字符串。但是,我读到PHP的urldecode()并不是一个完美的类比,因为有些角点情况被区别对待(即'','+'等)。可悲的是我再也找不到这个文件,所以我不能引用它,但要点是其中一个将空格转换为'+'符号,另一个将其视为实际的加号,或类似的东西......

因此,我正在寻找一个Javascript函数,它可以获取字符串并使其具有URL安全性,并且在PHP中具有完美的反转功能,以便可以恢复原始字符串。

我目前用来实现这个可怕的代码:

login.onsubmit = function(){
    loginFailMsg.style.display = 'none';
    var inputs = login.getElementsByTagName('input');
    var formdata = 
        'username='+inputs[0].value+'&password='+encode(inputs[1].value);
    submit.src = formtarget+'/auth/bklt?'+formdata;
    userinfo = undefined;
    setTimeout(getUserinfo,300);
    return false;
};

3 个答案:

答案 0 :(得分:2)

encodeURIComponent,PHP会在填充$_POST$_GET时自动对其进行解码

答案 1 :(得分:1)

我认为没有可逆散列函数这样的东西。但是,有很多javascript md5 libraries可用。

答案 2 :(得分:1)

'&password='+encode(inputs[1].value)

encode函数来自哪里?在我看来,您的问题的快速答案是使用encodeURIComponent()代替,自JavaScript 1.5起可用。另见Comparing escape(), encodeURI(), and encodeURIComponent();它也不会对所有内容进行编码,但对所有服务器所期望的进行编码。

(对于跨域AJAX POST调用,我真的看看“带填充的JSON”。请参阅前面评论中提到的JSONP with jQuery。这也可以防止{{{ 1}}你随机选择了,jQuery也会帮助你,很多,摆脱timeout之类的东西。而且,正如你apparently已经拥有的那样在服务器上的MD5哈希,我真的哈希密码客户端 - 查看Karl's answer - 并比较那些哈希值。尊重用户的密码和你自己的时间,放弃没有外部库要求!)