Ir para conteúdo
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.

Editado por Gabriel Heming
adicionar marcação de código

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por alyssonw2silva
      Sou novo aqui e estou com o seguinte código 
      function buscar($query) { include_once 'conn.php'; if ($resulte2 = mysqli_query($conn, $query)) { while($row2 = mysqli_fetch_array($resulte2)) { print "<option value='".$row2[0]."'>".$row2[1]."</option>"; }; }; ele e para preencher os campos do meu select está funcionando mas como tenho outro select o primeiro roda agora o segundo da erro quando eu desabilito o primeiro  o segundo select e preenchido 
       
      estou chamando a mesma função para ambos os selects mas o parâmetro $query e diferente 
       
    • Por Fábio.info7
      Olá, sou iniciante em php OO, estou com uma dúvida e gostaria que alguém me ajudasse, preciso saber como eu faço pra chamar uma função "private estatic" que está eu outra classe, quando ela está na mesma classe eu consigo chamar usando o self::, mas em outra classe o self:: não funciona, como seria a forma correta?
      No Código abaixo eu preciso chamar a função conectaBanco(), através de outra classe.
       
      class Conexao{ private static $host = "localhost"; private static $dbname = "aluno"; private static $usuario = "root"; private static $senha = ""; private static $banco = null; private static function conectaBanco(){ try { self::$banco = new PDO('mysql:host=' . self::$host . ';dbname=' . self::$dbname, self::$usuario, self::$senha); return self::$banco; }catch (Exception $e) { echo "Mensagem de Erro:" . $e->getMessage() . '<br>'; echo "Linha do Erro:" . $e->getLine(); } } public function getBanco(){ return self::conectaBanco(); } }  
    • Por PeeWee
      Estou há horas com um problema no meu código, tenho a pagina Auth.php onde há algumas function que funcionam normalmente, porém a seguinte apresenta problemas.
      function getMemberNivel($nivel) {
              $db_handle = new DBController();
              $query = "Select * from members where nivel = ?";
              $result = $db_handle->runQuery($query, 's', array($nivel));
              return $result;
          }
       
      Na Index.php faço a chamada dela da seguinte forma:
       
      $teste = $auth->getMemberByUsername($nivel);
       
      Ocorre que preciso utilizar a variavel $teste, só que exibe erro como se a variavel nao existisse. As demais variaveis vindas da pagina funcionam normalmente. 
      Espero que algum dos colegas possa me ajudar. 
    • Por dieglus
      Olá! Tenho que fazer um projeto que é um SGBD em C, e uma das funções é para criar uma tabela da seguinte forma:
       
      1. Criar um tabela
           a. os tipos de dados para as colunas poderão ser os tipos primitivos em C ( char, int, float e double) e strings
           b. os valores deverão ser armazenados em arquivo
           c. na criação da tabela deverá ser solicitado um nome de coluna para ser a chave primária
                i. a chave primária deverá ser obrigatoriamente do tipo inteiro sem sinal
       
      Alguém pode me dar uma dica da lógica dessa função? Por favor, alguém me ajude!!!
    • Por camargo.2018
      Tou com um erro no meu script e não sei identificar erra pra ele exibir a imagem do usuário mas isso não está acontecendo
       
      Error:

       
      funcao.php:
      function ver_avatar($nick){ include 'str_get_html.php'; $url = "http://pt.clubcooee.com/users/view/".$nick; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($ch, CURLOPT_TIMEOUT, 15); $return = curl_exec($ch); curl_close($ch); $html = str_get_html($return); $res = $html->find('.m33 img'); $imgLink = $res[0]->attr['src']; return $imgLink; } str_get_html.php:
      <?php function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); if (empty($str) || strlen($str) > MAX_FILE_SIZE) { $dom->clear(); return false; } $dom->load($str, $lowercase, $stripRN); return $dom; } ?> menu.php:
      <div class="usr-nav"> <img src="<?php $veavt = ver_avatar($usr); echo $veavt; ?>" class="img-usr"> <p class="name-usr">Nome do Usuário</p> </div>  
      Me Ajudem mas rápido possível pfvrrrr
×

Informação importante

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