Posts
Ola Luiz, tudo bom?
Aparentemente o que esta acontecendo é que em sua comparação não esta trazendo linha alguma.
Pode ser por causa do server.htmlencode:
UserNameHashID = Server.HtmlEncode(Request["ID"]);
Tente retirar o Encode, depois Debug o codigo para comparar o ID recebido com o da sua base de dados.
Depois dê um print usando o QuickWacht ou o Command Window em seu Command (cmd) e execute-o diretamente no Query Analiser de sua base de dados.
E por ultimo, para certificar de que realmente é sua comparação que esta errônea, faça o seguinte em seu codigo, acrescente uma comparação do tipo, if (dr != null), veja o exemplo abaixo:
//Para lêr um registro da tabela baseado no SQLCommand
dr.Read();
if (dr != null)
Response.Write(dr["UserNameID"]);
//Fecha Conexo
conn.Close();
Aguardo seu retorno.
Abraços
Att
Luiz Maia
Olá Luiz boa tarde tentei fz desta forma que vc me disse mas continua dando o mesmo erro
a não ser que eu coloque desta forma no codigo
UserNameHashID = "tc6pCV1TfHoUfIg+4ujvrzTGdLI7SiZQdujyO9H+hnkxQVt/aHvrtkUZthy/zpC3fUkHn4COTql66MeJexrHJA==";
aí ele funciona mas via querystring não
O objetivo pelo qual fiz esse metodo seria a da validação do usuario por email
Onde na pagina de cadastro do usuario via membership o usuário é gravado normalmente na base de dados do membership asp.net sem o HASH
mas na querystring que será enviado para validação do usuário é criada uma outra variavel que o transforma em hash
apos a query recuperada eu tentei anteriormente simplesmente fz a validação desta forma
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Web.UI.HtmlControls;
namespace PainelPSBR
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Verifica se a QueryString nula ou no
if (Request["ID"] != null)
{
//Atribui o usuario recuperado pela QueryString
// variavel string usuario
string usuario = Request["ID"].ToString();
//Mtodo de Cryptografia Hash
//Pesquisa o nome do usuario recuperado e atribuido
// variavel string usuario na classe Membership metodo GetUser
//e o atribui variavel criada userInfo da classe MembershipUser
MembershipUser userInfo = Membership.GetUser(usuario);
//Verifica se userInfo diferente de nulo
//ou seja se for nulo porque no o encontrou
//No cadastro do MemberShip
//Se for diferente de nulo valida e desbloqueia
if (userInfo != null)
{
//Desbloquea o Usuario atraves da Propriedade UnlockUser;
userInfo.IsApproved = true;
//Atualiza os Dados na Base MemberShip
//para Este Usurio
Membership.UpdateUser(userInfo);
Response.Write("Usurio " + userInfo + " Validado com Sucesso!!!");
}
else
{
Response.Write("Usurio no encontrado!!!");
}
}
}
}
Sendo que com a query vinda do email como ID=nomedousuario (sem hash , funcionou) mas como o meu objetivo até por segurança não seria revelar o nome do usuario criei essa variavel ID paralela em HASH para comparação só que não tive êxito ao tentar fz desta forma
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Web.UI.HtmlControls;
using Encrypto;
namespace PainelPSBR
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Verifica se a QueryString nula ou no
if (Request["ID"] != null)
{
//Atribui o usuario recuperado pela QueryString
// variavel string usuario
string usuario = Request["ID"].ToString();
//Mtodo de Cryptografia Hash
MembershipUser HASH(userInfo) = Membership.GetUser(usuario);
//Verifica se userInfo diferente de nulo
//ou seja se for nulo porque no o encontrou
//No cadastro do MemberShip
//Se for diferente de nulo valida e desbloqueia
if (userInfo != null)
{
//Desbloquea o Usuario atraves da Propriedade UnlockUser;
userInfo.IsApproved = true;
//Atualiza os Dados na Base MemberShip
//para Este Usurio
Membership.UpdateUser(userInfo);
Response.Write("Usurio " + userInfo + " Validado com Sucesso!!!");
}
else
{
Response.Write("Usurio no encontrado!!!");
}
}
}
}
}
Dá aí eu tive a ideia de criar uma base e table paralela para ao sêr cadastrado o usuario o mesmo ser cadastrado em campo paralelo em HASH para qdo recebe-se a querystring id recupera-se o campo usuario normalmente e o compara-se com essa rotina, mas como vc pd ver nesta minha duvida não deu certo
caso não haja outra alternativa para seguir os moldes de validação de email do hotmail (eles acredito eu que usam HASH no usuario para validar)
o que vc me orientaria a fz e como me orientaria, lembrando que o username da querystring e não do membership tem que ficar em HASH?
fico no aguardo e desde já agradeço
Ola Luiz,
Estive olhando no site da proprie Microsoft e o problema pelo que vi é o C# mesmo.
Na sintaxe do C#, o @ tem significado especial, por tanto ao usar o HASH, vc precisa de usar uma barra antes do @, veja um exemplo abaixo:
paramArray[2] = new SqlParameter("\@lastname", SqlDbType.NVarChar);
paramArray[2].Value = txtLastName.Text;
No seu caso, ficaria assim:
cmd.Parameters.AddWithValue("\@UserNameHashID", UserNameHashID);
Também do site da MS este exemplo:
string password = Console.ReadLine();
SaltedHash sh = SaltedHash.Create(password);
// imagine storing the salt and hash in a database
string salt = sh.Salt;
string hash = sh.Hash;
Console.WriteLine("Salt: ", salt);
Console.WriteLine("Hash: ", hash);
// after looking up salt and hash, verify a password
SaltedHash ver = SaltedHash.Create(salt, hash);
bool isValid = ver.Verify(password);
http://msdn.microsoft.com/en-us/magazine/cc164107.aspx
Aguardo um retorno seu.
Att
Luiz Maia
Olá Luiz
Tentei fazer deste jeito mas aí me retornou outro erro veja o codigo como ficou e o erro que me retornou
O Codigo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace PainelPSBR
{
public partial class VerificarUsuarioEmailReader : System.Web.UI.Page
{
public string _connectionString = WebConfigurationManager.ConnectionStrings["MembershipConnection"].ConnectionString;
public string Sql = "Select * from psbr_Validaemail where UserNameHashID = \@UserNameHashID";
public string UserNameHashID;
protected void Page_Load(object sender, EventArgs e)
{
//Recupera UserNameHashID
UserNameHashID = Request["ID"];
// Response.Write(UserNameHashID);
//Cria A Conexo
SqlConnection conn = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand(Sql, conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("\@UserNameHashID", UserNameHashID);
//Abre Conexo
conn.Open();
//Executa o comando Reader;
SqlDataReader dr = cmd.ExecuteReader();
//Para lr um registro da tabela baseado no SQLCommand
dr.Read();
if(dr!=null)
Response.Write(dr["UserNameID"]);
//Fecha Conexo
conn.Close();
}
}
}
O erro retornado
Erro de Servidor no Aplicativo '/'.
The parameterized query '(@UserNameHashID nvarchar(4000))Select * from psbr_Validaemail w' expects the parameter '@UserNameHashID', which was not supplied.
Descrição: Ocorreu uma exceção não tratada durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.
Detalhes da Exceção: System.Data.SqlClient.SqlException: The parameterized query '(@UserNameHashID nvarchar(4000))Select * from psbr_Validaemail w' expects the parameter '@UserNameHashID', which was not supplied.
Erro de Origem:
Linha 37:
Linha 38: //Executa o comando Reader;
Linha 39: SqlDataReader dr = cmd.ExecuteReader();
Linha 40:
Linha 41: //Para lêr um registro da tabela baseado no SQLCommand
Fico no aguardo e desde já agradeço
Luiz, é somente nos parametros, não precisa usar na string SELECT como abaixo:
Select * from psbr_Validaemail where UserNameHashID = \@UserNameHashID
Retire a barra daqui e teste novamente por favor.
Deixe a barra somente na adição dos parametros.
Aguardo
Att
Luiz Maia
Olá Luiz
Retirei a barra do Select como vc pediu mas originou este erro
Error 1 Unrecognized escape sequence D:\MinhasWebApp\VS2008\PainelPSBR\PainelPSBR\VerificarUsuarioEmailReader.aspx.cs 33 43 PainelPSBR
Vou deixar comentada com 3 barras a frente a linha 33 onde acontece o erro
Abaixo o codigo atualizado mas que deu erro na linha 33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace PainelPSBR
{
public partial class VerificarUsuarioEmailReader : System.Web.UI.Page
{
public string _connectionString = WebConfigurationManager.ConnectionStrings["MembershipConnection"].ConnectionString;
public string Sql = "Select * from psbr_Validaemail where UserNameHashID = @UserNameHashID";
public string UserNameHashID;
protected void Page_Load(object sender, EventArgs e)
{
//Recupera UserNameHashID
UserNameHashID = Request["ID"];
// Response.Write(UserNameHashID);
//Cria A Conexo
SqlConnection conn = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand(Sql, conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("\@UserNameHashID", UserNameHashID);/// Linha 33 onde acontece o erro
//Abre Conexo
conn.Open();
//Executa o comando Reader;
SqlDataReader dr = cmd.ExecuteReader();
//Para lr um registro da tabela baseado no SQLCommand
dr.Read();
if(dr!=null)
Response.Write(dr["UserNameID"]);
//Fecha Conexo
conn.Close();
}
}
}
Fico no aguardo e desde já agradeço
Fic
Ola Luiz, tudo?
Pesquisei sobre este bug, e encontrei a seguinte explicação da Microsfot:
Figure 3 shows an example of a very buggy piece of code that can be exploited by an attacker. Every line of this code has a bug. The Assert statement prevents a stack walk that would keep partially trusted code from accessing the database. The database connection string uses the sa account, which if misused could severely damage or destroy the database. The SQL statement is concatenated so that it incorporates unfiltered external input in the form of a name and a password. This constitutes a SQL injection vulnerability, as an attacker could use the name and password to inject malicious SQL statements! There are so many things wrong with this code, and yet sadly it's typical code that you'd see in a database programming example. If an unsuspecting programmer cuts and pastes code like this into his source file, he's opening security holes. A code audit would catch these bugs, but code is frequently shipped without proper security testing.
Figure 3 Do Not Use
public class HopeThisIsntUsedByEvilCodeBecauseItsNotRobust {
public string Name;
public string Password;
// this entire function consists of horribly bad code
// you should NEVER EVER use
public bool IsValidUser() {
new DbDataPermission(PermissionState.Unrestricted).Assert();
SqlConnection conn = new SqlConnection(
"initial catalog=accounts;user id=sa;password=;")
conn.Open();
cmd.CommandText = string.Format(
"select count(*) from users where name=''" +
"and password=''", Name, Password);
return ((int)cmd.ExecuteScalar()) > 0;
}
}
Segue o link:
http://msdn.microsoft.com/en-us/magazine/cc164107.aspx
Sugiro vc dar uma olhada nestas bibliotecas, caso não tenho acesso me avise que providencio para vc gratuitamente.
Acredito q, com estas video aulas vc consiga elucidar seu desenvolvimento, se ainda sim persistir algum tipo de duvida, me contate novamente, ok?
https://www.devmedia.com.br/articles/viewcomp.asp?comp=5878
https://www.devmedia.com.br/articles/viewcomp.asp?comp=11300
Abraços
Att
Luiz Maia
Olá Luiz
Boa Noite
Só para eu têr uma confirmação...o que ele quis dizer é que eu não posso usar usuário sa para fz esse tipo de validação eu tenho que criar um user id é isso mais senha se for isso como eu faço com bases de dados ou tables que eu tenho hospedado em provedores de hospedagem sendo que o usuario padrão que começa dos dois é sanomedominio eu uso os provedores de base de dados sqlserver plugin e kinghost e não sei se via sqlserver eles permitem eu ter acesso administrativo em minha base para criar o meu proprio usuario sem ser o sa deles como eu resolveria isso neste caso se for isso o problema
Fico no aguardo e desde já agradeço
Ola Luiz, não tem haver com o usuario sa, e sim com a istrução select que recupera.
Mas de qualquer forma, vamos tentar fazer o seguinte:
Para autenticar o usuário, faça o seguinte:
string strUserInputtedHashedPassword =
FormsAuthentication.HashPasswordForStoringInConfigFile(
tbPassword.Text, "sha1");
if(strUserInputtedHashedPassword == GetUsersHashedPasswordUsingUserName(tbUserName.Text))
{
// sucesso
}
else
{
// falhou} E com este codigo, vc cria uma string Senha com o hash: protected TextBox tbPassword;
protected Literal liHashedPassword;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}
public void btnHash_Click(object sender, EventArgs e)
{
if(tbPassword.Text.Length > 0)
{
string strHashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(tbPassword.Text, "sha1");
liHashedPassword.Text = "Hashed Password is: " + strHashedPassword;
}
} Veja este website que simula criação de codigos Hash:http://www.csharpfriends.com/demos/password-hashing.aspx AbraçosQualquer coisa me avise.AttLuiz Maia
Ola Luiz,
Como esta indo?
Aguardo retorno, ok.
Abraços
Att
Luiz Maia
Luiz,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
Ola Luiz,
Como não obtivemos retorno de sua soliticitação, estamos procedendo com o fechamento do chamado. Caso a dúvida ainda persista você pode reabrí-lo.
Estamos a sua disposição para qualquer dúvida.
Abraços
Att
Luiz Maia
Olá Luiz - Boa Noite
O Metodo de Hash eu já tenho o que eu preciso é que o mesmo seja reconhecido e comparado com um valor da base de dados que também estaria em hash se isso for possivel, mas acho que já vi que não é possivel então utilizarei o guid - simetricamente e um outro parametro hash para fzer a rotina da comparação e validação do email
mas desde já agradeço
Blz Luiz,
Caso tenha alguma duvida usando o GUID, me avise, ok?
Abraços
Att
Luiz Maia
A unica duvida que eu tenho perante a ele é como utilizá-lo numa mesma rotina de cadastro de usuário
fico no aguardo e desde já agradeço