Usando privilégios expandidos em navegadores Mozilla
16/11/2006 por Leandro Mercês Xavier
Navegadores Mozilla dispõem de funções para segurança em Javascript similares às usadas para segurança em Java e Javascript no Netscape Communicator 4.x.
Em casos mais simples, o código pede permissão para habilitar o privilégio que possibilita o acesso ao alvo através de scripts. Por exemplo:
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
//ou:
netscape.security.PrivilegeManager.enablePrivilege("UniversalPreferencesRead UniversalFileRead");
Quando este método é invocado, se a assinatura for válida (caso seja um script assinado) ou codebase principal esteja habilitado, os privilégios expandidos são concedidos. Caso o acesso não seja por meio de uma destas formas, por exemplo, utilizando um arquivo local através da url file://, será exibida uma caixa de diálogo perguntando se o usuário permite que o script use estes privilégios e também se deseja memorizar esta decisão. Note que no segundo exemplo o script solicita dois privilégios, porém exibe apenas uma caixa de diálogo descrevendo-os.
Os privilégios são concedidos apenas no escopo da função que os solicitou. Este escopo inclui as funções chamadas por esta função. Quando a função termina, os privilégios não são mais aplicáveis.
Exemplo
A função b solicita privilégios expandidos, e somente comandos e funções chamados no escopo da mesma após a solicitação têm privilégios concedidos. É uma boa prática habilitar privilégios somente quando necessário, e após o uso desabilitá-los. Isso ajuda a proteger o computador do usuário de seções perigosas no código.
function mostraPrivilegios(i) {
try{
if (history[0] != "") {
document.write(i + ": habilitado<br>");
}
} catch (e) {
document.write(i + ": desabilitado<br>");
}
}
function a() {
mostraPrivilegios(5);
}
function b() {
mostraPrivilegios(3);
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
mostraPrivilegios(4);
a();
mostraPrivilegios(6);
}
function c() {
mostraPrivilegios(2);
b();
mostraPrivilegios(7);
}
mostraPrivilegios(1);
c();
mostraPrivilegios(8);
Este exemplo exibe o seguinte resultado:
1: desabilitado
2: desabilitado
3: desabilitado
4: habilitado
5: habilitado
6: habilitado
7: desabilitado
8: desabilitado
Privilégios
- UniversalBrowserRead
- Leitura de dados sensíveis do browser. Isto permite que o certificado passe a verificação da mesma origem ao ler de qualquer documento.
- UniversalBrowserWrite
- Modificação de dados sensíveis do browser. Isto permite que o certificado passe a verificação da mesma origem ao escrever em qualquer documento.
- UniversalXPConnect
- Acesso irrestrito às APIs do browser usando XPConnect.
- UniversalPreferencesRead
- Ler preferências usando o método
navigator.preference. - UniversalPreferencesWrite
- Ajustar preferências usando o método
navigator.preference. - CapabilityPreferencesAccess
- Ler e ajustar as preferências que definem políticas de segurança, incluindo que privilégios foram concedidos e negados aos scripts. Você também necessita de
UniversalPreferencesReadeUniversalPreferencesWrite. - UniversalFileRead
- Uso do método
window.opencom URLsfile://e permite que o browser faça upload de arquivos usando<input type="file">.
Nota: Este artigo, bem como seu exemplo, foi baseado no artigo Signed Scripts in Mozilla, porém, conta com atualizações para conformidade no uso de navegadores atuais.
publicado em
16/11/06 às 13:05
Como deu pra ver aí, podemos liberar acesso pra escrever preferências do navegador.
Então poderiamos por exemplo ativar o uso de cookies caso estivesse desabilitado?
Depois fala mais sobre esse assunto utilizando exemplos práticos para que fique mais claro as possibilidades que este recurso abre ao desenvolvedor.
Muito bom o artigo, tá de parabéns!
20/11/06 às 14:24
Olá Diego, podemos sim habilitar ou não o uso de cookies no navegador através das interfaces nsIPrefService, nsIPrefBranch e nsIPrefBranch2.
Mas isso certamente renderá mais assunto. Vou preparar algum material, porém com foco nos conceitos.
Obrigado!
20/11/06 às 23:05
ola como bloquear uma pagina no firefox
2/12/06 às 4:09
Olá Leandro,
No inicio da semana vc queria saber oq eu achava do seu Blog…Foi uma semana cheia. Então vou postar aqui.
Seu blog é muito bonito, clean …
atende ao q se propôe e muito bem estruturado.
Não precisa se preocupar com layout…este tá showww!!
abraços
16/10/07 às 23:45
ola,
existiria uma forma de perguntar ao usuario para habilitar os privilegios para o site sem que o mesmo tivesse uma assinatura válida!?
obrigado
20/10/07 às 14:35
Olá Gustavo, sem a assinatura válida não é possível. Entretanto, dependendo da finalidade do seu código (caso seja uma aplicação, por exemplo), você pode registrar seu script no chrome e executá-lo com as permissões. A maneira mais usada para a execução de códigos com privilégios, hoje, é através das extensões.