javascript - seguridad - Mensajería de extensión de Safari
seguridad de safari (2)
Puede acceder a la página global con
const myGlobal = safari.extension.globalPage.contentWindow;
alert (myGlobal.my_variable);
He estado trabajando en una extensión de Safari y he chocado contra una pared. No puedo entender cómo enviar múltiples líneas de datos desde global a la inyección. He estado buscando por un tiempo en este sitio y en otros, y solo he encontrado fragmentos, pero cuando se combinan fallan.
Aquí está lo que necesito para salir de Global
safari.extension.secureSettings.username;
safari.extension.secureSettings.password;
Intenté ponerlos en variables globales pero la inyección no los ve.
inyectar código
document.getElementById(''local_login'').style.display='''';
document.getElementById(''local_login_link'').style.display = ''none'';
document.loginForm.username.value = /*Safari Secure Settings Username*/
document.loginForm.password.value = /*Safari Secure Settings Password*/
document.getElementById(''localsubmit'').click();
Probé el código de la documentación de Apple, pero no se ejecutará el código de inyección.
Editar Esto es lo que tengo hasta ahora. No estoy seguro de por qué no está recibiendo o enviando.
Global.html
function sendCred() {
myUsername = safari.extension.secureSettings.username;
myPassword = safari.extension.secureSettings.password;
var arrayNSA = [myUsername, myPassword];
safari.self.tab.dispatchMessage("nsaArray", arrayNSA);
}
safari.application.addEventListener("messageFromNSA", sendCred, false);
Inject.js
function showForm() {
document.getElementById(''local_login'').style.display='''';
document.getElementById(''local_login_link'').style.display = ''none'';
document.loginForm.username.value = myNSAusername;
document.loginForm.password.value = myNSApassword;
document.getElementById(''localsubmit'').click();
}
function recieveCred(msgEvent) {
var nsaMessageName = msgEvent.name;
var nsaMessageData = msgEvent.message;
if (nsaMessageName === "nsaArray") {
var myNSAusername = nsaMessageData[0];
var myNSApassword = nsaMessageData[1];
showForm();
}
}
function disbatchData() {
var nflksnfll = "Give me my data";
}
safari.self.addEventListener("nsaArray", recieveCred, false);
safari.self.tab.dispatchMessage("msgFromNSA", disbatchData);
Hay algunos problemas con sus scripts.
En tu script global:
- Necesita registrar el oyente del evento en el evento "mensaje"; "messageFromNSA" no es un tipo de evento válido. Además, debe usar
safari.application.addEventListener
lugar desafari.self.addEventListener
. - En la función
sendCred()
, cambiesafari.self.tab.dispatchMessage
porevent.target.page.dispatchMessage
, porque desea enviar el mensaje a la página que envió la solicitud.event.target
es la pestaña que envió el mensaje;page
es el proxy para el documento en esa pestaña.safari.self.tab
solo funciona dentro de scripts inyectados.
En tu script inyectado:
- De nuevo, el oyente del evento debe registrarse en "mensaje", no en "nsaArray".
- En función
recieveCred(msgEvent)
, ha definidomyNSAusername
ymyNSApassword
como variables locales, por lo que la funciónshowForm()
no puede verlas. Elimine la palabra clavevar
para convertirlos en variables globales.
Aquí hay scripts revisados globales e inyectados que deberían funcionar, con comentarios adicionales.
Guión global:
function handleMessage(event) {
// use a switch statement and a more generic function name
// so you can use it to handle other messages in the future
switch (event.name) {
case ''sendNsaArray'': {
// I changed the name of the message sent from the
// injected script to ''sendNsaArray''
var myUsername = safari.extension.secureSettings.username;
var myPassword = safari.extension.secureSettings.password;
var arrayNSA = [myUsername, myPassword];
event.target.page.dispatchMessage(''nsaArray'', arrayNSA);
break;
}
}
}
safari.application.addEventListener("message", handleMessage, false);
Guión inyectado:
function showForm(username, password) {
// why not pass the values to this function instead of using globals
document.getElementById(''local_login'').style.display = '''';
document.getElementById(''local_login_link'').style.display = ''none'';
document.loginForm.username.value = username;
document.loginForm.password.value = password;
document.getElementById(''localsubmit'').click();
}
function handleMessage(event) {
// again using a more generic function name
switch (event.name) {
case ''nsaArray'': {
showForm(event.message[0], event.message[1]);
// passing the username and password to showForm()
// instead of storing them in global variables
break;
}
}
}
if (window === window.top) {
// this conditional prevents the injected script from
// working inside iframes
safari.self.addEventListener(''message'', handleMessage, false);
safari.self.tab.dispatchMessage(''sendNsaArray'');
// not necessary to send any data with this message
}