É este pedaço de código seguro - PHP && MySQL
-
06-09-2019 - |
Pergunta
<?php
class test_class {
public function __construct() {
}
public function doLogin($username,$password) {
include("connection.php");
$query = "SELECT *
FROM users
WHERE username = '".mysql_escape_string($username)."'
AND password = '".mysql_escape_string($password)."'";
$result = mysql_fetch_array(mysql_query($query));
if(!$result) {
return 'no';
}
else
{
return 'yes';
}
}
}
?>
Os trabalhos de código acima, mas um pouco preocupado se o seu seguro ou não.
Nota: Eu não estou usando o método POST, então eu tenho que recebê-lo como argumentos na função e eu não posso usar.
if (isset($_POST['username']) && isset($_POST['password']))
{
$username= $_POST['username'];
$password= $_POST['password'];
Solução
O código pode ser seguro, mas a implementação não é grande. Você nunca deve armazenar uma senha de autenticação como texto simples. Você deve sal e hash.
Eu poderia passar uma hora explicando o porquê, mas você faria melhor apenas ler este .
Outras dicas
A consulta em si parece seguro, mas se você usou uma interface DB que a ligação parâmetro suportado, como DOP ou Zend_Db, você não teria que examinar cada instrução SQL tão nervosa.
Além disso, as funções mysql-* são praticamente obsoleta; você deve olhar para as funções * mysqli- vez.
Como uma nota lateral estilística, não há nenhum ponto em um construtor vazio, e eu sugiro retornando boolean verdadeiro ou falso em vez de valores de cadeia.
Finalmente, como mencionado em outros lugares, armazenar senhas em texto puro é uma má idéia.
uhh .... você está armazenando uma senha de texto? Isso certamente não é seguro. A senha deve ser hash com um sal usando algo como sha256. Armazenar senhas em texto puro nunca é uma boa idéia.
No. Você não deve armazenar a senha cru em seu banco de dados. Armazená-lo hash (de preferência com um seu sal). Além disso, declarações preparadas são uma escolha melhor do que fugir. Veja este PHP DOP documentação . Como um benefício adicional (além de segurança), eles podem ser mais eficientes.
O código em si parece ok, mas o principal problema que vejo é que você está passando senhas em torno de texto simples.
É a conexão cliente-a-servidor seguro (ou seja, usando SSL) É a conexão de servidor para banco de dados seguro
Se em qualquer caso alguém pode sentar-se no tráfego de arame e relógio passando, então você tem um problema de segurança.
Se fosse comigo, eu definitivamente tem uma conexão SSL entre o cliente e servidor.
Eu tinha certeza que você estava guardando um hash da senha no banco de dados.
E eu alterar seu código para algo como
//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
//Valid
Eu acho que é OK, no entanto, se eu estou preocupado com a segurança, eu armazenar a senha de "username" na variável e compará-lo fora da consulta.