http://skamason.com/7b9R

http://skamason.com/7b9R

quinta-feira, 27 de outubro de 2011

MySQL - SQL Injection Prevenção

Se você já tomou a entrada do usuário-primas e inseriu-a em um banco de dados MySQL há uma chance que você deixou-se aberta para um problema de segurança conhecido como SQL Injection. This lesson will teach you how to help prevent this from happening and help you secure your scripts and MySQL statements. Esta lição irá ensiná-lo para ajudar a impedir que isto aconteça e ajudá-lo a proteger seus scripts e declarações MySQL.

O que é SQL Injection

Injeção de SQL se refere ao ato de alguém inserir uma declaração MySQL para ser executado em seu banco de dados sem o seu conhecimento. Injection usually occurs when you ask a user for input, like their name, and instead of a name they give you a MySQL statement that you will unknowingly run on your database. Injeção geralmente ocorre quando você perguntar a um usuário para entrada, como seu nome, e em vez de um nome que eles dão-lhe uma declaração MySQL que você vai saber executar no seu banco de dados.

SQL Injection Exemplo

Abaixo está uma seqüência de amostra que foi recolhida a partir de um usuário normal e um usuário mal tentando usar SQL Injection. We asked the users for their login, which will be used to run a SELECT statement to get their information. Pedimos aos usuários para seu login, que será usado para executar uma instrução SELECT para obter suas informações.

MySQL e PHP Código:

Quote
/ / Um nome de usuário boa
$name = "timmy"; $ Name = "timmy";
$query = "SELECT * FROM customers WHERE username = '$name'"; $ Query = "SELECT * FROM Clientes WHERE username = '$ name'";
echo "Normal: " . echo "Normal:". $query . $ Query. "<br />"; "<br />";

// user input that uses SQL Injection / Input / usuário que utiliza injeção de SQL
$name_bad = "' OR 1'" ; Name_bad $ = "'OR 1'";

// our MySQL query builder, however, not a very safe one / / O nosso construtor de consulta MySQL, no entanto, não uma muito seguro
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; $ Query_bad = "SELECT * FROM Clientes WHERE username = '$ name_bad'";

// display what the new query will look like, with injection / / Mostrar o que a nova consulta será semelhante, com injeção
echo "Injection: " . echo "Injeção". $query_bad; $ Query_bad;



Display:

Quote
Normal: SELECT * FROM Clientes WHERE username = 'timmy'
Injection: SELECT * FROM customers WHERE username = '' OR 1'' Injecção: SELECT * FROM Clientes WHERE username =''OR 1''


A consulta normal é nenhum problema, como a nossa declaração de MySQL só irá selecionar tudo de clientes que tem um nome de usuário igual a timmy.

However , the injection attack has actually made our query behave differently than we intended. No entanto, o ataque de injeção fez realmente a nossa consulta se comportar diferentemente do que pretendíamos. By using a single quote (') they have ended the string part of our MySQL query Usando aspas simples (') que tenham acabado a parte da cadeia de nossa consulta MySQL

* username = ' ' username = '"

and then added on to our WHERE statement with an OR clause of 1 (always true). e depois adicionada à nossa declaração WHERE com uma cláusula OR de 1 (sempre é verdade).

* username = ' ' OR 1 username = 'OR 1

This OR clause of 1 will always be true and so every single entry in the "customers" table would be selected by this statement! Esta cláusula OR de 1 será sempre verdadeira e por isso cada única entrada na "clientes" tabela seriam selecionados por esta declaração!

Mais graves ataques de SQL Injection

Embora o exemplo acima apresentado uma situação onde um atacante poderia ter acesso a muita informação que não deveriam ter, os ataques podem ser muito pior. For example an attacker could empty out a table by executing a DELETE statement. Por exemplo, um invasor poderia esvaziar uma tabela, executar uma instrução DELETE.

MySQL e PHP Código:

Quote
Name_evil $ = ""; DELETE FROM clientes WHERE 1 ou username = '";

// our MySQL query builder really should check for injection / / O nosso construtor de consulta MySQL realmente deve verificar se há injeção
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; $ Query_evil = "SELECT * FROM Clientes WHERE username = '$ name_evil'";

// the new evil injection query would include a DELETE statement / / A consulta nova injeção mal iria incluir uma instrução DELETE
echo "Injection: " . echo "Injeção". $query_evil; $ Query_evil;


Display:

Quote
SELECT * FROM Clientes WHERE username = ''; DELETE FROM clientes WHERE 1 ou username = '"


Se você fosse executar essa consulta, então a instrução DELETE injetado seria completamente vazio seus "clientes" da tabela. Now that you know this is a problem, how can you prevent it? Agora que você sabe que este é um problema, como você pode evitá-lo?

Prevenção de injeção - mysql_real_escape_string ()

Para sua sorte, este problema tem sido conhecida há algum tempo e PHP tem uma função especialmente feito para impedir esses ataques. All you need to do is use the mouthful of a function mysql_real_escape_string . Tudo que você precisa fazer é usar a boca de um mysql_real_escape_string função.

What mysql_real_escape_string does is take a string that is going to be used in a MySQL query and return the same string with all SQL Injection attempts safely escaped. O que mysql_real_escape_string faz é pegar uma string que vai ser usado em uma consulta MySQL e retornar a mesma seqüência com todos os SQL Injection tentativas ilesos. Basically, it will replace those troublesome quotes(') a user might enter with a MySQL-safe substitute, an escaped quote \'. Basicamente, ele irá substituir as aspas problemáticos (') o usuário pode entrar com um substituto MySQL-safe, uma citação escapou \'.

Lets try out this function on our two previous injection attacks and see how it works. Vamos tentar essa função em nossos dois ataques de injeção anterior e ver como ele funciona.

MySQL e PHP Código:

Quote
/ / NOTA: você deve estar conectado ao banco de dados para usar esta função!
// connect to MySQL / / Conectar ao MySQL

$name_bad = "' OR 1'"; Name_bad $ = "'OR 1'";

$name_bad = mysql_real_escape_string($name_bad); $ Name_bad = mysql_real_escape_string ($ name_bad);

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; $ Query_bad = "SELECT * FROM Clientes WHERE username = '$ name_bad'";
echo "Escaped Bad Injection: <br />" . echo "Escaped Injection Bad: <br />". $query_bad . $ Query_bad. "<br />"; "<br />";


$name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; Name_evil $ = ""; DELETE FROM clientes WHERE 1 ou username = '";

$name_evil = mysql_real_escape_string($name_evil);
$ Name_evil = mysql_real_escape_string ($ name_evil);

$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; $ Query_evil = "SELECT * FROM Clientes WHERE username = '$ name_evil'";
echo "Escaped Evil Injection: <br />" . echo "Escaped Injection Evil: <br />". $query_evil; $ Query_evil;


Display:

Quote
Escapou Injection Bad:
SELECT * FROM customers WHERE username = '\' OR 1\'' SELECT * FROM Clientes WHERE username = '\' OR 1 \''
Escaped Evil Injection: Escapou Injection Evil:
SELECT * FROM customers WHERE username = '\'; DELETE FROM customers WHERE 1 or username = \'' SELECT * FROM Clientes WHERE username = '\'; DELETE FROM clientes WHERE 1 ou username = \''


Note-se que essas citações foram mal escapou com a \ barra invertida, impedindo que o ataque de injeção. Now all these queries will do is try to find a username that is just completely ridiculous: Agora todas essas consultas vão fazer é tentar encontrar um nome de usuário que é apenas completamente ridículo:

* Bad: \' OR 1\' Bad: \ 'OR 1 \'
* Evil: \'; DELETE FROM customers WHERE 1 or username = \' Evil: \ '; DELETE FROM clientes WHERE 1 ou username = \'

And I don't think we have to worry about those silly usernames getting access to our MySQL database. E eu não acho que nós temos que se preocupar com os nomes de usuários bobagem ter acesso ao nosso banco de dados MySQL. So please do use the handy mysql_real_escape_string() function to help prevent SQL Injection attacks on your websites. Então, por favor use o mysql_real_escape_string útil () função para ajudar a prevenir ataques de SQL Injection em seus sites. You have no excuse not to use it after reading this lesson! Você não tem desculpa para não usá-lo depois de ler esta lição!


Créditos: Tizag

Nenhum comentário:

Postar um comentário