Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá salvadores dos iniciantes, rs. kk
Amigos, estou com um problema em um sistema de login simples, ele tá aceitando comando 'or'1 na hora de logar.
Como evitar esse problema?
Eu pensei em buscar um novo sistema ja pronto e seguro, mas quero APRENDER e solucionar o meu proprio que ja esta pronto.
Podem ajudar?
Postarei aqui os scripts e espero que alguem saiba onde está a falha.
Login.php
<?php
session_start();
if (!empty($_SESSION['usuario_id'])){
echo "<script>";
echo "window.location.href='painel'";
echo "</script>";
exit;
}
$ip = $_SERVER["REMOTE_ADDR"];
?>
<div id="formulario">
<FORM action="painel/inc/autenticacao.rotinas.php" method="post">
<p class="form-text">LOGIN DE USUÁRIO</p>
<div class="username">
<INPUT name='usuario' class="form-login" size=20 maxlength="30" required autofocus />
</div>
<p class="form-text">SENHA DE USUÁRIO</p>
<div class="password">
<INPUT type='password' size=20 name='senha' class="form-pass" required />
</div>
<div style="text-align:center;">
<input type='hidden' name="enviado" value="posted">
<INPUT type=submit id="botao" value="" class="submit" name=Submit>
<p class="ip">SEU IP: <?php echo "$ip"; ?></p>
</div><!-- centraliza submit e ip -->
</FORM>
</div> <!-- formulario de login -->
painel/inc/autenticacao.rotinas.php
<?php
ob_start();
session_start();
include ("../config/conexao.php");
$cliente_username = $_POST["usuario"];
$cliente_password = $_POST["senha"];
$enviado = $_POST["enviado"];
if ($enviado == "posted"){
if (!isset($cliente_username) or !isset($cliente_password)) { echo "Erro!"; exit; }
if (empty($cliente_username) or empty($cliente_password)) {
echo "<script>";
echo "alert('Login ou Senha incorretos!');";
echo "window.location.href='../'";
echo "</script>";
exit; }
$query = "select * from tbl_usuairos where login = '$cliente_username' and senha = '$cliente_password'";
$result = mysql_query($query);
$number = mysql_num_rows($result);
if ($number==0) { ?>
<script>document.location = '../erro.php'</script>
<?php
exit;
} else {
$_SESSION['usuario_id'] = mysql_result($result,0,'id');
$_SESSION['usuario_nome'] = mysql_result($result,0,'nome');
$_SESSION['nivel'] = mysql_result($result,0,'nivel');
$_SESSION['email'] = mysql_result($result,0,'email');
?><script>document.location = '../conectou.php'</script><?php
}
mysql_close($conexao);
}
?>
conexao.php
$database="localhost";
$dbname="_painel";
$usuario="usuario";
$dbsenha="senha";
$conexao=mysql_connect ($database, $usuario, $dbsenha);
if($conexao){
if (mysql_select_db($dbname, $conexao)){ print "";
}else{ print "Não foi possível selecionar o Banco de Dados"; }
}else{ print "Erro ao conectar o MySQL"; }
?>
como eu evito sql_injection nesses arquivos?
valeu :)
$query = "select * from tbl_usuairos where login = '$cliente_username' and senha = '$cliente_password'";
Uma dica, na query teste primeiro o login, depois verifica se a senha é válida:
$query = "select * from tbl_usuairos where login = '$cliente_username'";
executa a query
verifica se existe o usuário
compara a senha digitada com a senha pertencente ao usuário validado no banco.
Aí já evita o 'or'1='1
At+
>
$query = "select * from tbl_usuairos where login = '$cliente_username' and senha = '$cliente_password'";
Uma dica, na query teste primeiro o login, depois verifica se a senha é válida:
$query = "select * from tbl_usuairos where login = '$cliente_username'";
executa a query
verifica se existe o usuário
compara a senha digitada com a senha pertencente ao usuário validado no banco.
Aí já evita o 'or'1='1
At+
Como seria isso no php?
não seria essa parte?
$result = mysql_query($query);
$number = mysql_num_rows($result);
if ($number==0) { ?>
>
Brow dar uma olhada nesse link...
http://imasters.com.br/artigo/5179
ja dei uma lida nesse artigo mas nao consegui resolver meu problema, por isso criei este topico na verdade, rs.
Assim:
$query = "select * from tbl_usuairos where login = '$cliente_username'";
$result = mysql_query($query);
$number = mysql_num_rows($result);
if ($number == 0) {
// sai
} else {
$row = mysql_fetch_object($result);
if($row->senha == $cliente_password) {
// cria as sessões e redireciona....
} else {
// sai
}
}
?>
At+
>
Assim:
$query = "select * from tbl_usuairos where login = '$cliente_username'";
$result = mysql_query($query);
$number = mysql_num_rows($result);
if ($number == 0) {
// sai
} else {
$row = mysql_fetch_object($result);
if($row->senha == $cliente_password) {
// cria as sessões e redireciona....
} else {
// sai
}
}
?>
At+
valeu pela resposta, eu consegui evitar o 'or'1 adicionando apenas um (int) antes da query. dessa forma:
$query = (int) "select * from tbl_usuairos where login = '$cliente_username'";
Isso já evita mesmo? ou ainda tá falho?
Se estiver errado eu tento o que voce postou, valeu!
Isso também ira funcionar porque ira forçar ao usuario somente colocar números inteiros
>
valeu pela resposta, eu consegui evitar o 'or'1 adicionando apenas um (int) antes da query. dessa forma:
$query = (int) "select * from tbl_usuairos where login = '$cliente_username'";
Isso já evita mesmo? ou ainda tá falho?
Se estiver errado eu tento o que voce postou, valeu!
______________________________________________________
Ou também dessa forma
Na pagina onde o usuario ira fazer o login qual e não consegui achar onde esta mais e so colocar as mesmas coisas
$login = mysql_real_escape_string(trim(strip_tags(addslashes($_POST['login']))));
$senha = mysql_real_escape_string(trim(strip_tags(addslashes($_POST['senha']))));
Isso ira barrar o sql injection
Cara isso que você fez foi Casting, você esta tentado converter sua String SQL para inteiro, dê uma olhada na documentação: Casting
Tenta fazer do jeito que te falei.
At+
>
Cara isso que você fez foi Casting, você esta tentado converter sua String SQL para inteiro, dê uma olhada na documentação: Casting
Tenta fazer do jeito que te falei.
At+
realmente, o (int) evitava o injection mas tinha falha com usuarios, nao logava.
usei o que voce fez mas nao tava logando, dava usuario incorreto, rs.
enfim, com a solução do RONAL funcionou direitinho. Loga normal e nao passa sql injection.
Valeu RONAL!
Se alguem achar que tem alguma falha no que o RONAL falou, favor postar aqui! Valeu!
Os unicos jeito que sei que da para fazer o login mais seguro e utilizando
PDO OO ou criptografar as senhas com md5, sha1 ou base64
Pelo o que eu sei
Mais com isso que eu te passei ja da para segurar a onda contra sql injection
Brow dar uma olhada nesse link...
http://imasters.com.br/artigo/5179