Ir para conteúdo

POWERED BY:

Arquivado

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

Scientist

Strip_tags não funciona ?

Recommended Posts

Bom dia, coloquei a função strip_tags em todos os locais onde o usuário pode entrar com dados (Seja GET ou POST), porém mesmo assim alguém está conseguindo editar o banco de dados. Por exemplo, tenho uma linha do banco assim: "Hoje é Dia 07". O usuário "maléfico" está fazendo isso: "Hoje é Dia 07<iframe>www.sitequeelecoloca.com.br/arquivo.exe</iframe>"

 

Isso da um super problema, pois quando alguém entra no site automaticamente baixa esse arquivo.exe.

 

Alguma dica de como resolver isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Filho, você tem que impedir a entrada da agulha, e não o efeito do veneno.

 

A falha está em seu sistema de login e verificação das páginas, claro que você deve também, fazer o filtro na inserção dos dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas é isso que não entendo Gabriel, como um usuário poderia inserir uma informação no banco (na verdade, editar uma informação, pois até agora foi só isso que ele conseguiu fazer, editar) se todas as entradas estão filtradas com strip_tags.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de mais nada, de onde você tirou a idéia de que strip_tags resolvo tudo? Se o seu problema é ***apenas*** sql injection use PDO e pronto. Se essa inserção/edição de dados está ocorrendo na área publica do seu site um paleativo é você permitir apenas select lá (assumindo que o update/insert/delete não é usado na área pública).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de mais nada, de onde você tirou a idéia de que strip_tags resolvo tudo? Se o seu problema é ***apenas*** sql injection use PDO e pronto. Se essa inserção/edição de dados está ocorrendo na área publica do seu site um paleativo é você permitir apenas select lá (assumindo que o update/insert/delete não é usado na área pública).

 

Já uso PDO amigo :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já uso PDO amigo :D

Legal, agora vem a dica de ouro na participação de qualquer fórum: mostre o script, sem isto fica-se apenas na suposição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, fica inviável mostrar o script sendo que são muitas páginas, e não sei ao certo onde está o problema.



Bom, vou seguir o concelho do nosso amigo Marcos Xavier e ler sobre PHP Injection

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo assim fica um pouco dificil de ajudar.

Você pode mostrar somente o código de autenticar o usuario e codigo que você usa para validar se o usuario esta autenticado no sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe pessoal, dei a resposta errada, não estou usando PDO neste projeto e sim Sprintf (PDO uso em um outro, me confundi). Será que influência em algo utilizar Sprintf em vez de PDO ou o ideal é trocar para PDo logo ?

 

Segue minha página de login (acho que ela não está influenciando nisso)

 

 

 
<?php
  if (session_id() == "")
  session_start();
 
  //ini_set('display_errors', 'On');
  //error_reporting(E_ALL);
 
  define('CAMINHO_RAIZ',$_SERVER['DOCUMENT_ROOT']."/");
  
  require "usuario/dao_usuario.php";
  
  if (isset($_SESSION['email'])) 
  header('Location: index.php');
  
if (isset($_POST['entrar'])){
   $daoUsuario = new DaoUsuario;
            $email = strip_tags(trim(strtolower($_POST['email'])));
            $senha = strip_tags(trim(strtolower($_POST['senha'])));
if ($daoUsuario->VerificarLogon($email,$senha)){
 
$pojoUsuario = $daoUsuario->BuscarPorEmail($email);
 
        $_SESSION['email'] = $email;     
      $_SESSION['cod_usuario'] = $pojoUsuario->getCod_usuario();
  $_SESSION['data_acesso'] = date("d/m/Y \à\s H:i");
               echo "<script type='text/javascript'>location.href='index.php';</script>";
  
  }
else
        echo "<script type='text/javascript'> alert('Email/Senha inválido, por favor tente novamente'); </script>"; 
 
} 
 
     
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<link rel="stylesheet" href="../css/login.css" type="text/css" media="screen" />
<link rel="stylesheet" href="../js/jquerymain/dot-luv/jquery-ui-1.8.16.custom.css" type="text/css" media="screen" />
 
<script type="text/javascript" src="../js/jquerymain/jquery-1.6.2.min.js" ></script>
<script type="text/javascript" src="../js/jquerymain/jquery-ui-1.8.16.custom.min.js" ></script>
 
<script type="text/javascript">
$(document).ready(function(){ 
   $("input:submit").button();
});
</script>
 
<title></title>
</head>
  
<body>
 
 <div id="container">
 
  <div id="login_box">
  
    <form action="" method="post" name="formulario">    
    <label for="email">E-mail</label><input type="text" class="lower" name="email" id="email" />
    <label for="senha">Senha</label><input type="password" class="lower" name="senha" id="senha" />
    <input type="submit" name="entrar" value="entrar" />
    </form>
  </div><!--DIV LOGIN_BOX-->
 </div><!--DIV CONTAINER-->
</body>
</html>
<?php unset($daoUsuario); ?>
 


Bom, coloquei o seguinte tratamento para tentar resolver o PHP Injection

 

 

 
 <?php
                        $pg = isset($_GET['pg']) ? $_GET['pg'] : null;
                        $pg = strip_tags(trim($pg));
 
                        if (eregi("http|www|ftp|.dat|.txt|.gif|wget", $pg))
                            die('Ops, problemas na página.');
 
                        if (is_file($pg . '.php'))
                            include $pg . '.php';
                        else
                            include 'home.php';
                        ?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

aconselho a ir num ponto mais específico..

 

em qual tabela do banco de dados está salvo esse frame com o arquivo exe ?

 

baseado nisso comece a olhar as ações com o db referentes a essa tabela..

 

e mesmo nesse código do login não há proteção contra sql injection.. então creio que outros scripts estejam na mesma situação..

Compartilhar este post


Link para o post
Compartilhar em outros sites

$email = strip_tags(trim(strtolower($_POST['email'])));

 

strip_tags -> remove tags html, css, js..

 

trim -> remove espaços antes e depois da string

 

strtolower -> converte todas as letras para minúsculo

 

Em seguida, a variável é enviada para o método VerificarLogon do objeto daoUsuario

 

$daoUsuario->VerificarLogon($email,$senha)

 

Até esse ponto não há tratamento algum contra SQL injection.. A grosso modo, o que o script faz é corromper os dados e só isso.

 

A parte mais básica da segurança que é remover as strings de injeção, é inexistente nesse script.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas por se tratar de um modelo Orientado a Objetos (seguindo Padrões de Projeto) o tratamento de SQL Injection (com Addslahses) está sendo feito todo dentro da classe DaoUsuario, ou seja, quando é acionado o método VerificarLogon lá tem um Addslashes tratando os parametros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue o meu método VerificarLogon

 
   public function VerificarLogon($email, $senha) {
        $sql = sprintf("SELECT * FROM usuario WHERE email = '%s' AND senha = '%s'", addslashes(strtolower($email)), addslashes(strtolower($senha)));
       $result = mysql_query($sql) or die("ERRO ao verificar o logon do usuario, METHOD VerificarLogon, INFORME ESTE ERRO AO SUPORTE TÉCNICO");
 
 if (mysql_num_rows($result) != 1)
 return false;
 else
 return true;  
}
 

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.