webForumDet fria alternativet

Databassäkerhet - inserts & sql injections

6 svar · 740 visningar · startad av Gorill

GorillMedlem sedan feb. 20073 inlägg
#1

Hej,

Jag har en gästbok där data postas från ett formulär in i en MySQL-databas. Alla fält (namn, epost och meddelande) är obligatoriska och har validators, epost-fältet också en regex-validator. Dessutom finns en Captchakontroll (liknande den som används när man registrerar sig i webforum), så att den som postar ett inlägg måste skriva in en kod för att kunna posta formuläret. Ändå lyckas någn j!@%vla spambot el. liknande posta förbi formuläret och skicka in en massa junk i databasen. Visserligen visas inget i gästboken på den publika sidan om inte inlägget aktiveras av admin, men det är tjatigt att sitta och rensa ut allt junk. Någon som känner igen detta och har någon lösning?

Så här ser metoden ut som hanterar postning av formuläret:

protected void Button1_Click(object sender, System.EventArgs e)
    {
        OdbcConnection connection = null;

        if (Page.IsValid)
        {
            try
            {
                connection = new OdbcConnection(ConfigurationManager.AppSettings["ConnectionString"]);
                string InsertString = "Insert into GuestBook(Name,Email,Message,DateSubmitted,IsActive) VALUES (?,?,?,?,?)";

                OdbcCommand myCommand = new OdbcCommand(InsertString, connection);

                myCommand.Parameters.AddWithValue("@Name", SafeSqlLiteral(TextBox1.Text.Trim()));

                myCommand.Parameters.AddWithValue("@Email", SafeSqlLiteral(TextBox2.Text.Trim()));

                myCommand.Parameters.AddWithValue("@Message", SafeSqlLiteral(TextBox4.Text.Trim()));

                myCommand.Parameters.AddWithValue("@DateSubmitted", DateTime.Now);

                myCommand.Parameters.AddWithValue("@IsActive", 0);

                connection.Open();
                myCommand.ExecuteNonQuery();
                myCommand.Connection.Close();

                // Blank the input boxes
                ClearInput();

                // If we make it to here we are ready to save the new post
                Msg.Text = "<br>Your comment has been sent, thank you.";
            }
            catch (Exception ex)
            {
                Msg.Text = ex.ToString();
            }
        }

    }

    private string SafeSqlLiteral(string inputSQL)
    {
        return inputSQL.Replace("'", "''").Replace("|", "");
    }
emissionMedlem sedan dec. 19996 721 inlägg
#2

Eftersom du använder en parametriserad fråga (mycket bra) så är du säkrad mot SQL-injection, och ska inte använda SafeSqlLiteral-funktionen, eftersom den bara kommer att leda till att '-tecken lagras dubbelt i databasen.

Antingen har du en injection-läcka någon annanstans på sajten eller så är din Captcha-kontroll inte tillräckligt bra. Spamrobotarna har inga direkta problem med enklare teckenbaserade Captcha-kontroller.

GorillMedlem sedan feb. 20073 inlägg
#3

Hej, tack för inlägg.

Jag tyckte också det verkade onödigt med SafeSqlLiteral-funktionen, men jag fick rådet av min ISP som hade konsulterat sina programmerare i frågan (hmm...). Jag förstår inte var läckan i så fall skulle kunna vara. Det är ju bara via den här sidan som inlägg postas. Har du några förslag på vad jag ska titta efter? Kan det vara idé att byta lösenord till databasen? I de junk-inlägg som kommer in är alla fält utom meddelandefältet helt tomma (trots att alla fält alltså är obligatoriska), och meddelandefältet innehåller då skrivna hyperlänkar till en massa junksajter.

Captchakontrollen har jag lånat här: http://www.codeproject.com/aspnet/CaptchaControl.asp

PatrikBMedlem sedan mars 20002 836 inlägg
#4

har man inte javascript aktiverat i sin browser (vilket inte spamrobotar brukar ha) så funkar inte de olika validatorerna. De är beroende av javascript på klienten. Det man bör göra, alltid bör göra, är att även kolla detta på "serversidan" att data finns och att data har rätt format som ska sparas till databasen.

cya,
/PatrikB

emissionMedlem sedan dec. 19996 721 inlägg
#5

PatrikB skrev:

har man inte javascript aktiverat i sin browser (vilket inte spamrobotar brukar ha) så funkar inte de olika validatorerna. De är beroende av javascript på klienten.

Nej, det stämmer inte alls. Generell praxis är att validatorerna kan validera på klientsidan om EnableClientScript=true, men det är mer att se som en finess, för att slippa postbacks.

mozillaMedlem sedan juli 20011 084 inlägg
#6

emission skrev:

Nej, det stämmer inte alls. Generell praxis är att validatorerna kan validera på klientsidan om EnableClientScript=true, men det är mer att se som en finess, för att slippa postbacks.

Jag har länge funderat på detta men inte orkat testa själv :r, när man använder de inbyggda validatorerna och man har aktiverat EnableClientScript. Kontrollerar den ändå serverside eller utgår den alltid ifrån att javscriptet klarar av valideringen?

T.ex. om besökaren har en webbläsare som "skall" klara av javascript men har det avstängt ändå?

emissionMedlem sedan dec. 19996 721 inlägg
#7

mozilla skrev:

Kontrollerar den ändå serverside

Ja, den kollar alltid serverside till sist. Klientdelen finns där för att ge snabbt svar och för att det inte ska krävas postback hela tiden, men när sidan väl lyckas gå igenom så tar serversidevalideringen vid.

Det är dock fullständigt teoretiskt möjligt att skapa en validator som validerar olika på server- och klientsidan, men tanken är förstås att de inte ska göra det.

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