Har precis som Mads Kristensen märkt av att attacker med URL-injektioner har ökat det senaste.
På en sajt har jag fått in anrop som ser ut ungefär som här:
http://www.examplesite.com/product.aspx?categoryid=0 and user>0 http://www.examplesite.com/product.aspx?categoryid=0 ' and user>0 and ''='
URLerna är påhittade men på slutet av dem ser ni hur roboten lägger till extra strängar i parametern. Jag hade inte tänkt på att skydda mot detta och det blev error när sidan försökte konvertera parametern till en integer.
För att undervika fel kan man använda TryParse istället för Convert.ToInt32 (om man nu vart lika oförsiktig som jag från början).
int categoryId = -1; Int32.TryParse(Request.QueryString["categoryid"], out categoryId);
Läs mer på MSDN eller i kommentarerna till ett inlägg hos CodeBetter.com.
På de dyrare licenserna av MS SQL Server så får man med Profiler som är ett bra verktyg för att se vilka querys som körs. Denna funktion finns tyvärr inte på SQL Server Express.
Programmet bjuder inte på några fantastiska finesser men klarar av det grundligaste. Förhoppningsvis blir det bättre i framtida versioner. Tack till vår Glenn för fyndet.
Uppdatering 10920 av AJAX Control Toolkit släpptes för lite mer än en vecka sen. Har installerat den på ett eget projekt idag och allt verkar fungera bra.
Uppdateringen innehåller inga ändringar som förstör gammal funktionalitet utan bjuder istället på många buggfixar. Man behöver inte modifiera Web.Config på något sätt utan det är bara att byta ut AjaxControlToolkit.dll mot den nyare versionen. Filerna finns att ladda ner på CodePlex.
Delay's blog går in lite djupare och berättar även att man hade planerat att inkludera ett förbättrat ramverk för testning. Man hann dock inte med att få klart det i tid utan beslutade sig för att skjuta på det till framtiden. Något att se fram emot till nästa uppdatering med andra ord.
Hade lite problem med att en ImageButton gjorde postback hela tiden, fast jag ville köra ett eget JavaScript. Trixet är att se till att return false; är med i slutet av JavaScript-anropet som jag läste om här.
De flesta har någon gång stött på problemet med att man vill spara information mellan olika sidor och/eller olika postbacks. Då blir sessions ofta en sista utväg om något annat alternativ inte går att använda. Här visar vi ett enkelt och snyggt sätt att använda Sessionobjectet som vilken variabel som helst. Vi visar hur man enkelt kan spara en arraylist i en session.
public ArrayList NewProducts { get { if (Session["newProducts"] == null) { return new ArrayList(); } else { return Session["newProducts"] as ArrayList; } } set { Session["newProducts"] = value; } }
Det är en property som håller en session internt. Bara att tilldela och ta ut som en vanlig variabel. Behöver aldrig kontrollera och skapa session vid första användandet. Ofta resulterar det i att det står if(Session["newProducts"]!= null) överallt i koden, men det slipper man nu.
Häromdan publicerade GnuCitizen exempel på hur ett säkerhetshål i Quicktime kan utnyttjas till att att komma åt underliggande funktioner i webbläsaren Firefox. Och inte nog med det. Det visar sig även att det går att få tillgång till användarens operativsystem och program.
På bloggen visas ett "snällt" exempel på hur man kan starta miniräknaren i Windows genom att lägga in extrakod i Quicktime-koden. Man visar även hur man kan stänga av användarens dator. Vad för riktiga elakheter man kan hitta på med detta vill jag inte ens tänka på.
Så nu gäller det att se upp om man använder Windows och Quicktime. Rapporter visar på att även Opera och Internet Explorer kan vara sårbara för av denna säkerhetsbrist.
Ett sätt att skydda sig med Firefox verkar vara att installera tillägget NoScript. Det finns också tips om att använda ett alternativ till Quicktime som t ex Quicktime Lite.
Apple har vetat om detta säkerhetsproblem ett bra tag men inte gjort något åt det. Hoppas de börjar lyssna nu när man förstår vilken skada som det kan ställa till med hos webbsurfare.
Man kan tro att det är världens enklaste sak att kopiera en rad från en GridView till en annan. Men den metoden många försöker med först resulterar ofta i "This row already belongs to another table". Här visar vi en enkel metod för att lösa problemet.
DataTable newtable = new DataTable(); DataTable temptable = new DataTable(); CheckBox cb; BLL bll = new BLL();//Our Business Layer foreach(GridViewRow row in GridView2.Rows) { if (row.RowType == DataControlRowType.DataRow) { cb = row.FindControl("CheckBox1") as CheckBox; if (cb.Checked == true) { temptable.Clear(); temptable = bll.GetItem(Convert.ToInt32(row.Cells[0].Text)); newtable.ImportRow(temptable[0]); } } } GridView3.DataSource = newtable; GridView3.DataBind();
Trixet är alltså att skapa en tabell med den raden man vill kopiera och sedan importera den till en ny tabell. Det gå inte att bara flytta över DataRowObjektet utan att få ett fel.
Denna koden kopierar alla rader som är "checked" från gridview2 till gridview3
cell[0] innehåller Id i gridview 2. (row.datakey skulle säkert funka lika bra)