简体   繁体   English

ajax 与 beforeSend 但凭据隐藏

[英]ajax with beforeSend but credentials hidden

I have this ajax calls:我有这个ajax调用:

$(document).ready(function() {
    $.ajax({
        type: 'GET',
        beforeSend: beforeSend,
        url: someUrl

For beforeSend I got:对于beforeSend我得到:

const beforeSend = function ( xhr ) { xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( UserPass ) );};

With:和:

const Base64 = {_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};

const UserPass = 'SomeLogin:SomePass'

But this is not ok, I can't have the credentials 'SomeLogin:SomePass' there in my javascript.但这不行,我的 javascript 中没有凭据“SomeLogin:SomePass”。 How can I hide them or use them from PHP or something?如何隐藏它们或从 PHP 或其他东西中使用它们? I'm calling this ajax directly from a html page, I'm using Symfony.我直接从 html 页面调用这个 ajax,我使用的是 Symfony。 Some guy told me "Read it from a cookie" but I didn't get it how, which cookie.有人告诉我“从 cookie 中读取它”,但我不知道如何,哪个 cookie。

Cookies are files stored at the end of the client (in this case it is stored by the browser) and they contain important informations for the user about the website. Cookie 是存储在客户端末端的文件(在这种情况下由浏览器存储),它们包含用户有关网站的重要信息。 Hopefully a session id is inside the cookie.希望会话 ID 在 cookie 中。 A session id is a value which identifies a session.会话 ID 是标识会话的值。 A session is a concept which denotes the usage of a service (in this case the website) via a channel (in this case the browser).会话是一个概念,表示通过渠道(在本例中为浏览器)使用服务(在本例中为网站)。

You can get the cookie of a page via document.cookie (javascript code).您可以通过document.cookie (javascript 代码)获取页面的 cookie。 Run

console.log(document.cookie);

and you will see the value of your cookie for the given site in the browser console.并且您将在浏览器控制台中看到给定站点的 cookie 值。 A cookie can contain multiple values, so there are several libraries which aim to simplify your interactions with cookies.一个 cookie 可以包含多个值,因此有几个库旨在简化您与 cookie 的交互。

EDIT:编辑:

The idea is to use a session id, because in that case even if your session id is stolen, your username and password will still remain only in your possession.这个想法是使用会话 ID,因为在这种情况下,即使您的会话 ID 被盗,您的用户名和密码仍将只保留在您的手中。

If you really need to keep the credentials secret, not visibile by the browser you should not keep them in the browser.如果您确实需要将凭据保密,浏览器不可见,则不应将它们保存在浏览器中。 You could use your server as a proxy.您可以使用您的服务器作为代理。 Make an ajax call to your server and have the server make the authed called to the service.对您的服务器进行 ajax 调用,并让服务器对服务进行身份验证调用。

On the other hand if the credentials are specific to each user, you can use them as such, just make sure you are making HTTPS calls so nobody can see the request's body.另一方面,如果凭据特定于每个用户,您可以这样使用它们,只需确保您进行 HTTPS 调用,以便没有人可以看到请求的正文。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM