[Alg] Safe Code part II - SQL en HTML injection tegengaan

Pagina: 1
Acties:
  • 161 views sinds 30-01-2008
  • Reageer

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22

Ik kon een ouder topic van mij omhoogschoppen, maar ik denk dat het opportuner is om met een schone lei te beginnen. ;)

Sedert enkele weken/maanden ben ik zo lichtjes aan 'into webapplication development' gegaan.
Nu, zoals jullie wel weten moet je 'users' en de 'evil buitenwereld' niet al teveel vertrouwen als het gaat om user-input in je databank. Iemand met kwade bedoelingen zou wel eens javascript / SQL of andere ongewenste meuk in je databank kunnen proppen en zo je applicatie/data naar de vaantjes kunnen helpen.

Nu zat ik me af te vragen hoe je die ongewenste input het best opvangt en waar je die het best opvangt (zie ook dit topic).

Je kunt bepaalde input (namen, emailadressen, ...) met regular expressions gaan 'validaten' en eventueel ongewenste karakters eruithalen of een melding geven dat er ongewenste karakters inzitten.

Daarnaast kan je ook in .NET dmv HttpServerUtility.HtmlEncode je data gaan escapen en die dan zo in de databank gaan zetten. Ingegeven < en > karakters enzo blijven dan gewoon bestaan, maar zullen in het geval van bv <b></b> niet als html aanzien worden.

Qua SQL gebruik ik altijd/meestal enkel stored procedures om gegevensmanipulatie/selectie te verwezenlijken. Dan moet je natuurlijk er wel voor zorgen dat de gebruikers enkel de rechten hebben om die SP's uit te voeren.


Nu, zijn er nog andere/betere manieren om die ongewenste input te voorkomen? Hoe vang je die het beste op? Waar vang je die het beste op? In je business logic, presentatie-laag, data-laag? In alle lagen?

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
http://msdn.microsoft.com...us/dnbda/html/distapp.asp

De guide is erg uitgebreid en bevat o.a. secure coding regels. Er zijn meer artikelen hierover op MSDN te vinden overigens :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
Hmm. Thx. * whoami is printing. :Y)

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Maar ik was eigenlijk op zoek naar dit artikel: ik wist dat ik het gezien had: :)
http://msdn.microsoft.com...nnetsec/html/openhack.asp

Dit artikel gaat over hoe secure websites te maken, o.a. wat jij wilt (inputvalidation etc).

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
EfBe schreef op 19 december 2002 @ 20:31:
Maar ik was eigenlijk op zoek naar dit artikel: ik wist dat ik het gezien had: :)
http://msdn.microsoft.com...nnetsec/html/openhack.asp

Dit artikel gaat over hoe secure websites te maken, o.a. wat jij wilt (inputvalidation etc).


Idd, daar wordt eea besproken over beveiliging mbhv validator controls, regex'en, en ook die HmlEncode komt erin voor.

Voordat ik m'n gegevens nu in m'n db opsla (en die gegevens mogen >, <, andere tekens bevatten), dan doe ik bv:
code:
1
blObject.Name = Server.HtmlEncode (txtNaam.Text);

Indien die data enkel alfanumerieke en numerieke karakters mag bevatten, maak ik gebruik van RegExpValidators.

Ik maakte vroeger ook al gebruik van Stored Procedures om data te verkrijgen/manipuleren.

Zodus, ik denk dat ik wel 'veilig' bezig ben. :7

https://fgheysels.github.io/


  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 07-09 20:13
whoami schreef op 19 december 2002 @ 22:39:
Voordat ik m'n gegevens nu in m'n db opsla (en die gegevens mogen >, <, andere tekens bevatten), dan doe ik bv:
code:
1
blObject.Name = Server.HtmlEncode (txtNaam.Text);
Dit is inderdaad een mogelijkheid. je moet er echter wel aan denken dat je dan alle tekens met vreemde accenten, als &[code]; opslaat. Het is dan alleen bruikbaar in html-pagina's.
Vandaag was ik bij een klant die de ingevoerde gegevens via een access-rapport wilde afdrukken, en dan krijg je dus al die codes ook te zien. Om de data transparant op te slaan vindt ik dit dus niet de beste oplossing. Ik zie liever code die de data goed valideert en de tekst zo 'origineel' mogelijk opslaat (dus alleen ' vervangen door '' zou dan genoeg zijn). Bij de klant heb ik dus het HTML-encoden voor het opslaan omgebouwd tot het HTML-encoden na het weer ophalen van de data uit de database.

[ Voor 9% gewijzigd door Mart! op 19-12-2002 22:49 . Reden: typo's ]


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
whoami schreef op 19 December 2002 @ 20:03:
Nu, zijn er nog andere/betere manieren om die ongewenste input te voorkomen? Hoe vang je die het beste op? Waar vang je die het beste op? In je business logic, presentatie-laag, data-laag? In alle lagen?
Puur functioneel gezien is het omzetten van rauwe informatie (in dit geval strings) in een informatieboom (een bericht, of een verzoek om informatie (simpel gezegd een sql query, alhoewel dat eigenlijk weer een platte representatie is van voornoemde (boom)structuur)) de taak van de presentatielaag. Hoe je dit in de praktijk het beste aan kunt pakken, hangt helemaal af van je platform en opzet.

Pas de replâtrage, la structure est pourrie.


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
Mart! schreef op 19 december 2002 @ 22:48:
[...]


Dit is inderdaad een mogelijkheid. je moet er echter wel aan denken dat je dan alle tekens met vreemde accenten, als &[code]; opslaat. Het is dan alleen bruikbaar in html-pagina's.
Vandaag was ik bij een klant die de ingevoerde gegevens via een access-rapport wilde afdrukken, en dan krijg je dus al die codes ook te zien. Om de data transparant op te slaan vindt ik dit dus niet de beste oplossing. Ik zie liever code die de data goed valideert en de tekst zo 'origineel' mogelijk opslaat (dus alleen ' vervangen door '' zou dan genoeg zijn). Bij de klant heb ik dus het HTML-encoden voor het opslaan omgebouwd tot het HTML-encoden na het weer ophalen van de data uit de database.


Daar zeg je me wat....
Eigenlijk kan ik dan best idd die data niet encoden bij het opslaan, maar bij het weergeven op m'n webapp in de presentation layer.
't Probleem is dan wel het volgende:
Wat als ik bv. DataGrids/DataLists op m'n pagina staan heb, waar ik gebruik maak van databinding om die data weer te geven. Dan kan ik - denk ik - geen gebruik maken van die HtmlEncode...

https://fgheysels.github.io/


  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 07-09 20:13
whoami schreef op 19 December 2002 @ 22:54:
Wat als ik bv. DataGrids/DataLists op m'n pagina staan heb, waar ik gebruik maak van databinding om die data weer te geven. Dan kan ik - denk ik - geen gebruik maken van die HtmlEncode...
De vraag is natuurlijk of het bij data-bound datagrids nodig is om HTML-encoding te gebruiken. Ik heb dit nog niet getest maar ik kan me voorstellen dat bijvoorbeeld in .NET het in een grid weergeven van de data prima werkt en dat het datagrid het encoden voor zijn rekening neemt, als dit nog niet is gedaan?

Acties:
  • 0 Henk 'm!

  • Scharnout
  • Registratie: November 2000
  • Laatst online: 10-04-2024

Scharnout

Meuk

Heel simpel en duidelijk voor de beginnende asp-n00b of voor iemand die niet weet wat SQL-injection of cross site scripting is hebben de meer dan geweldige 4 mannen uit rolla hetvolgende:
http://www.4guysfromrolla.com/webtech/112702-1.shtml
Leuk artikel. Beetje simpel misschien, maar misschien daarom erg vatbaar.

And Bob's your uncle ...


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
Mart! schreef op 19 december 2002 @ 23:04:
[...]


De vraag is natuurlijk of het bij data-bound datagrids nodig is om HTML-encoding te gebruiken. Ik heb dit nog niet getest maar ik kan me voorstellen dat bijvoorbeeld in .NET het in een grid weergeven van de data prima werkt en dat het datagrid het encoden voor zijn rekening neemt, als dit nog niet is gedaan?
Ik heb het even getest en het loopt toch in het honderd hoor.
Als ik gegevens aan een datagrid bind uit de databank, en in een van de velden staat bv:
code:
1
<script>alert('test')</script>

Dan worden niet alle gegevens getoond, en krijg ik ook geen messagebox.

Als ik waardes in die database heb zoals:
code:
1
<b>test</b>

Dan komt die test idd vetjes op m'n datagrid.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
[nohtml][quote]whoami schreef op 20 December 2002 @ 10:17:
[nohtml]
[...]


Ik heb het even getest en het loopt toch in het honderd hoor.
[/quote]

Die datagrid zorgt er dus niet automatisch voor dat die html-tags niet als html getoond worden.

Ik kan het probleem wel oplossen dmv volgende code:

[code]
DataGrid1.DataSource = dsPersonen;

BoundColumn bc = new BoundColumn();
bc.HeaderText = "Naam";
bc.DataField = Server.HtmlEncode("person_Name");
DataGrid1.Columns.Add (bc);

DataGrid1.DataBind();[/code]


Oeps, te vlug victorie gekraaid. Dit lukt toch niet.... De html-tags worden ook echt als html geinterpreteerd.

[ Voor 11% gewijzigd door whoami op 20-12-2002 12:47 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
toch nog ff kicken misschien... :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22

Ik kick deze nog maar eens....

Ik ben er nog altijd niet uit hoe je het best gegevens die HTML bevatten kunt opvangen als die gegevens in een datalist of datagrid getoond worden.

Ik heb al het volgende geprobeerd:
code:
1
2
<asp:Label id=Label26 runat="server" 
Text='<%# DataBinder.Eval(Container.DataItem, Server.HtmlEncode("Adres")) %>'>


Maar dit werkt toch niet zoals ik stiekem wel verwacht had. Als adres HTML tekens bevat, dan worden die blijkbaar gewoon getoond als HTML

Als ik doe:
code:
1
Text='<%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "Adres")) %>'>


Dan krijg ik een error dat HtmlEncode verkeerde parameters krijgt. Hij wil een string ontvangen, terwijl ik er toch van uitging dat die DataBinder.Eval() een string ging returnen.

Is er nog niemand die tegen dit probleem aangelopen is, en er een goede oplossing voorheeft?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Bijzonder apart. Ik heb net hetzelfde gedaan, en kreeg goed resultaat er uit.

HTML:
1
2
3
4
5
6
7
8
9
10
11
<form id="Form1" method="post" runat="server">
    <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 35px; POSITION: absolute; TOP: 155px" runat="server" AutoGenerateColumns="False">
        <Columns>
            <asp:BoundColumn DataField="blaat"></asp:BoundColumn>
            <asp:TemplateColumn>
            <ItemTemplate >
            <asp:Label id=Label26 runat="server" Text='<%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, ("blaat2"))) %>'></asp:Label></ItemTemplate>
            </asp:TemplateColumn>
        </Columns>
    </asp:DataGrid>
</form>


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable()
        dt.Columns.Add(New DataColumn("blaat", GetType(Integer())))
        dt.Columns.Add(New DataColumn("blaat2", GetType(String())))

        Dim dr As DataRow = dt.NewRow
        dr("blaat") = 1
        dr("blaat2") = "<b>blaat</b>"
        dt.Rows.Add(dr)

        Me.DataGrid1.DataSource = dt
        Me.DataGrid1.DataBind()

    End Sub


Dit werkt bij mij dus goed. Je kan eens proberen om het om "een functie heen te wrappen"; verder met debuggen kan je eens kijken of er uberhaupt een waarde inzit en wat je evt. terugkrijgt.

Zie ook: http://aspnet.4guysfromrolla.com/articles/072102-1.aspx

[ Voor 24% gewijzigd door gorgi_19 op 05-06-2003 22:01 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22

:(

Vreemd, bij mij geeft die code (in C# dan wel) volgende error :
Compiler Error Message: CS1502: The best overloaded method match for 'System.Web.HttpServerUtility.HtmlEncode(string)' has some invalid arguments

Source Error:
Text='<%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, ("Titel"))) %>'>

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

:P Je schijnt bij C# hem expliciet naar een string te moeten casten. :P
HTML:
1
2
<%#Server.HtmlEncode((string)DataBinder.Eval( Container.DataItem,
"notes" )) %>


You need to explicitly case these things in C# because the result of the
DataBinder.Eval statement isn't a string. VB.NET is a little smarter
than C# in this way.
>:)

[ Voor 72% gewijzigd door gorgi_19 op 05-06-2003 22:20 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
Inderdaad, dat was de oplossing.

Trouwens, dat heeft niets met 'smartheid van VB.NET' te maken volgens mij. Als je weak-typing off zet in VB.NET, zal het waarschijnlijk ook niet gaan.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 05 June 2003 @ 22:22:
Inderdaad, dat was de oplossing.

Trouwens, dat heeft niets met 'smartheid van VB.NET' te maken volgens mij. Als je weak-typing off zet in VB.NET, zal het waarschijnlijk ook niet gaan.
* gorgi_19 knows.. 't is alleen altijd leuk om de VB.Net vs. C# discussie levend te houden.. :+

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1