Ir para conteúdo

POWERED BY:

Arquivado

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

Wilian Fiabani

Segurança em PHP

Recommended Posts

Creio que se fosse tão básico assim não existiria tantos problemas e tópicos na web.

ok

então pesquise as formas de ataque por SQL Injection e veja que vulnerabilidade é explorada

Poste a melhor solução que encontrar.

 

Só lendo este tópico completo, já saberá

Compartilhar este post


Link para o post
Compartilhar em outros sites

function checagem($str){

if(strpos(str_replace("''",""," $str"),"'")!=false)

return str_replace("'", "''", $str);

else

return $str;

}

 

function seguranca($str){

if (is_array($str)) {

foreach($str AS $id => $value) {

$str[$id] = seguranca($value);

}

}

else

$str = checagem($str);

return $str;

}

 

$inject = array_keys($_GET);

$i=0;

while($i<count($inject)) {

$_GET[$inject[$i]]=seguranca($_GET[$inject[$i]]);

$i++;

}

unset($inject);

 

$inject = array_keys($_REQUEST);

$i=0;

while($i<count($inject)) {

$_REQUEST[$inject[$i]]=seguranca($_REQUEST[$inject[$i]]);

$i++;

}

unset($inject);

 

$inject = array_keys($_POST);

$i=0;

while($i<count($inject)) {

$_POST[$inject[$i]]=seguranca($_POST[$inject[$i]]);

$i++;

}

 

$inject = array_keys($_COOKIE);

$i=0;

while($i<count($inject)) {

$_COOKIE[$inject[$i]]=seguranca($_COOKIE[$inject[$i]]);

$i++;

}

 

$inject = array_keys($_SESSION);

$i=0;

while($i<count($inject)) {

$_SESSION[$inject[$i]]=seguranca($_SESSION[$inject[$i]]);

$i++;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

function checagem($str){
	if(strpos(str_replace("''",""," $str"),"'")!=false)
		return str_replace("'", "''", $str);
	else
		return $str;
}

function seguranca($str){
	if (is_array($str)) {
		foreach($str AS $id => $value) {
			$str[$id] = seguranca($value);
		}
	}
	else
		$str = checagem($str);
	return $str;
}

existe motivo específico para o uso dessas funções ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

basicamente, basta escapar as aspas. Não precisa remover caracteres

Concordo com o Beraldo e assino embaixo.

 

Só uma questão que é bom frizar.

Cuidado com os campos Inteiros

Compartilhar este post


Link para o post
Compartilhar em outros sites

e aquela função "mysql_real_escape_string" não seria útil ?

 

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria mas ela é um addslashes, só que se o servidor não tiver com extensão a MySQL não vai funcionar.

 

o Povo tá perdendo tempo tentando converter alguns caracteres, mal eles sabem que para se escrever outra query, deve-se terminar a primeira.

sem aspas simples a QUERY não é FINALIZADA.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se ainda tá valendo, mas eu desenvolvi essa função aqui e uso em meus projetos:

 

function antiSQL($string) {

    $array_base = array("DELETE", "INSERT", "SELECT", "UPDATE", "delete", "insert", "select", "update");
    $array_subs = array("", "", "", "", "", "", "", "");
	
    $string = get_magic_quotes_gpc() == 0 ? addslashes($string) : $string;
    $string = trim($string);
    $string = strip_tags($string);
    $string = mysql_escape_string($string);
    $string = str_replace($array_base, $array_subs, $string);
    $string = preg_replace("@(--|\#|\*|;|=)@s", '', $string);

    return $string;
}

É óbvio que eu proibo o cadastro das palavras contidas na $array_base.

 

PS: Peguei o preg_replace de outra função na internet.

 

Falo

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php

if(isset($_POST['usuario'])){
$user = mysql_real_escape_string($_POST['usuario']);
echo $user;
}
?>

<form action="<?php $_Server[php_SELF] ?>" method="POST" >
Usuario: <input type="text" name="usuario">
</form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

function checagem($str){
	if(strpos(str_replace("''",""," $str"),"'")!=false)
		return str_replace("'", "''", $str);
	else
		return $str;
}

function seguranca($str){
	if (is_array($str)) {
		foreach($str AS $id => $value) {
			$str[$id] = seguranca($value);
		}
	}
	else
		$str = checagem($str);
	return $str;
}

$inject = array_keys($_GET);
$i=0;
while($i<count($inject)) {
	$_GET[$inject[$i]]=seguranca($_GET[$inject[$i]]);
	$i++;
}
unset($inject);

$inject = array_keys($_REQUEST);
$i=0;
while($i<count($inject)) {
	$_REQUEST[$inject[$i]]=seguranca($_REQUEST[$inject[$i]]);
	$i++;
}
unset($inject);

$inject = array_keys($_POST);
$i=0;
while($i<count($inject)) {
	$_POST[$inject[$i]]=seguranca($_POST[$inject[$i]]);
	$i++;
}

$inject = array_keys($_COOKIE);
$i=0;
while($i<count($inject)) {
	$_COOKIE[$inject[$i]]=seguranca($_COOKIE[$inject[$i]]);
	$i++;
}

$inject = array_keys($_SESSION);
$i=0;
while($i<count($inject)) {
	$_SESSION[$inject[$i]]=seguranca($_SESSION[$inject[$i]]);
	$i++;
}

 

Coisa de mais aí...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A que eu uso tem uns meses é esta aqui.

 

function anti_injection($str){
// verifica se o valor da string é somente numérico 
if (!is_numeric($str)) { 
    //verifica se o magic_quotes está habilitado, se sim tira o escape da string, caso não mantem o valor digitado.
   $str = get_magic_quotes_gpc() ? stripslashes($str) : $str;  
   // verifica se a função mysql_real_escape_string está habilitada, se sim roda ela, se não usa o mysql_escape_string
   $str = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($str) : mysql_escape_string($str);
}
// retorna o valor tratado 
return $str;
    		
}

Antigamente eu usava estas funções que retiravam as palavras mais perigosas, mas tive problemas pois elas apagava os textos digitados pelos usuários, então não era uma boa.

 

Eu acredito que não precise de tantas linhas quando o problema é somente escapas aspas e apóstrofos.

 

Eu to vendo um monte de gente se matando, escrevendo uma porrada e linhas pra resolver um problema simples.

 

 

Levem esse vídeo como lição, muito bom

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hey Nícolas,

 

Por um acaso você copiou esta função do meu blog? Está identica a função que eu publiquei neste post. hehe

 

Só o nome da função que está diferente, em vez de anti_sql_injection que foi um nome sugestivo que eu coloquei no post está como anti_injection. Eu particulamente em meus projetos utilizo apenas como asi. :)

 

O resto está identica a função que eu publiquei, nome da variável $str, verificação de inteiro, etc.

 

Faz tempo que eu escrevi este artigo e tenho ele publicado no site PHPBrasil também, está bem mal escrito por sinal. hehe

 

Nada contra você postar a função, pelo contrário, só queria saber mesmo porque acho legal ver alguém utilizando. :)

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Leozitho como é que ta cara? ^_^

 

Então na verdade o nome da função ta assim porque antes deu encontrar seu código eu utilizava este do Fabyo.

http://forum.imasters.com.br/index.php?/topic/125349-anti-sql-injection/

 

O ruim é que destroi os dados, então acabou não sendo eficiente pra mim em alguns casos, até que um dia pesquisando na net acabei encontrando o seu.

 

Eu lembro que tinha visto algo parecido com "tratando sql injection sem destruir os dados" e tal, não vi isso no sue site, mas a página me é muito familiar então acho que foi o seu mesmo ^^

 

E o nome da função ficou diferente pois eu só alterei o conteudo dela, já que o nome já chamava em outros pontos do sistema

 

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal ver que tem alguém utilizando a função e compartilhando com outras pessoas. :)

 

A idéia de escrever o post foi justamente essa, porque eu sempre via a maioria dos programadores substituindo palavras e acrescentando barras invertidas como forma de prevenir contra o SQL Injection, e queria mostrar que isso é totalmente desnecessário. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sempre via a maioria dos programadores substituindo palavras e acrescentando barras invertidas como forma de prevenir contra o SQL Injection, e queria mostrar que isso é totalmente desnecessário. ;)

 

mas é isso que mysql_real_escape_string faz:

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

fonte: http://php.net/manual/en/function.mysql-real-escape-string.php

 

a diferença é que é uma função interna do SGBD, não do PHP, como addslashes

 

 

 

 

E é importante notar que o escape de caractere não é sempre igual em todos os SGBD's. Logo, a solução específica para MySQL, não é suficiente para PostgreSQL, por exemplo :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

E é importante notar que o escape de caractere não é sempre igual em todos os SGBD's. Logo, a solução específica para MySQL, não é suficiente para PostgreSQL, por exemplo :thumbsup:

 

Uma observação muito bem colocada Beraldo, nem havia parado pra pensar nisso ainda Beraldo.

 

Mas acredito que isso não seja o maior dos problemas do mundo, já que está tudo dentro de uma função, caso haja a alteração de um banco de dados seria só alterar a função pra uma equivalente.

 

O que sei é que essa pra mysql pra mim está perfeita.

 

Não destroi os dados e realmente previne.

 

:joia:

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.