【问题标题】:AjaxSubmit overwrite form field before sendAjaxSubmit 在发送前覆盖表单字段
【发布时间】:2012-04-03 12:04:31
【问题描述】:

我想在使用 AjaxSubmit 函数在 Jquery 上提交表单之前覆盖“密码”字段的值。 我知道我可以只更新输入字段上的值,但是我不希望用户看到这个转换。换句话说,我只想向密码字段发送一个自定义值,并将当前值保留在屏幕上...

我该怎么做?

我当前的代码:

var loginoptions = { 
    success: mySuccessFuction, 
    dataType: 'json'
}

$('#My_login_form').submit(function(e) {
    e.preventDefault();
    var pass=$("#My_login_form_password").val();
    if (pass.length>0){
        loginoptions.data={
            password: ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass)))
        }
    $("#My_login_form").ajaxSubmit(loginoptions);
    delete loginoptions.data;
});

此代码的问题在于它发送了一个带有表单字段值的“密码”POST 变量,以及一个重复的变量,其中的值是我在“loginoptions.data”上设置的值。

【问题讨论】:

  • 你可以只使用 jQuery.post 而不是 ajaxform 插件。这样您就可以更好地控制要发送的数据。
  • 我认为您不需要在客户端散列密码。对于 mtim-attacks,无论您发送明文密码还是仅发送哈希,都没有区别。在每种情况下,您都需要对密码服务器端进行散列和加盐。大多数情况下,无论如何使用现有的身份验证模块会更安全。
  • 我更喜欢使用 ajaxSubmit 函数,但是,如果没有办法这样做,我想我会把它改成 post 你说 Andbdrew。
  • @Christoph 我正在为每个表单请求生成一个盐 (csrf)。发送的密码是 hash(password)+hash(salt) 的结果,并且在每个请求中都不同。它仍然容易受到 MITM 攻击吗?
  • 是的。没有区别,攻击者要么获得密码要么获得哈希,因此他可以使用密码或哈希向服务器验证自己的身份。如果你真的很关心安全,你需要使用 SSL。如果不是,可以只发送密码并在服务器端执行所有安全操作(散列、超时等)。

标签: ajax jquery jqueryform


【解决方案1】:

根据克里斯蒂亚诺的回答,我能够让它发挥作用。如果您使用:beforeSubmit(),则不会发布更改的值,但如果您使用:beforeSerialize(),它会发布更改的值。

         $('#ff').ajaxForm({
            beforeSerialize:function(jqForm, options){
                var serializedForm = decodeURIComponent(jqForm.serialize());
                options.data = serializedForm.deserializeToObject();
                options.data.tPassword = MD5($("#tPassword").val())     
            },
            success:function(data){
               // do stuff
            }
         });

【讨论】:

  • 不记得那个方法了。我认为也许它可以在未来的版本中添加到插件中?
【解决方案2】:

如果你想这样做,那么我认为你可以使用回调函数beforeSubmit: function(contentArray, $form, options){}

  beforeSubmit: function(contentArray, $form, options){ 
    for(var i=0; i<contentArray.length; i++){
      if(contentArray[i].name == "password") {
        contentArray[i].value = ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass)))
      } 
    }
  }

【讨论】:

  • 它不起作用...如果我创建 contentArray 的 console.log,它会显示正常,但是当我看到请求时,它没有应用更改...现在只需显示未更改的密码。
  • 哦,试试检查修改,options.data而不是contentArray,可能行得通
  • 它也没有用...如果我制作“console.log(options.data);”它给了我“未定义”但是,如果我制作“console.log(options);”,我可以在 options.data 中看到一个序列化的字符串...
【解决方案3】:

似乎ajaxSubmit在表单上使用了jquery的serialize()函数,然后添加了额外的序列化数据。因此,如果我有一个名为“password”且值为“1234”的字段,然后尝试使用“loginoptions.data.password”将其更改为“abcd”,它将序列化所有内容并将“options.data”像这个:

"password=1234&field_2=value_2&password=abcd"

经过多次尝试,我放弃了使用ajaxSubmit函数,决定使用ajax函数提交表单:

var the_form=$('form#My_login_form');
loginoptions.url=the_form.attr("action");
loginoptions.type=the_form.attr("method");
var serializedForm=decodeURIComponent(the_form.serialize());
loginoptions.data=serializedForm.deserializeToObject();
var pass=$("#My_login_form_password").val();
    if (pass.length>0){
        loginoptions.data.password= ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass)));
    }
$.ajax(loginoptions);

这里是 deserializeToObject() 函数:

function deserializeToObject (){
    var result = {};
    this.replace(
        new RegExp("([^?=&]+)(=([^&]*))?", "g"),
        function($0, $1, $2, $3) { result[$1] = $3; }
    )
    return result;
}

String.prototype.deserializeToObject = deserializeToObject;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2015-04-07
    • 2017-05-05
    • 2015-08-06
    • 2012-02-06
    相关资源
    最近更新 更多