Pergunta

O quão perigoso é este código php? O que pode ser feito sobre isso?

$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
Foi útil?

Solução

Os problemas possíveis:

  1. SQL Injection
  2. XSS injeção (se este código foi uma consulta de inserção, seria um problema definido)
  3. texto simples senha

Seu instrução SQL pode ser problemático. É má prática para deixar-se abrir para a injeção SQL.

SQL Injection é ruim . Confie em mim.

Se você deseja exibir o $ usuário em uma página HTML, então você pode não querer incluir a capacidade de pessoas para "cortar" o seu layout, digitando comandos como

<H1>HI MOM</H1>

ou um grupo de javascript .

Além disso, nunca armazenar sua senha em texto simples (boa cagcowboy captura!). Ele dá poder demais para as pessoas administrar (ou hackers) seu banco de dados. Você deve nunca precisará saber a senha de alguém.

Tente táticas como estes:

// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring) 
{
    $unsafestring= htmlentities($unsafestring, ENT_QUOTES);

    if (get_magic_quotes_gpc()) 
    { 
        $unsafestring= stripslashes($unsafestring); 
    }

    $unsafestring= mysql_real_escape_string(trim($unsafestring));
    $unsafestring= strip_tags($unsafestring);
    $unsafestring= str_replace("\r\n", "", $unsafestring);

    return $unsafestring;
} 

// Call a function to make sure the variables you are 
// pulling in are not able to inject sql into your 
// sql statement causing massive doom and destruction.

$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );

// As suggested by cagcowboy: 
// You should NEVER store passwords decrypted.
// Ever.  
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))

Outras dicas

É esta perigosa: XKCD mesas de bobby

SQL Injection lado, parece que suas senhas podem ser armazenadas em texto simples, que não é grande.

Esse código é muito seguro se você nunca passar $ consulta para um banco de dados SQL.

Se fosse para 0';drop table users;-- post para um nome

seu comando acabaria sendo

select name, pwd form users where name='0'; 
drop table users; --'and pwd = '[VALUE OF PWD]'

Então, primeiro seria obter seus dados, em seguida, matar a sua tabela de usuários, e não fazer nada com o resto uma vez que é um comentário.

sql Certos comandos mysql em php irá executar várias consultas quando passado, a melhor maneira de evitar isso é parametrizado consultas.

Eu uso DOP para todo o meu acesso DB, e recomendo. Eu não tenho quaisquer links em cima da minha cabeça, mas eu me lembro os tutoriais eu usei encimadas Google.

Não é apenas propenso a injeções de SQL, que também irá falhar nos casos em que uma injeção nem sequer é destinado:

Por exemplo, um usuário quer o nome de "Guillaume François Antoine, Marquês de L'Hospital". Uma vez que o nome de usuário contém uma citação e você não está escapando dele, sua consulta irá falhar, embora o usuário nunca quis quebrar o sistema!

Ou usar DOP ou fazê-lo desta maneira:

$query = sprintf(
                   "SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
                   mysql_real_escape_string($_POST['name']),
                   mysql_real_escape_string(md5($_POST['password']))
                 );

Acredite ou não, isso é seguro ... se magic_quotes_gpc está ligado. Que ele nunca vai estar em PHP6, então corrigi-lo antes, então é uma boa idéia.

  1. $_POST['user'] = "' or 1=1; --"; Qualquer um, ganha acesso instantâneo ao seu aplicativo

  2. $_POST['user'] = "'; DROP TABLE user; --"; Beijar sua lista de usuários (pago?) Adeus

  3. Se você mais tarde echo $ nome em sua saída, que pode resultar em um ataque de injeção de XSS

: O não fazê-lo nunca, Isto pode provocar ataque Injeção de SQL. Se, por exemplo, a entrada do usuário de alguma forma: ' tabela usuários gota - como entrada no $ username; este código irá concatenar ao seu código original e vai cair sua mesa. Os hackers podem fazer mais e pode cortar o seu website.

Este é tipicamente muito perigoso. Pode ser mitigados por permissões de banco de dados em alguns casos.

Você não validar a entrada ($ nome e $ pwd). Um usuário poderia enviar em SQL em um ou ambos os campos. O SQL pode excluir ou modificar outros dados em seu banco de dados.

Muito, muito perigoso. Uma boa idéia para senhas é converter a senha em um hash MD5 e loja que como 'password' do usuário.
1) protege os usuários tenham suas senhas roubadas 2) Se um usuário escreve uma string maliciosa que poderia acabar com a sua entrada / mesa / banco de dados

Além disso, você deve fazer alguma expressão básica match regex no nome para se certificar de que só usa A-Za-Z0-9 e talvez alguns caracteres acentuados (sem caracteres especiais, * 's, <' s,> 's em particular).

Quando os dados de usuário é involed em uma consulta SQL, sempre sanatize os dados com mysql_real_escape_string .

Além disso, você deve armazenar apenas um hash salgado da senha em vez da senha em si. Você pode usar a seguinte função para gerar e verificar um hash salgado com um valor salt aleatório:

function saltedHash($data, $hash=null)
{
    if (is_null($hash)) {
        $salt = substr(md5(uniqid(rand())), 0, 8);
    } else {
        $salt = substr($hash, 0, 8);
    }
    $h = $salt.md5($salt.$data);
    if (!is_null($hash)) {
        return $h === $hash;
    }
    return $h;
}

Todos juntos:

$query = 'SELECT pwd FROM users WHERE name = "'.mysql_real_escape_string($_POST['user']).'"';
$res = mysql_query($query);
if (mysql_num_rows($res)) {
   $row = mysql_fetch_assoc($res);
   if (saltedHash($_POST["pwd"], $row['pwd'])) {
       // authentic
   } else {
       // incorrect password
   }
} else {
   // incorrect username
}

A sua não é seguro, você pode querer olhar para algo como DOP. PHP DOP

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top