Manipular janelas chrome via HTML

Iniciado por BrunoPOG, 15 de Julho de 2013, 19:34

tópico anterior - próximo tópico

BrunoPOG

Boa noite,

Pessoal, estou desenvolvendo uma aplicação em PHP, mas o sistema não pode permitir que o usuário altere o endereço da página, ou seja, o usuário só poderá navegar utilizando os links que o sistema oferece.
Para isso, a melhor opção de janela que eu vi, foi a janela do google chrome que não oferece abas.

Qual o código para essa configuração em HTML?
Se houver como fazer isso em Javascript ou alguma outra maneira, podem mandar ai que eu verifico aqui.
Ubuntu 13.04 | Intel® Core™i5-2450M CPU @ 2.50GHz x 4 |  Intel® Sandbridge Mobile | 3,8 GiB | 64-bit | 734,1 GB | DELL Vostro 3550.
A diferença entre o Bill Gates e o Batman é que o Batman consegue derrotar o Pinguim.

irtigor

Isso está simplesmente errado, em vários níveis. Explique o problema, se for por "segurança", bom... desista, é melhor não ficar com a falsa sensação de que esconder te traz alguma.

BrunoPOG

Citação de: irtigor online 15 de Julho de 2013, 22:37
Isso está simplesmente errado, em vários níveis. Explique o problema, se for por "segurança", bom... desista, é melhor não ficar com a falsa sensação de que esconder te traz alguma.

Bom, eu só quero poder escolher o tipo de janela em que a minha aplicação será apresentada.
Já vi muitas dessas janelas dentre as inúmeras páginas que acesso por dia na internet.
Agora mesmo estou entrando no meu curso de inglês online, e estou navegando dentro de uma janela que não possui abas.
Ubuntu 13.04 | Intel® Core™i5-2450M CPU @ 2.50GHz x 4 |  Intel® Sandbridge Mobile | 3,8 GiB | 64-bit | 734,1 GB | DELL Vostro 3550.
A diferença entre o Bill Gates e o Batman é que o Batman consegue derrotar o Pinguim.

Solid One

#3
Bom, para abrir uma janela sem barra de endereço, você pode fazer isso simplesmente com o comando JavaScript:


<script>
window.open('pagina.php','','toolbar=no');
</script>


No entanto, caso você queira impedir que o usuário altere o endereço da página, mas sem remover a barra de endereços nem criar uma janela, creio que isso seja algo impossível. Isso aí é uma norma de segurança no lado do cliente (navegador do usuário), e não tem como mudar esse comportamento. E mesmo que você tente criar uma janela sem barra de endereço editável através do comando JavaScript "window.open", uma série de coisas podem não funcionar como deveria.

Existe formas melhores de você fazer isso. Eu conheço duas: uma mais fácil, outra mais difícil (porém ideal).

A mais fácil é você usar uma técnica HTML chamada "URL Masking" (Mascaramento de URL). É uma técnica bem simples, onde ao invés de você acessar diretamente a página inicial da sua aplicação PHP, você cria uma página precursora a esta, que por sua vez carrega a página inicial através de frames de HTML (tag <iframe> ou <frameset>). Desse modo, se você acessar o seu sistema a partir da página precursora com frames, você poderá navegar no seu sistema à vontade, que a barra de endereço sempre prevalecerá a mesma da página precursora. O usuário poderá até editar a barra de endereço, mas ele não verá o nome das páginas PHP na sua aplicação. O usuário não verá na barra de endereço um determinado acesso assim: "http://www.suaaplicacaophp.com.br/usuario_remover.php?id=3&confirma=true", mas ao invés disso ele verá simplesmente "http://www.suaaplicacaophp.com.br".

Aqui você encontra instruções de como reproduzir essa técnica: http://www.willmaster.com/library/web-development/URL-masking.php. Já trabalhei com vários sistemas PHP que utilizam esta técnica, e é exatamente como esse tutorial ensina que o URL Masking funciona.

Mas usar essa técnica tem prós e contras:

  • Essa técnica não é 100% funcional. Qualquer página na sua aplicação que for aberta em uma nova aba, esta estará fora dos limites do frame, consequentemente sendo exibido tudo na barra de endereço. O mesmo vale para páginas abertas em uma nova janela através do comando JavaScript "window.open". A propósito, se você tentar atualizar a página pressionando F5, a página que é atualizada não é a do frame, e sim a da página principal, ou seja, a precursora. Em outras palavras, ao atualizar a página, você voltará para a página inicial do sistema, tendo que se logar novamente;
  • Muitos desenvolvedores Web consideram esta uma má prática de programação, e inclusive acho que a W3C considera isto inválido em suas validações;
  • Se sua aplicação for um site acessível abertamente por qualquer usuário sem credenciais, bots e motores de busca da Google não conseguirão acessar sua aplicação para obter informações que possibilitem sua página ser acessível a partir de buscas no Google por exemplo. Essa técnica é ideal para aplicações fechadas.

A mais difícil é você usar de Ajax para realizar algumas operações sensíveis ao sistema (como alterações em banco de dados, visto que requisições Ajax por padrão não são salvas no histórico do navegador do usuário). Para isso, imagine o seguinte cenário - A sua aplicação PHP possui páginas que fazem inserção, alteração e remoção de informações em um banco de dados, e dentre as várias páginas da aplicação, você possui quatro páginas descritas da seguinte forma:


  • "usuario_lista.php" para listar usuarios do sistema;
  • "usuario_inserir.php" para inserir;
  • "usuario_editar.php" para editar;
  • "usuario_remover.php" para remover.

Na página de listagem, os usuários são listados em uma tabela HTML, onde a última célula de cada linha contém botões que realizam ações de editar e remover, e quando você clica em remover, você é perguntado se quer remover ou não (através do comando JavaScript "confirm"), e se confirmar, é redirecionado para o seguinte endereço: "usuario_remover.php?id=2", que por sua vez fará a remoção do usuário e em seguida redirecionará você de volta para "usuario_lista.php", tudo isso de forma totalmente síncrona, sem Ajax em momento nenhum.

Até aí tudo bem. Funcionando de boa na lagoa, sem nenhum imprevisto. Mas digamos que você vá em "usuario_lista.php", remova um usuário indo para "usuario_remover.php?id=2", seja redirecionado de volta para "usuario_lista.php", e em seguida você clicar no botão "Voltar" do navegador. Ao clicar nesse botão (ou usar do atalho Alt + Seta Esquerda), o navegador volta para "usuario_remover.php?id=2" e tenta fazer a remoção de novo, o que abre brecha para vários bugs na aplicação e possíveis problemas de segurança. Nesse contexto, é muito difícil que isso afete o banco (visto que ele está tentando remover algo que já foi removido), mas caso em uma única página você faça inúmeras verificações antes de remover, ou mesmo faz várias remoções de linhas do banco em transações SQL, isso aí pode acabar apagando informação que não devia.

E esse é o menor dos problemas que você enfrenta ao realizar operações de remoção desta forma. Isso aí também é extremamente vulnerável a ataques de SQL Injection, visto que a página "usuario_remover.php?id=2" manda para o servidor a variável "id" de valor "2" via método GET, e que o servidor possivelmente pega a variável do jeito que está e concatena em uma string contendo uma consulta SQL assim:

"DELETE FROM usuarios WHERE id = {VARIÁVEL ID}"

que, por sua vez, um usuário malicioso pode simplesmente editar a URL dessa forma: "usuario_lista.php?id=2%20or%201=1", mudando a consulta acima para:

"DELETE FROM usuarios WHERE id = 2 or 1=1"

E o que essa consulta SQL vai fazer? Simplesmente remover TODOS os usuários do banco de dados da sua aplicação.

Mais informações sobre SQL Injection você encontra aqui: http://en.wikipedia.org/wiki/SQL_injection

Tá, beleza, me convenceu. Mas onde o Ajax entra nisso? Simples: Requisições Ajax por padrão não são inclusas no histórico. Se você fizer a página "usuario_remover.php" ser acessível via Ajax, e receber argumentos em método POST ao invés de GET, as chances disso ocorrer diminuem bastante, e de fato é isso que vários sites, sistemas Web e redes sociais como Facebook fazem hoje em dia (quando você redige um comentário no Facebook, o mesmo é inserido via Ajax quando você o envia ao servidor). É a solução ideal, porém é um pouco difícil e pode requerer uma certa curva de aprendizado para uso. Mas de todo modo, caso você utilize jQuery na sua aplicação, você pode fazer isso da seguinte forma:


<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8">
     <script type="text/javascript" src="jquery.js"></script>
  </head>
  <body>
     <button type="button" onclick="removerUsuario(2)">Chamar página via Ajax</button>
     <div id="mostrar_resultado_aqui"></div>
     <script type="text/javascript">
        function removerUsuario(id_usuario){
           $.ajax({
              url: "usuario_remover.php", // Página a ser carregada via Ajax
              type: "POST", // Método de envio, que você pode escolher entre GET e POST
              timeout: 60*1000, // Expira requisição se demorar mais que 60 segundos
              data: {
                 "id": id_usuario,
                 "segunda_variavel": "valor_qualquer"
              }, // Variáveis a serem enviadas via POST
              error: function(requisicao, mensagem_erro){
                 alert("Erro ao enviar! A mensagem de erro será exibida abaixo do botão clicado!");
                 $("#mostrar_resultado_aqui").html(mensagem_erro);
              },
              success: function(resposta){
                 alert("Envio realizado com sucesso! Os dados de resposta serão exibidos abaixo do botão clicado!");
                 $("#mostrar_resultado_aqui").html(resposta);
              }
           })
        }
     </script>
  </body>
</html>


Essa é uma das formas de utilizar jQuery para isso. Mais informações você encontra aqui: http://api.jquery.com/jQuery.ajax/

isaelfm

Porque você não tenta via post? é uma boa forma de esconder links, veja:

<?phpif($_POST) // Verifica o envio de dados via post{$pg = $_POST['pg']; // pega o valor do input com o nome: name, e adiciona a variavel pginclude("$pg"); // inclui a pagina que está na variavel pg}?>

<form action="" method="post">
<input type="submit" name="pg" value="Pagina.php" />
<input type="submit" name="pg" value="pagina2.php" />
</form>

Fiz meio correndo mas testei e funciona, você pode usar outros elementos tipo um daqueles botões com imagem, dai é só usar a inteligência. Este seria o melhor caminho, visto que não seriam exibido os links.

Solid One

Citação de: isaelfm online 17 de Julho de 2013, 09:56
Porque você não tenta via post? é uma boa forma de esconder links, veja:

<?phpif($_POST) // Verifica o envio de dados via post{$pg = $_POST['pg']; // pega o valor do input com o nome: name, e adiciona a variavel pginclude("$pg"); // inclui a pagina que está na variavel pg}?>

<form action="" method="post">
<input type="submit" name="pg" value="Pagina.php" />
<input type="submit" name="pg" value="pagina2.php" />
</form>

Fiz meio correndo mas testei e funciona, você pode usar outros elementos tipo um daqueles botões com imagem, dai é só usar a inteligência. Este seria o melhor caminho, visto que não seriam exibido os links.

Nesse exemplo, de fato os links não seriam exibidos devido ao fato de argumentos POST serem enviados de forma oculta e sem limitação de tamanho. No entanto, a problemática do histórico que mencionei ainda prevalece nesse exemplo. A única diferença é que, caso você clique em "Voltar" no navegador e for redirecionado para esta mesma página com os argumentos POST enviados a partir do formulário, o navegador solicitará para enviar novamente as informações, por questões de segurança e integridade das informações.

isaelfm

É, oque ele poderia fazer para ocultar os links de forma "mais segura" seria isto, de outra forma sempre vai ser possível "dar uma burlada" no sistema e conseguir ver a url. Por javascript por exemplo se desativar o JS no navegador todo o trabalho fica inútil  :-\

PS: se ele trocar o $_POST pelo $_GET e fizer tipo:
link = pagina.php?pg=home
e fazer um include de acordo com o valor da variavel recebida:

<?phpif($_GET['pg'] == "home"){include("home.php");}?>


É um exemplo simples, só pra mostrar como funcionaria, um jeito melhor seria colocar o nome das páginas num array.  :P