Pergunta

Eu preciso o seguinte script de autenticação terminado. Eu sou fraco em php / DOP, então eu não sei como pedir o número de linhas igualando um e, em seguida, definir o ID da sessão da a partir dos resultados da consulta. Eu preciso não só definir o $ _SESSION [ 'id do usuário'], mas também a [ 'empresa'] eo [ 'security_id'] bem a partir dos resultados.

aqui é o que eu tenho:

$userid   = $_POST['userid'];
$password = $_POST['pass'];
if ( $userid != "" || $password != "" )
{
  $sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'";
  $result = $dbh->query( $sql );
} else
{
  echo "login failed. Your fingers are too big";
}

Informações opcionais: Browser: Firefox

Foi útil?

Solução

Nunca usar esse código!

Você tem uma injeção de SQL muito sério abrir lá. Cada entrada do usuário que você tome, seja de cookies ou CGI, ou onde , deve ser higienizado antes de ser usado em uma instrução SQL. Eu poderia facilmente invadir esse sistema ao tentar um login com um nome de usuário como:

user'; UPDATE contractors SET password = '1337'

... depois do que eu poderia, então, iniciar sessão como qualquer um. Desculpe se eu soar agressivo, mas o que o código faz é como esquecer de trancar a porta da frente para sua empresa, que provavelmente não contém sequer um sistema de alarme.

Note que não importa se a entrada é realmente proveniente do usuário ou não (talvez seja em uma pré-cheia, escondido da). Do ponto de vista da segurança, qualquer que vem de fora em qualquer lugar tem a ser considerado para conter a entrada maliciosa pelo usuário.

Tanto quanto eu sei, você precisa usar a função quote DOP para higienizar corretamente a corda. (No MySQL, isso seria feito com mysql_real_escape_string().) Eu não sou um especialista em DOP, você mente, alguém por favor, corrija se eu estiver errado aqui.

Além disso, você provavelmente não deve armazenar todas as senhas diretamente no banco de dados, mas sim usar uma função hash para criar uma senha mascarado, então também criar um hash da senha do usuário fornecido, e combinar os hashes. Você pode usar a função PHP hash para fazer isso.

Quanto a outras questões, eu não sei se a abordagem que você tem no SQL SELECT é a melhor abordagem. Gostaria apenas de seleccionar a senha do usuário correspondente e tentar combinar que no programa. Eu não acho que haja qualquer falha no método que você está usando, mas ele simplesmente não parece tão lógico, e, portanto, há uma maior chance de me faltando algum bug - que, em caso de senhas e logins criaria uma janela para exploits.

Para fazer do seu jeito, é preciso notar que o resultado que você está recebendo a partir do DOP query é um PDOStatement , que não parecem ter uma função de confiança para diretly contar a quantidade de linhas de resultado. O que você precisa uso é fetchAll que retorna uma matriz de linhas e contar isso. No entanto, como eu disse isso tudo parece-me que ele é aberto para falhas, então eu me sentiria mais seguro verificando a senha no código. Há apenas uma distância muito grande do compasion senha correspondente real para o meu gosto, em tal lugar-crítica de segurança.

Assim, ao obter a senha resultante para o ID de usuário, você pode usar de PDOStatement fetch() que devolve o conteúdo da coluna a partir do resultado. Use por exemplo PDO::FETCH_ASSOC para obtê-los em uma matriz associativa com base nos nomes das colunas.

Aqui está como corrigi-lo:

$userid_dirty   = $_POST['userid'];
$password_dirty = $_POST['pass'];
$success = false; // This is to make it more clear what the result is at the end
if ($userid != "" || $password != "") {
  $userid = $dbh->quote($userid_dirty);
  $passwordhash = hash('sha256',$password_dirty);
  $sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid;
  $result = $dbh->query( $sql );
  if ($result) { // Check if result not empty, that userid exists
    $result_array = $result->fetch(PDO::FETCH_ASSOC);
    if ($result_array['PASSWORDHASH'] == $passwordhash) {
       // login success
       $success = true;

       // do all the login stuff here...
       // such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc. 

    } // else fail, wrong password
  } // else fail, no such user
} else {
  // fail, userid or password missing
  echo ' please enter user id and password.';
}
if (!$success) {
  echo ' login failed.';
}

É claro, o código pode ser limpo um pouco, mas que deve explicar o que precisa ser feito. Note-se que desde que a senha é tanto hash, e não usado no SQL , ele realmente não precisa de limpeza. Mas eu deixei lá apenas no caso, uma vez que no código original que foi usado na consulta.

Note que todas as senhas armazenar o código relativos precisam ser alteradas para armazenar o hash em vez da senha. Além disso, seria uma boa idéia usar um sal adicionado à senha antes de hashing.

Além disso, eu desde que as s de códigoimplica para fins educacionais - Eu apenas pensei que o código era a maneira mais clara para explicar como fazer isso. Portanto, não confunda este site como um serviço para código de pedido. :)

Outras dicas

O php manual do é um excelente recurso para aprender PHP. Parece que você sabe um pouco SQL, e você já ouviu falar de PDO, o que é um bom começo. Se você procurar no Google por "DOP", ou olhar no manual do PHP para o termo, você encontrará o href="http://us.php.net/pdo" rel="nofollow seção DOP do manual. Parece que você encontrou a função ->query, então agora você precisa ver o que que retorna. Indo para o que a função é página manual , vemos que ele retorna um objeto PDOStatement. A palavra PDOStatement é proveitosamente ligada à página relevante no manual, que lista os métodos disponíveis no objeto. Existe um método rowCount() que provavelmente irá fazer o que quiser.

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