webForumDet fria alternativet

Ang. inloggningar

.NETur .NET

13 svar · 595 visningar · startad av Prästen

Medlem sedan dec. 2000537 inlägg
Frågan#1

Tjenare. vill starta en diskussion om säker inloggning.

Jag har en sida där man skriver in sitt login och sin kod, sen använder jag LoginTextBox.Text och KodTextBox.Text och gör en SELECT, såhär:

SELECT * FROM users WHERE login='" + LoginTextBox.Text + "' AND kod=" + KodTextBox.Text + "

Men detta är ju inget bra sätt att göra det, eftersom i Textboxformulären så får ju användaren direkt access till Databasen ju, för att nån klurig jäkel §jr kan ju skriva in ett giftigt SQL kommando som raderar hela databasen eller nåt, så det var därför jag funderade om ni kanske har nåt tips på säker inloggning?.

Medlem sedan mars 2000126 inlägg
#2

Login

Du borde väl lägga LoginTextBox.Text värdet i en variabel som du sen lägger i din sql-sträng.

	string strUser = ((TextBox)e.Item.FindControl("txtUser")).Text;
	string strPass = ((TextBox)e.Item.FindControl("txtPass")).Text;

	string sql = "SELECT * FROM skivor WHERE User='" + strUser + "' AND Pass='" + strPass + "'";

//Broskan

Medlem sedan dec. 20003 563 inlägg
#3

Om du inte skall köra med SP så borde en funktion som tar bort "olagliga" tecken vara en självklarhet.

Med olagliga tecken menar jag alla utom a-z A-Z 0-9 _ & @ t.ex.
', " och % vill man ofta ha bort då dessa kan utnyttjas genom SQL-injections.

Medlem sedan dec. 2000537 inlägg
#4

men finns det inte ett bättre sätt så att användaren inte alls får tillgång till databas-queries SQL?.

Medlem sedan juli 20011 304 inlägg
Medlem sedan apr. 20012 266 inlägg
#6

Har inte hittat någon bra sida som går igenom parameters i sqlsatsen ännu men det fungerar ungefär som stored procedures parametrarna och gör att användaren inte får direkt access att göra egna frågor till databasen.

http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOleDbOleDbCommandClassParametersTopic.asp?frame=true

Medlem sedan dec. 2000537 inlägg
#7

uuuh, stored procedures e krångligt, finns det nåt annat sätt?, text lägga upp alla användarna i ett dataset och itera i det efter namnet istället?.

Medlem sedan juli 20011 304 inlägg
#8

Det är inga konstigheter med parametriserade frågor :)

void btnAddEntry_Click(object sender, EventArgs e)
    {
        //Create connection object
        SqlConnection conn = new SqlConnection(
            "data source=MyServer;initial catalog=Guestbook;"
            + "integrated security=SSPI;");

        //Create command object
        SqlCommand cmd = new SqlCommand(
            "INSERT INTO Entries (UserName, Message) "
            + "VALUES(@UserName, @Message)", conn);
        
        //Create and add parameters
        SqlParameter pUserName = new SqlParameter("@UserName", SqlDbType.NVarChar, 20);
        pUserName.Value = Server.HtmlEncode(txtName.Text);
        cmd.Parameters.Add(pUserName);
        
        SqlParameter pMessage = new SqlParameter("@Message", SqlDbType.NVarChar, 1000);
        pMessage.Value = Server.HtmlEncode(txtMessage.Text);
        cmd.Parameters.Add(pMessage);

        //Insert entry into database
        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
    }

Detta är en insert. Det funkar precis likadanrt med en select.

Medlem sedan dec. 2000537 inlägg
#9

så man behöver inte ändra i databasen eller något sådant utan det är bara å köra som vanligt?.

Medlem sedan juli 20011 304 inlägg
#10

Visst är det bara att köra som vanligt!
Ditt SqlCommand ska innehålla antingen namnet på en Stored procedure ellr en helt vanlig sträng med en sql-fråga (vilket verkar vara de du är ute efter)

Trixet med det hela är SqlParametrarna...

Medlem sedan dec. 2000537 inlägg
#11

hm hur göra man en stored procedure?

Medlem sedan juli 20011 304 inlägg
#12

Det gör man lättast i sql-server manager eller i vs.net under server connections.
Men du behöver som sagt inte göra en stored procedure. Vet du vad? Jag tror att jag ska slänga ihop ett exempel så kanske du förstår hur jag menar :)

c#


protected System.Web.UI.WebControls.Label Msg;
		protected System.Web.UI.HtmlControls.HtmlInputText UserLogin;
		protected System.Web.UI.WebControls.Button Button1;
		protected System.Web.UI.HtmlControls.HtmlInputText UserPass;

private void Button1_Click(object sender, System.EventArgs e)
		{
string temp = ConfigurationSettings.AppSettings["connstr"].ToString(); 
		SqlDataReader dr;

		SqlConnection connection = new SqlConnection(temp);
		SqlCommand command = new SqlCommand("SELECT * FROM users WHERE login=@strLogin AND kod=@strPass", connection);
		command.CommandType = CommandType.Text;
		command.Parameters.Add("@strLogin", Server.HtmlEncode(UserLogin.Value.Trim()));
		command.Parameters.Add("@strPass", Server.HtmlEncode(UserPass.Value.Trim()));

		try 
		{

			connection.Open();
			dr = command.ExecuteReader();

			if(dr.Read())
			 {
FormsAuthentication.RedirectFromLoginPage(UserLogin.Value, false);
	
			}
			else 
			{
				Msg.Text = "Nej Du!";
			}
		}

		catch(Exception myException) 
		{
			Msg.Text = "SQL-fel: " + myException.Message;
		}
		finally	
		{
			connection.Close();
		}
}
Medlem sedan dec. 2000537 inlägg
#13

hmm, jag tror jag förstår, så det är Parameters.add man använder så den ska förstå vad "@strLogin" är för något, vilket värde eller variabel "@strLogin" representerar. eller?

Medlem sedan juli 20011 304 inlägg
#14

Precis :)

Om man sen vill göra en stored procedure någon gång så anger man inparametrarna i den på precis samma sätt... Så det är väldigt lätt att ändra i efterhand

140 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)