Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

manolegal

[Resolvido] Não permitir acessar/alterar

Recommended Posts

Olá amigos. Em um módulo de meu sistema, alguns usuários (dependendo do nível de permissão) poderão alterar somente os dados inseridos por ele, não podendo alterar dados digitados por outros usuários. O formulário que lista os dados inseridos pelo usuário para uma possível alteração está OK (está listando somente os dados inseridos por este usuário).

Quando da edição dos dados, direciono para a página de alteração da seguinte forma:

http://localhost/meu_form_editar.php?id=172

O problema é que se por exemplo o usuário digitar na URL este caminho e alterar o "id" no final (http://localhost/meu_form_editar.php?id=171), ele terá acesso para editar um dado que não foi digitado por ele e que não está autorizado a alterar. O que posso fazer para impedir esta situação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

crie um campo na tabela do aarquivo indicando qual usuario é "dono" e pode alterar

se houver a necessidade de mais usuarios no mesmo arquivo

crie uma tabela arquivo_usuario

usuario_id - arquivo _id

 

e verifique atraves dessa tabela se ele tem permissão para alterar esse arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade todos os usuarios tem acesso a este arquivo. Na verdade os usuarios com menor permissão terão somente acesso aos dados inseridos por eles. A consulta que lista os dados para edição é a seguinte:

$Sql = "SELECT ... FROM tabela WHERE usuario_efetuou_lancamento = '$login'";

Exempleficando, se retornar somente 01 registro (id "172" por exemplo), este usuario poderá alterar somente este registro. Porém se ele alterar o "id" na URL ele terá acesso a outros dados aos quais não poderia acessar.

 

Alguém teria alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teria algum código para bloquear na URL ou teria q alterar a consulta que lista os dados, verificando se este dado foi digitado pelo usuário?

 

Haveria alguma forma prática de resolver este problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá.

 

Na tabela onde ficam os dados, você deverá inserir também o ID do usuário que adicionou tal informação. Para isso crie um novo campo tipo: user_id.

 

na hora da edição, lá na sua condição você faz a verificação... na parte do login, se estiver mechendo com sessão, crie a sessão responsável por capturar o ID do usuário logado... você já deve está fazendo isso... Caso não esteja, faça.

 

Então em sua condição, faça a verificação do nível... se o usuário for do nível em que ele não pode editar as demais notícias, faça a query:

 

UPDATE tabela SET campo='valor' WHERE user_id = '{$_SESSION['id_user']}' AND nivel = 'nivel' AND id_dados = 'id'

 

A query acima diz: Atualize a tabela tal o campo tal com o valor tal, onde o id do usuário cadastrado for correspondente ao id do usuario logado, e o seu nivel for tal e o id da noticia for tal.

 

Deu pra tu entender mais ou menos ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Alaerte. Obrigado pela força.

Sim, estas verificações estou fazendo. Na consulta que LISTA os dados estou usando uma condição que se o nivel do usuario for o "menor" nivel, lista somente os dados inseridos por ele. Até aí tudo tranquilo.

O problema é no formulário que edita estes dados. Mando o "id" do dado a ser alterado da seguinte forma:

http://localhost/meu_form_editar.php?id=172

Imaginamos que o "id" "172" seja o único dado q possa ser alterado por determinado usuário. O sistema está listando normalmente somente este registro. O problema é q se o usuario digitar na URL o caminho e alterar somente o número/valor do "id" terá acesso ao dado, mesmo não sendo ele que tenha feito o lançamento.

Lembrando q todos os usuário tem acesso a esse formulário, independente do seu nivel de permissao, a unica diferença e que os niveis mais restritos alteram somente os dados inseridos por eles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o que eu te disse, a resposta ainda continua no meu post anterior... é só manter o ID do usuário e o nível dele em uma sessão e comparar no form de edição... se naquele dado não tiver aquele ID dele que ta session ele não vai editar. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alaerte.

Entendi o q você colocou. Se o usuário não tiver permissão, a edição não será realizada.

Eu queria saber se há como bloquear o acesso direto pela URL, pois por mais que eu não permita o usuário editar os dados se ele não tiver permissão, este usuário ao menos visialuzará os dados que foram digitados em um "id" que ele não possua permissão para visualizar, e isto eu que evitar.

Se o usuário digitar o caminho na URL com "id" a que ele não possua permissão para editar, quero que ele não possa visualizar os dados.

 

Me baseando no seguinte link http://forum.imasters.com.br/topic/263579-protegendo-o-arquivos-php-contra-acesso-direto/, implementei o seguinte código:

$pagina = $_SERVER['PHP_SELF'];
if (eregi($pagina, $_SERVER['SCRIPT_NAME'])){
   header ("Location:logout.php");
   exit;
}

O problema é q sempre q envio um "id" de um dado por GET para ser alterado ele está sendo direcionado, o q não deveria acontecer. Trabalho com frames.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. Se fizer da forma que eu te disse, ele não consegue nem visualizar. vamos fazer um exemplo prático. Vamos a seguinte situação.

 

tabela noticias.

 

id_noticia | id_usuario | noticia

  200          20        bla bla
  201          21        bla bla

-----------------------------------

 

tabela do usuário.

 

id_user | nivel_user | login_user | senha_user
 20           2            teste       teste
 21           2            teste2      teste2

---------------------------------------------

 

Então na hora do login vejamos o seguinte:

 

<?php 

...
session_start();

//Select do login e tal...
$busca_user = mysql_query("...");

$dados = mysql_fetch_array($busca_user);

$_SESSION['id']    = $dados['id_user']; 
$_SESSION['login'] = $dados['login_user'];
$_SESSION['nivel'] = $dados['nivel_user'];

header("Location: list.php");
?>

 

Então, deu pra entender né... é bem simples, só pra ilustrar.

 

Vamos a página list.php que terá nada mais que o link para a página de edição.

 

vejamos o seguinte, perceba que o nivel e o login do usuario está na sessao.

 

Todos os 2 usuários na tabela possuem o mesmo grau de permissão, um não pode ver nem editar a notícia que o outro escreveu.

 

list.php

<?php 
session_start();

//se o nivel for 2, em que ele só pode ver e editar a dele, façamos a seguinte query
if($_SESSION['nivel'] == 2)
{

$busca_noticias = mysql_query("SELECT * FROM noticias WHERE id_usuario = '{$_SESSION['id']}'");

//se o nivel for 1, em que ele pode ver e editar qualquer uma, façamos a seguinte query
}elseif($_SESSION['nivel'] == 1){

$busca_noticias = mysql_query("SELECT * FROM noticias");

}

...

print '<a href="editar.php?idn='.$var['id_noticia'].'">'.$var['noticia'].'</a>';
?>

 

Perceba que aí não tem jeito, ele só vê a que ele postou, se o nível for 2.

 

Agora vamos a página editar.php onde faremos a proteção que você quer.

 

editar.php

<?php
session_start();

$Id = $_GET['id'];

$busca_noticia = mysql_query("SELECT * FROM noticias WHERE id_noticia = '$Id'");

$dados = mysql_fetch_array($busca_noticia);

if($_SESSION['nivel'] == 2 AND $dados['id_usuario'] != $_SESSION['id'])
{
print '<script>alert("Você não tem permissão para editar essa noticia."); window.location.href=("list.php");</script>';
}else{

...

}
?>

 

Entendeu ? eu fiz de maneira aberta e visivelmente simples para que você possa entender como funciona, mesmo que o usuário digite no navegador editar.php?id=200 ele não poderá visualizar se a notícia não for dele, de acordo com o seu nivel. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blza Alaerte. Obrigado pela sua disponibilidade em ajudar.

Consegui implementar perfeitamente esta questão para evitar que o usuário altere algum dado que ele não possua permissão, ao alterar o id do lançamento.

O q eu gostaria ainda era evitar que o usuário logado acessasse diretamente o formulário digitando o caminho do formulário. Por exemplo nesta situação exposta por você, o usuário de nível 1 pode alterar qualquer notícia. Como faço para evitar q ele acesse diretamente a notícia digitando o caminho, como por exemplo: http://localhost/meu_form_editar.php?id=172. Queria q ele acessasse a notícia somente pelo form de pesquisa das notícias clicando em "Editar": <td><a href='meu_form_alterar_editar.php?id=$id'>Editar</a></td> que direciona para o form de edição enviando via GET o id.

Trabalho com frames e na URL sempre aparece http://localhost/index.php.

Tentei da seguinte forma, mas ele bloqueia sempre o acesso ao formulário, mesmo fazendo o procedimento da maneira correta.

$pagina = $_SERVER['PHP_SELF'];
if (eregi($pagina, $_SERVER['SCRIPT_NAME'])){
   header ("Location:logout.php");
   exit;
}

Qual seria a solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja o seguinte:

 

$pagina="meu_form_alterar_editar.php"; //o nome da minha página que contem os dados de conexao.
if(basename($_SERVER["PHP_SELF"])=="$pagina"){

die("<script>alert('Sem permissao de acesso !');
</script>
\n
<script>window.location=('logout.php')</script>");

}

 

Acho que precisa ainda fazer umas implementações. isso vai bloquear tanto direto quanto indiretamente, como o seu. veja aí

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente. Bloqueou direto e indiretamente. Infelizmente não tenho idéia de como resolver este problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

BOm, essa função eu fiz algum tempo atras neste tópico sobre segurança:

 

http://forum.imasters.com.br/topic/263579-protegendo-o-arquivos-php-contra-acesso-direto/

 

Você pode utilizar essa aqui feita pelo William Bruno.

 

<?php
       $pagina = __FILE__; //constante para pegar o nome do arquivo
       //echo $pagina; // C:\Apache2.2\htdocs\teste.php

       $p = explode('\\', $pagina); // por causa do que foi retornado

       $arq = $p[count($p)-1]; //pegando a última posição do array, que é então o nome do arquivo
       if( basename($_SERVER["PHP_SELF"]) == $arq )
       {
               exit( Header('Location: index.php') );

       }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando o código do William está ocorrendo o mesmo problema, direcionando para a página index.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo. Acho o seguinte: Já que você trabalha com o método get, acho que não faria sentido você bloquear o acesso via URL, pois esse é um dos objetivos do método GET... fácil acesso ao registro, além de poder salvar em favoritos, não acha ?! não vejo porque você bloquear isso, uma vez que você já tratou da segurança.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blza então Alaerte. Obrigado pela ajuda. Um grande abraço. Tópico encerrado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, só complementando... Deixe por parte do usuário, deixe que ele escolha como utilizar o sistema para acesso tal registro, é interessante. Por exemplo eu acho muito ágil quando preciso entrar em um registro e já tenho a URL dele salva... isso alivia muito o camarada, principalmente se ele estiver abafado na hora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.