2017-10-23 2 views
0

長い研究の後、私の最初の質問をStackoverflowに投稿します。フォーム入力を保存してJSONをクッキーに保存しますが、パスワードを除外します

私はフォームを持っており、入力をクッキーのJSON文字列に格納したいと考えています。 これまでのスクリプトでうまくいきます。しかし、セキュリティ上の理由から私はパスワードを除外したいと思います。

これを達成する方法を知っている専門家はいますか?

<script src="js.cookie.js"></script> //source: https://github.com/js-cookie/js-cookie 

<script> 
(function ($) { 
    $.fn.serializeJSON = function() { 
     var json = {}; 
     jQuery.map($(this).serializeArray(), function (n, _) { 
      json[n['name']] = n['value']; 
     }); 
     return json; 
    }; 
})(jQuery); 

ensureNumber = function (n) { 
    n = parseInt(n, 10); 
    if (isNaN(n) || n <= 0) { 
     n = 0; 
    } 
    return n; 
}; 


saveFormToCookie = function (form) { 
    var name = $(form).attr('id'); 
    var data = $(form).serializeJSON(); 
    Cookies.set(name, data, {expires: 1}); 

}; 

loadFormFromCookie = function (form) { 
    var name = $(form).attr('id'); 
    var data = Cookies.get(name); 

    if (typeof data === 'undefined') { 
     return; 
    } 

    JSON.parse(data, function (key, value) { 
     if (typeof (value) !== 'object') { 
      var el = $(form).find('*[name="' + key + '"]'); 

      if (el.is('input')) { 
       if (false) { 
        // code formatting stub 
       } else if (el.attr('type') === 'number') { 
        el.val(ensureNumber(value)); 
       } else if (el.attr('type') === 'checkbox') { 
        if (el.val() === value) $(el).prop('checked', true); 
       } else if (el.attr('type') === 'radio') { 
        $.each(el, function (_, elc) { 
         if (elc.value === value) $(elc).prop('checked', true); 
        }); 
       } else { 
        el.val(value); 
       } 
      } else if (el.is('select')) { 
       el.val(value); 
      } else if (el.is('textarea')) { 
       el.val(value); 
      } 
     } 
    }); 
}; 
</script> //source: https://gist.github.com/themactep/2714798 

EDIT:

これに加えて、私は1つが、むしろ、ユーザーの入力データを格納するためにPHPのセッションを使用する必要がある理由を説明感謝しています。

+0

$ _SESSION []は、サーバー側になります(クライアントメモリではなくサーバーメモリに格納されるため)、クライアントコンピュータにデータが格納されません。しかし、その欠点は、ユーザーがサイトを終了すると$ _SESSION []データが失われることです。データベースとそれに類するものを経由する方法もありますが。 –

答えて

0

最も単純な方法は、パスワード値をキャッシュし、パスワードフィールドsaveFormToCookieをクリアし、必要に応じてパスワードを再入力することです。

JavascriptをjsFiddler

(function ($) { 
    $.fn.serializeJSON = function() { 
     var json = {}; 
     jQuery.map($(this).serializeArray(), function (n, _) { 
      json[n['name']] = n['value']; 
     }); 
     return json; 
    }; 
})(jQuery); 

$(document).ready(function(){ 
    $("#btnSubmit").click(function(event){ 
      // Prevents the button from submitting the form 
      event.preventDefault(); 

      var txtPassword = $("#txtPassword"); 
      var frmLogin = $("#frmLogin"); 

      //cache Password 
      var cachedPassword = txtPassword.val(); 

      //Clear Password 
      txtPassword.val(""); 

      // Save to cookie 
      saveFormToCookie(frmLogin); 

      // repopulate 
      txtPassword.val(cachedPassword);  

      // To submit form as normal 
      // use frmLogin.sumbit(); 
      // instead of $("#btnClear").click(); 
      $("#btnClear").click(); 
     }); 

     $("#btnClear").click(function(event){ 
      event.preventDefault(); 

      $(this).closest('form').find("input[type=text], input[type=password]").val(""); 
     }); 

     $("#btnLoad").click(function(event){ 
      event.preventDefault(); 

      loadFormFromCookie($("#frmLogin")); 
     }); 
}); 

ensureNumber = function (n) { 
    n = parseInt(n, 10); 
    if (isNaN(n) || n <= 0) { 
     n = 0; 
    } 
    return n; 
}; 


saveFormToCookie = function (form) { 
    var name = $(form).attr('id'); 
    var data = $(form).serializeJSON(); 
    Cookies.set(name, data, {expires: 1}); 
}; 

loadFormFromCookie = function (form) { 
    var name = $(form).attr('id'); 
    var data = Cookies.get(name); 

    if (typeof data === 'undefined') { 
     return; 
    } 

    JSON.parse(data, function (key, value) { 
     if (typeof (value) !== 'object') { 
      var el = $(form).find('*[name="' + key + '"]'); 

      if (el.is('input')) { 
       if (false) { 
       // code formatting stub 
       } else if (el.attr('type') === 'number') { 
        el.val(ensureNumber(value)); 
       } else if (el.attr('type') === 'checkbox') { 
        if (el.val() === value) $(el).prop('checked', true); 
       } else if (el.attr('type') === 'radio') { 
        $.each(el, function (_, elc) { 
         if (elc.value === value) $(elc).prop('checked', true); 
        }); 
       } else { 
        el.val(value); 
       } 
      } else if (el.is('select')) { 
       el.val(value); 
      } else if (el.is('textarea')) { 
       el.val(value); 
      } 
     } 
    }); 
}; 

HTML

<form id="frmLogin" action=""> 
    <label for="txtUser">Username: </label><input id="txtUser" type="text" name="user"><br> 
    <label for="txtPassword">Password: </label><input id="txtPassword" type="password" name="password"><br> 
<br> 
    <input id="btnSubmit" type="submit" value="Submit"> 
    <input id="btnClear" type="button" value="Clear"> 
    <input id="btnLoad" type="button" value="Load from cookie"> 
</form> 

CSS

label { 
    display: block; 
} 

更新jsFiddler

あなたはちょうどそれはちょうどあなたがしていたsaveFormToCookie機能を置き換えるバックグラウンドで発生する場合:

saveFormToCookie = function (form) { 
    var name = $(form).attr('id'); 
    var formCopy = $(form).clone(); 

    // remove password fields from copy 
    formCopy.children("input[type='password']").remove(); 

    // serialize copy 
    var data = formCopy.serializeJSON(); 
    Cookies.set(name, data, {expires: 1}); 
}; 
+0

ありがとう@ニック・コルドバ。これは我々が取ることができる1つの道のように見える。私は多分jsonが作成されたときにタイプパスワードの入力を除外することを考えていました。 'jQuery.map($(この).serializeArray()、関数(N、_のようなもの){ ない場合、入力タイプPASSWORD: JSON [N [ '名前'] = N [ '値']; }); ' あなたのアプローチではまだjsonに文字列:passwordがあります。 : -/ –

+0

返信内容を更新したsaveFormToCookie関数で更新しました。私はあなたの現在のものと置き換えるだけでそのトリックをやると思います。 –

+0

残念ながらそれはうまくいきませんでした: 私のコンソールは、パスワードが.remove();に関係なく保存されることを示しています。 '%22パスワード22:%221234%22%2C%22username%22:%...' –

関連する問題