Ir para conteúdo

Arquivado

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

henrique-rafael

proteger função de chamada externa

Recommended Posts

Uma função que eu criei pode ser acessada diretamente e externamente? Se sim, como faço para impedir isso.

 

por exemplo:

tenho uma função, aonde eu uso o mysqli e trato as variáveis adequadamente, de forma segura.

function insere_dados_no_mysql($recebe_dados_para_inserção){
    # a função não pode ser chamada diretamente, apenas a página aonde ela está pode ser invocada
}

Minha preocupação é a seguinte:

-Se alguém for capaz de invocar essa função diretamente por chamada externa como por exemplo "javascript ajax", essa pessoa pode simplesmente inserir dados na minha base de dados, sem estar autenticado.

-Eu procurei sobre o assunto em sites de busca, mas não encontrei nada específico sobre isso, por isso gostaria de uma ajuda aqui do fórum, se alguém puder me dizer se essa chamada é possível, ou se o PHP nativamente impede esse tipo de chamada em função da segurança, etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu desconfio que com Headers você consiga definir esse tipo de regra com eficiência, mas eu ainda to estudando sobre eles e não posso te afirmar com 100% de certeza, mas pra evitar isso depende de como você ta fazendo essa inserção e a transação dos dados, exemplo:

Vamos supor que você possui um form na página (form.php) e que esse form vai ter um action="" em outra página:

<form method="post" action="acao-em-outra-pagina.php">
  [...inputs...]
</form>

Em acao-em-outra-pagina.php você faz assim:

<?php
if(isset($_SERVER['HTTP_REFERER'])){
  
  $pega_ref = $_SERVER['HTTP_REFERER'];

  if($pega_ref == "http://seusite.com/form.php"){
      echo "permitido";
  } else {
      echo "opaaaaa, peraí rapaiz, ta meio perdido aí."; 
      // faz um log
  }
}
?>

Pra dificultar mais você pode colocar uns cookie, umas sessions, uns tokens com X tempo, token que atualiza à cada navegação e à cada inserção.

 

Importante lembrar que HTTP_REFERER não é tão eficiente e se a pessoa má intencionada desconfiar ou acertar no chute que você ta usando ref pra validar as inserções ela pode burlar isso, mas já é um ponto inicial pra bolar uma ideia mais eficiente de acordo com a sua necessidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É impossível chamar, de forma externa, uma função diretamente do PHP. Entretanto, é possível executar/requisitar de forma indireta, que é o caso de acesso a URL e WebServices.

 

Se, de alguma forma, você utiliza a função ao acessar uma URL e essa URL não está protegida por autenticação ou até um básico request_referrer, a sua função será executada externamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu penso que seja exatamente assim Gabriel, mas não achei a documentação aonde diz que é exatamente assim que ela se comporta, e por isso fiquei na dúvida.

 

Até aonde eu entendo (sou principiante), um atacante consegue se infiltrar principalmente por falhas no recebimento de informação externa (quando o programador não higieniza/valida no lado do servidor get, post, quando estes vão para o banco de dados, ou aparecem como "echo get ou post" na página, em geral quando não higieniza adequadamente as informações que chegam externamente ao servidor)

 

imagino que:

function minha_funcao_recebe_GET_da_url_por_exemplo($recebe_um_perigo_indireto_pois_atacante_injeta_na_url_algo_que_vai_para_dentro_da_funcao){

# cuidado com a lógica

}

 

porém:

function minha_funcao_dentro_da_pagina_invoca_na_logica_interna_sem_interacao(){

# uma atacante não pode fazer nada aqui, se eu não pegar informações externas como por exemplo um $_GET

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Mauricio Molina
      Ola pessoal, será que podem me dar uma força?
       
      Preciso fazer um calculo de subtração de valores, onde o administrador seleciona o mes, pego pelo ID, método GET, para edição.
       
      Como normalmente tem vários meses pagos, o script a seguir só esta funcionando no primeiro item da tabela.
       
      Como posso fazer para funcionar em todos os itens da tabela?
       
      Teria que dar um nome diferente no getValor (id no HTML) para cada um, mas como posso fazer isso?
       
      <!-- Calculo Devolucao--> <script type="text/javascript"> function id(valor_campo) { return document.getElementById(valor_campo); } function getValor(valor_campo) { var valor = document.getElementById(valor_campo).value.replace(',', '.'); /*document.write("Valor: " - valor);*/ return parseFloat( valor ) * 1; } function sub() { var total = getValor('v_recebido') - (getValor('v_devolvido')); id('resultadoDev').value = (total * 1) .toFixed(2, "."); } </script> <!-- Calculo Devolucao--> <div class="toggle"> <input name="v_devolvido" type="checkbox" id="foo<?php echo $rows_aluno['id']; ?>" value="<?php echo $rows_aluno['v_recebido']; ?>"> <label for="foo<?php echo $rows_aluno['id']; ?>"></label> </div> <input type="text" id="v_recebido" value="<?php echo $rows_aluno['v_recebido']; ?><?php echo $rows_aluno['v_receb_parc']; ?>" onblur="sub()" > <div class="form-row"> <div class="form-group col-md-6"> <label for="validationCustomUsername">Valor Parcial:</label> <div class="input-group"> <div class="input-group-prepend"> <span class="input-group-text" id="inputGroupPrepend">R$</span> </div> <input name="v_dev_parc" type="text" class="form-control" id="v_devolvido" placeholder="Digite o Valor" aria-describedby="inputGroupPrepend" onblur="sub()"> </div> </div> <input name="id_user" type="hidden" value="<?php echo $rows_aluno['id_user']; ?>"> <input name="id_prof" type="hidden" value="<?php echo $rows_aluno['id_prof']; ?>"> <input name="status" type="hidden" value="Devolvido"> <input name="mes" type="hidden" value="<?php echo $rows_aluno['mes']; ?>"> <input name="v_recebido" type="text" id="resultadoDev"> </div>  
    • Por mateus.andriollo
      Boa tarde,
      Tenho alguns campos numéricos q ao fazer uma select gostaria q retornasse uma legenda
       
      exemplo:
      Status: 0=Inativo / 1=Ativo Condição: 1=Funcionando / 2=Em manutenção / 3=Manutenção Interna   
      Seria algo assim, tenho varias tabelas com estes campos... mas tenho q ficar usando replace.
      Existe uma forma de criar uma função para isso? Nem q na função eu tenha que setar nome do campo, ficando assim:
      Legenda('Status',cadastro.status) 
    • Por Luiz Henrique
      Olá pessoas,
       
      Tenho uma classe e dentro dela várias chamadas para métodos de acordo com a necessidade em outra classe (para obter dados DB), como são muitas e vou duplicar os arquivos, para ganhar tempo queria colocar o nome da classe em uma variável porém não funciona.
       
      use Class1; class Class2 { public $className = 'Class1'; ... $dados = $this->className::function(); // não funciona } Era para gerar isso:
      $dados = Class1::function();
      Se eu der um echo $this->$className, ele me retorno o nome da Class1 porém para executar um método dentro da Class1 não vai, diz que a classe Class1 não existe!
      Tem alguma forma de funcionar isso?
       
      Obrigado.
    • Por joagostini
      Olá, sou iniciante, e estou fazendo, como exercício, o jogo da velha. 'Desenvolvi' uma rotina de escolha de nível do jogo (serão 3 níveis) que deve aguardar a escolha do usuário para o programa prosseguir. Mas acho que não entendi direito como o javascript funciona, pois o que fiz não funciona e não encontrei uma solução (talvez não saíba como pesquisar corretamente o assunto na web).

      O começo do HTML (que é pouco) onde está um select para escolha do nível é este:
      <body>     <div id="dvmenu">         <button onclick="iniciar()">Iniciar Jogo</button>         <p><br></p>         <div id="dvQuemComeca">             <label for="nivel">Escolha o nivel:</label>             <select id="nivel" onChange='atualiza()'>                 <option value=0 selected>Escolha um nível</option>                 <option value=1>Nível 1 - Brincadeira</option>                 <option value=2>Nivel 2 - Surpresa</option>                 <option value=3>Nível 3 - Desafio</option>             </select>         </div>         <div id="jogador" class="jogador"></div>         <div id="vencedor" class="jogador"></div>     </div>  
      O código JS é este:
      //INÍCIO VEM DE LOAD function iniciar() {     casela = document.querySelectorAll('div[id^="p"]');     for (let cas of casela) {         cas.innerHTML = '';     }     for (let i = 0; i < 9; i++){        tab = tab;     }     console.log(tab);     nivel = 0;      msg = '';     qtosLancesJog = 0;     sorteiaJogador();     //até aqui funcionou direito } //-------------------------------------------------------------------- //ESCOLHA DO NÍVEL DO JOGO function atualiza(){     let selecao = document.querySelector('#nivel');     let opcao = selecao.options[selecao.selectedIndex];     return opcao.value;    }   //--------------------------------------------------------------------   //SORTEIA QUEM VAI COMEÇAR JOGANDO //função para definir o jogador que inicia o tab function sorteiaJogador() {//funcionou direito     let quemComeca = parseInt(Math.floor(Math.random() * 2));     if (quemComeca == 0) {         msg = 'Computador';         //setTimeout(lanceCpu, 2000);//dá um intervalo antes do computador realizar o 1 lance         lanceCpu();     } else msg = 'Humano';//neste caso a rotina espera que o jogador clique no tabuleiro, qdo roda a função lancetab(pos)         lanceHumano();     document.querySelector('#jogador').innerHTML = `<br>O ${msg} começa!`; } //--------------------------------------------------------------------   //ESCOLHA RANDÔMICA, NIVEL = 1, Da POSIÇÃO DO LANCE DA CPU NO tabULEIRO function jogouCpu(){//funcionou direito //nível 1 modo randômico pos = Math.floor(Math.random() * 9); return pos; }   //função humana function lanceHumano(){     console.log('Estou na função humana');     do {         nivel = atualiza();         console.log(nivel);     } while (nivel === 0);     console.log(nivel + ' passei direto'); }  
      O problema está nesse do...while da function lanceHumano(). Segundo entendi, ele prosseguiria apenas quando nivel!== 0, caso contrário, ficaria 'preso' até o momento que o usuário escolhesse uma das opções. Pelo HTML percebesse que setei o select para value=0. Mas ele nem se dá ao trabalho de esperar um miléssimo de segundo, segue em frente com o valor que tiver, no caso 0. O while  não tem efeito. Essa minha perspectiva está errada? Se sim, o que fazer? (paradigma funcional, await?) Obrigado.
      P.S.. No código tem uns conole.logs que servem watch-dogs para ajudar a entender por onde vão as rotinas.
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
×

Informação importante

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