teisipäev, 21. september 2010

Pimesüstimisautomaadi takistamine veateate edastamise juhusliku viivitamisega

Blind Injection (pimesüstimine) on meetod kus serverisse saadud päringu vastusest ei loe otse välja sind huvitavat infot vaid selle teadasaamiskes tuleb kasutada meetodid, kus näiteks kontrollitakse, kas veateade tuli või ei tulnud.
Pimesüstimise erijuhtum on ajaliselt vastuse saabumise mõõtmine.

Mõned SQL pimesüstimise meetodid on mul kirjeldatud Arvutimaailma artiklis
www.am.ee/sql

Ründaja elu saab raskemaks teha, kui panna teatud juhuslikkus sisse veateate tagastamisse, ehk
web.config failis otsib rida customErrors, kus vigade korral suunab endatehtud veateadete veebilehele,

customErrors defaultRedirect="MinuError.aspx" redirectMode="ResponseRewrite"

MinuError.aspx on veebileht, kuhu kasutaja vea ilmumisel suuname ja sinna ehitab sisse
juhusliku ajalise viivitamise Page_Load meetodisse

//kõigepealt püüab veateate kinni
Exception ex = Server.GetLastError().GetBaseException();
if (ex != null)
{
//tark on veateated kodeerida XSS rünnakute vastu
this.LiteralViga.Text = Server.HtmlEncode(ex.Message.Trim());

// see osa teeb veateate andmisel juhusliku ajalise viivituse, et vältida veateadete vastuste põhjal andmete leket pimesüstimise meetodit kasutades
//veateate vastuse saadame tagasi teatud juhtudel juhusliku pausi järel
byte[] delay = new byte[1];
System.Security.Cryptography.RandomNumberGenerator rnd = new System.Security.Cryptography.RNGCryptoServiceProvider();
rnd.GetBytes(delay);
int viiv = (int)delay[0];

if (viiv < 25) //veateadet ei saada kohe vaid teeb juhusliku pikema ajalise pausi sisse mõningatel juhtudel
{
viiv=viiv*666; //ka mina olen kuri :)
System.Threading.Thread.Sleep(viiv);
IDisposable disposable = rnd as IDisposable;
if (disposable != null)
{ disposable.Dispose(); } //mälu vabaks
}
}

Alati võib ise mõelda välja parema juhusliku numbri genereerimise meetodi ja otsustada kuna viivitust rakendada

neljapäev, 19. august 2010

Mitte iga pakkfaili op.süsteemi käsurea käsku ei saa SQL SERVER-i tööna jooksutada

Vaja näiteks andmebaasi tööna käima tõmmata pakkfail.
Seadistab SQL Server Agent-i alt töö ära Type = Operating System (CmdExec) ja tõmbab pakkfaili sisu Command aknasse sisse (asja mõte kustutada D:\TEMP kataloogist kõid PDF ja DOC failid)

d:
cd \temp
del *.pdf
del *.doc

aga töö jooksutamisel tuleb selline viga ette

The process could not be created for step 1 of job 0x... (reason: 5). The step failed.

Kui nüüd teha SQL Server Agent-ile proxy ja mandaat ja käivitada töö sobiva kasutaja õigusega saad ikka sama vea

Häda selles, et Server Agentile kõik käsurea asjad ka seeditavad pole, ehk

d:

mis muidu vahetab käsureal kettaseadet aga SQL Server Agentile kohe mitte ei meeldi ja veateadet pillubki

Lahendus 1 (kustuta otse kataloogi nime ette andes)
del d:\temp\*.pdf
del d:\temp\*.doc


Lahendus 2 (tee kettaseadme vahetus cd käsuga)
cd d:
cd \temp
del *.pdf
del *.doc

teisipäev, 17. august 2010

pages smartNavigation="True" IE8-ga enam ei tööta

Juba alates .NET 2.0 on smartNavigation="True" direktiiv ebasoovitav aga ASP.NET 4.0 ja IE8 teeb nüüd web.config failis pages sektsioonis smartNavigation="True" kasutamise võimatuks, kuna IE8 sirvides veebilehed enem ei tööta ja loobivad erinevaid vigu ette.

Samas Firefox, Opera, Safari ei kobise smartNavigation="True" peale midagi.

Lahendus on kasutada uuemat direktiivi maintainScrollPositionOnPostBack="True"

reede, 6. august 2010

VisualStudio 2010 debugeri käima ajamine JavaScripti jaoks IE8-ga

Kui mingil põhjusel ei debugi JavaScripti VisualStudio 2010 all ja oled kontrollinud
,et nii IE8 seadetest Options -> Advanced -> Browsing -> märkeruut "Disable Script debugging" on maha võetud ja VisualStudio2010 Solution Property Pages -> Start Options on degugimine märgitud nii nagu vaja aga ikka keeldub JavaScripti silumast võib abi olla sõna
"debugger" kirjutamisest otse JavaScripti koodi no näiteks nii

function onSucceed(result, userContext, methodname) {
debugger;
if (KOnimet != null) {
KOnimet.value = result;
}
else {
if (result.length > 0) {
alert(result);
}
}
}

teisipäev, 8. juuni 2010

ScriptManageri EnableHistory="true" töötamine IE8 peal

Kõik nagu õieti tehtud

<asp:scriptmanager id="ScriptManager1" runat="server" enablehistory="true" enablesecurehistorystate="true" >
</asp:scriptmanager>


aga IE8 peal hakkab kisama selliseid vigu, kollane hüüumärk all vasaskus servas

Sys.InvalidOperationException: For the history feature to work in IE, the page must have an iFrame element with id '__historyFrame' pointed to a page that gets its title from the 'title' query string parameter and calls Sys.Application._onIFrameLoad() on the parent window. This can be done by setting EnableHistory to true on ScriptManager


Vea põhjus seekord see , et ASPX lehel DOCTYPE määrab lehele HTML 4.01 direktiivi
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

aga vaja läheb XHTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

kolmapäev, 2. juuni 2010

DBCC FREEPROCCACHE kaudu läbi ADO.NET kaudu salvestatud protseduuri jooksutamisele vungi sisseandmine

Kui selline juhtum, et tõmbad salvestautd protseduuri Management Studio kaudu käima töötab asi kiiresti. Sama asi aga ASP.NET rakenduses läbi ADO.NET välja kutsudes jube aeglane, põhimõtteliselt ei töötagi siis saab asjale vunki juurde anda, kui
MS SQL SERVER-is korra protseduuride vahemälu tühjaks tõmmata

DBCC FREEPROCCACHE

Hoiatatakse küll, et ärge kasutage aga lõpptulemusena saad ka läbi ADO.NET välja kutsutud protseduuri kiiresti käima.

Soovitatav lahendus aga sellistel juhtumistel on SP poolt parameetrite arvamine ära lõpetada, ehk teisenda protseduuri parameetrid lokaalseteteks muutujateks

CREATE PROCEDURE ParameetriArvamine
@nimetus NVARCHAR(10)
WITH RECOMPILE
AS
DECLARE @nimetus1 NVARCHAR(10)

--teeme parameetri teisendamise, et SQL SERVER oskaks õiget käivitusplaani teha

SET @nimetus1 = @nimetus
SELECT id, nimi FROM SinuTabel WHERE nimi = @nimetus1

teisipäev, 18. mai 2010

ConnectionString seadete ülevõtmine virtuaalkataloogide puhul

On veebirakendus ja IIS-i peale teed samale rakendusele juurde VirtualDirectory kuhu paned samast rakendusest teise koopia käima kui Virtuaalrakenduse (Virtual Application). Vaja aga, et VirtualDirectorys olev rakendus võtaks teise andmebaasi külge. Kui seda teha "location" parameetriga


  260     <location path="DEMO">       


  261         <connectionStrings>


  263 <add name="TkConnectionString" connectionString="Data Source=SQLSERVER;Min Pool Size=2;Initial Catalog=DEMO-BAAS;Application Name=DEMORAKENDUS;User ID=DEMO_KASUTAJA;Password=seeseGane234ja2342keeRuline" providerName="System.Data.SqlClient"/>


  269         </connectionStrings>




Kõik nagu õige aga VirtualDirectoryst asja käima tõmmates pistab kisama, et va
"TkConnectionString" on juba olemas. Kuna see ConnectionStringide osa on
tõepoolest varem kirja pandud. Lahendus asjale see, et algne ConnectionString osa
tuleb mappida


   29 <location inheritInChildApplications="false">




vahele näiteks niimoodi


   29     <location inheritInChildApplications="false">


   30     <connectionStrings>


   31         <add name="TkConnectionString" connectionString="Data Source=SQLSERVER;Min Pool Size=2;Initial Catalog=BAASE;Application Name=OIGERAKENDUS;User ID=ORIGINAAL;Password=ikka97raSke76ja3536keerUline" providerName="System.Data.SqlClient"/>


   32     </connectionStrings>


   33     </location>




Nüüd nii, et VirtualDirectory-s olevasse rakendusse pöördumisel võtab teise andmebaasi ühenduse külge, ehk selle mis

  261 <location path="DEMO">



osa sees kirjas on. VirtualDirectorys olevas web.config failis jätad ConnectionStrings osa üldse ära.