teisipäev, 21. detsember 2010

https päring SQL serveri CLR protseduurist

Igasugu asju võimaldatakse ka andmebaasis teha CLR-iga aga kui vaja teha sertifikaadikindel https postitus võib seda teha nii.

Et serveri sertifikaatide veateadetest lahti saada tuleb kasutada
ServicePointManager.ServerCertificateValidationCallback meetodi ülekirjutamist

using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net;
using System.IO;


private static bool ValidateRemoteCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors )
{
//siia võib mingi mõistliku veatöötluse juurde arendada, praegu annab alati true, ehk kõikidest vigadest läheb mööda.
return true;
}

CLR protseduur ise

[Microsoft.SqlServer.Server.SqlProcedure]
public static void VeebiParing(SqlString url, SqlString andmed, SqlString kellelt, out SqlString outt)
{
try
{
//see on sertifikaadi veast möödahiilimiseks
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

HttpWebRequest myRequest=(HttpWebRequest)System.Net.WebRequest.Create((string)url);

myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";


//paneme sisu kokku
StringBuilder postData = new StringBuilder();
//siin paneb andmed külge
postData.Append("Saadame="+(string)kellelt+"&andmeid="+(string)andmed);


//päringu andmete sisu tuleb läbi System.Uri.EscapeUriString lasta, muidu ei lähe läbi veebi.
string data = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(System.Uri.EscapeUriString(postData.ToString()));
myRequest.ContentLength = data.Length;

// Striim veebi saatmiseks

Stream newStream = myRequest.GetRequestStream();
// Saadame minema
newStream.Write(data, 0, data.Length);
newStream.Close();

//loeme vastuse

HttpWebResponse loWebResponse = (HttpWebResponse)myRequest.GetResponse();

Encoding enc = System.Text.Encoding.GetEncoding("UTF-8");
StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
//kuna on protseduur siis nii saab sisulistvastust tagastada
outt = loResponseStream.ReadToEnd();
loResponseStream.Close();
loWebResponse.Close();

}
catch ( WebException ex)
{
outt = "WebException: " + ex.Message;
}
catch (SystemException ex)
{
outt="Error: "+ex.Message;
}
return;

}

Kui andmebaas hakkab CLR alusel protseduuri looma siis NVARCHAR(4000) sisendparameetri võid muuta NVARCHAR(MAX) peale ja ASSEMBLY tuleb teha UNSAFE märgendiga, mis annab CLR protseduurile turvalisuse seisukohalt laiad võimalused ehk kaaluda tasub muude võimaluste kasutamist

reede, 29. oktoober 2010

AjaxToolkit NotBot extender näitab osadele BruteForce tööriistadele trääsa

Alates ASP.NET 3.5 versioonist ka Ajax NotBot extender olemas. Kasutada saab näiteks BruteForce tööriistade vastu, mis salasõnade äraarvamisega süsteemi sisse pääseda püüavad.

Päringute arve piiramine(RequestRateLimiting) aitab ka siin nagu tavaliselt alati.

Peale extenderi vormile lohistamist saab mängida peamiselt kolme parameetriga

ResponseMinimumDelaySeconds="3" tähendab seda, et peale veebivormi avanemist(allalaadimist) peab ootama 3 sekundit ennem kui PostBack serveri poolt töötlemisele võetakse

CutoffMaximumInstances="8" ja CutoffWindowSeconds="50" määravad ära, et "luba 50 sekundi jooksul ainult 8 korda PostBack-i teha". Maakeeli tähendab seda, et 50 sekundi jooksul saab ainult 8 korda salasõna äraarvamist proovida


Code-behindi võib näiteks teha niimoodi (soovitav lisada ka veateate hägustamise osa)

protected void ButtonLogin_Click(object sender, EventArgs e)
{

AjaxControlToolkit.NoBotState nbstate;
if (!this.NoBot1.IsValid(out nbstate))
{
switch (nbstate)
{
case AjaxControlToolkit.NoBotState.InvalidResponseTooSoon: //liiga vara sisestati peale vormi laadimist
{
this.CustomValidatorLoginFailed.ErrorMessage = "Liiga kiiresti alustasite";
break;
}
case AjaxControlToolkit.NoBotState.InvalidAddressTooActive: //liiga kiiresti sisestatakse lubatud ajavahemiku jooksul
{
this.CustomValidatorLoginFailed.ErrorMessage = "Liiga sageli proovite";
break;
}
default:
{
this.CustomValidatorLoginFailed.ErrorMessage = "BotRobot " + nbstate;
break;

}
}
this.CustomValidatorLoginFailed.IsValid = false;
return;
}
//siit saati võib nüüd päringut töötlema asuda
}

reede, 22. oktoober 2010

applicationHost.config faili asukoht 32-bitistel arvutitel

Asub siin
C:\Windows\System32\inetsrv\config

Kui hakkad IIS7 all näiteks web.config faili RequestFiltering sektsiooni
sisse kirjutama ja pistab kisama, a'la

This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".

siis põhjus selles, et applicationHost.config failis on

<section name="requestFiltering" overrideModeDefault="Deny">

keelatud web.config failides requestFiltering osa muuta

Lubada saad, kui muuta applicationHost.config failis overrideModeDefault="Allow"

peale seda iisreset ja võtab taas pildi ette

esmaspäev, 11. oktoober 2010

Kuupäeva pp.kk.aaaa formaadipööramine

Ei meeldi .NET-ile pp.kk.aaaa kuupäeva formaat, igalt poolt võib hakata exceptioneid pilduma, usaldusväärsust lisab fikseeritud formaatidega tüübipööramine

string kuupaevatekst="23.10.2010";

DateTime arvekuupaev;
string[] formaat = new string[4];
formaat[0] = "yyyy-MM-dd"; //.NET standardformaat
formaat[1] = "MM.dd.yyyy";
formaat[2] = "dd.MM.yyyy"; //meie kullakallis pp.kk.aaaa
formaat[3] = "yyyyMMdd"; /ISO8601 see töötab alati nii .NET kui SQL SERVER
if (!System.DateTime.TryParseExact(kuupaevatekst, formaat, System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None, out arvekuupaev))
{
throw new InvalidOperationException("Error !! kuupäev " + kuupaevatekst+ " pole sobivas formaadis");
}

ja töötab palju paremini
arvekuupaev siin on nüüd kuupäevaks teisendatud string

teisipäev, 5. oktoober 2010

GetSafeHtmlFragment AntiXSS 4.0 Librarys on nüüd Sanitizer klassis

Valget nimekirja kasutavas Anti-Cross Site Scripting Library V4.0
http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=f4cd231b-7e06-445b-bec7-343e5884e651
on GetSafeHtmlFragment meetod nüüd Sanitizer klassis endise AntiXss klassi asemel.
Sanitizer klassi meetodid GetSafeHtml ja GetSafeHtmlFragment vaatavad sisendit
Principle of Inclusions põhimõtte järgi ja kui leitakse midagi, mis ei ole valges nimekirjas siis tõmmatakse väljundist maha

Näiteks varjestamist vajavast tekstist

Salakood <script type="text/javascript">prompt('Sisesta PIN kood'); </script>

jätab GetSafeHtmlFragment alles ainult Salakood osa


GetSafeHtml aga teeb

<html>
<body>
Salakood
</body>
</html>

HTML-i

Kasutamiseks lisa viited DLL -idele HtmlSanitizationLibray ja AntiXSSLibrary

Koodis kasuta
Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(Eval("textboxtest").ToString())

kolmapäev, 29. september 2010

MS10-070 ASP.NET Padding Oracle turvapaik muudab IIS7 peal ScriptResource.axd ja WebResource.axd pöördumise URL-i pikemaks

Peale patchi rakendamist, ei pruugi veebirakendus enam töödata
http://www.dt.ee/blog/kood/net/2010/09/kriitilise-tahtsusega-turvapaik-aspnet-jaoks

Muudatus, mis patchiga tuleb on see, et kui kasutad RequestFilteringi siis suurenda MaxUrli pikkust. WebResource.axd ja ScriptResource.axd poole pöördumised on nüüd pikemad



<location path="WebResource.axd">
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxQueryString="230" />
</requestFiltering>
</security>
</system.webServer>
</location>


<location path="ScriptResource.axd">
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxQueryString="230" />
</requestFiltering>
</security>
</system.webServer>
</location>

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.

neljapäev, 8. aprill 2010

IE-l on Request.UrlReferrer null JavaScriptiga ümbersuunamise puhul

IE9 puhul lubatakse juba muudatust aga kui vaja teha nii, et ekraanile tuleb JavaScripti alert kast ja peale seda minnakse teisele veebilehele


string scriptString = "<script type=text/javascript> alert('"Uuele lehele "');window.location='UusLeht.aspx';</script>";




window.location='UusLeht.aspx' teeb ümbersuunamist

lisame JavaScripti dünaamiliselt lehele

if (!this.Page.ClientScript.IsClientScriptBlockRegistered("clientScript"))
{
this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "clientScript", scriptString);
}

peale sellist ümbersuunamist on UusLeht.aspx lehe peal IE puhul this.Request.UrlReferrer null

Asendusena võib kasutada seda, et GET päringule paned lisaks referer=KustMaTulen.aspx
aga see ei pidavat turvafiltritele meeldima, võimalik turvarisk

teisipäev, 16. märts 2010

Fondi tingimuslik muutmine ReportViewer controlis

Vaja näiteks mingil tingimusel väljatrükil teksti paksus kirjas näidata. Asi muidu lihtne, vastava Controli koha peal võtad Properties ja Font
ja klikid Fx nupule, kogu edasine tarkus selles, et fondi nimi tuleb panna jutumärkide "" vahele
=IIf(Fields!GUARANTEE_MONEY.Value > Fields!GUARANTEE_MONEY_PAID.Value,"Bold","Normal")

Kui jutumärke ei pane saad kompileerimisel veateate
The FontWeight expression for the textbox ‘textbox19’ contains an error: [BC30451] Name 'Bold' is not declared.

kolmapäev, 10. märts 2010

Kustutamine tabelmuutujast SELF-CORRELATED päringuga

Süntaks selline, et viitamisel tuleb tabelmuutuja nimi panna [ ] kandiliste sulgude sisse

DELETE FROM @lepingud WHERE EXISTS
( SELECT OP_LOG.CONTRACTS_ID FROM dbo.OP_LOG
WHERE OP_LOG.TEXT_TITLES_ID = 49 AND OP_LOG.CONTRACTS_ID = [@lepingud].CONTRACTS_ID )

reede, 5. märts 2010

LinkedServeri konfigureerimine ilma IP aadressita

Kui kaks SQL SERVER-it vaja omavahel kokku panna siis saab Linked Serveri teha IP aadressi põhiselt. Management Studio alt Server Objects -> Linked Servers -> New ja LinkedServeri nimeks paned IP aadressi.

Aga saab ka nii, et IP aadressi asemel võid kasutada näiteks nime, hea siis kui IP aadress peaks muutuma ei pea koodis tabelite juurde pöördumisi ümber kirjutama.

Mudida tuleb Windows Serveril hosts faili mis asub tavaliselt C:\Windows\System32\drivers\etc
kataloogis. Sinna faili kirjutad rea juurde

ip-aadress Serveri nimi #kommentaar
xxx.129.109.306 TEINESERVER #see teine SQL server millega tahad ühenduse luua

ja kui linked serverit hakkad tegema siis IP aadressi asemel võid kasutada TEINESERVER nime

esmaspäev, 1. märts 2010

ReportVieweri andmetabeli sorteerimine .NET 3.5 korral

Selline asi tuli seoses LINQ-iga ReportVieweril välja, et kui paneb dünaamiliselt ReportViewerile
DataSource külge siis sai seal ka .NET2.0 korral kohe andmeid sorteerida

dsReportsTableAdapters.RAPORT_KUIDO_STableAdapter ta = new dsReportsTableAdapters.RAPORT_KUIDO_STableAdapter();
dsReports.RAPORT_KUIDO_SDataTable tb = new dsReports.RAPORT_KUIDO_SDataTable();
ta.Fill(tb, begin, end);

ja panid andmed koos sorteerimisega Reportvieweri DataSource-le külge
this.ReportViewerAsendus.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("dsReports_RAPORT_KUIDO_S", tb.Select("","SURNAME")));

see tb.Select("","SURNAME") tegi sorteerimise

Mingi hetk aga .NET3.5 tableAdapteri peale üle minnes, kus LINQ ka küljes on, tekib häda
nende veergudega, mis võivad andmebaasist tulles ka NULL-id olla, ehk
ReportVieweri IsNothing() funktsioon enam ei funka.

=IsNothing(Fields!VALID_UNTIL_DATE.Value) enam NULL-i ei tunnista, kuna veerus on "mingi muu asi sees", ehk dsReports.RAPORT_KUIDO_SDataTable tüübi asemel on DataRow[] massiiv millega ReportViewer 2008 Service Pack1 NULL-iste väärtuste korral hätta jääb.


Asja saab jälle tööle nii, et tuleb sorteerimine teha DataTable -dega ära ennem kui reportViewerile külge paned.

Lisakood sorteerimiseks võib välja näha nii


DataRow[] tulem= tb.Select("", "SURNAME");
dsReports.RAPORT_KUIDO_SDataTable tb2 = new dsReports.RAPORT_KUIDO_SDataTable();
foreach (DataRow rida in tulem)
{
tb2.ImportRow(rida); //impordime read uude tabelisse
}


this.ReportViewerAsendus.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("dsReports_RAPORT_VALITUT_ASUKKAAT_KUIDO_S", tb2));// siin paneb juba uue tabeli külge

reede, 29. jaanuar 2010

UrlScan ja IIS6 Enable default content page

Üks asi juhtub, kui kasutad ISAPI filtrit UrlScan "valge nimekirja" režiimis ning kui annad seadistustes ette nimekirja lubatud faili laienditest mida IIS töödelda võib. ASP.NET rakenduse puhul näiteks:

[AllowExtensions]
.png
.jpg
.gif
.aspx


siis tekib robleem juhul, kui sul on IIS-i alt konfigureeritud
Web Site properties -> Documents ja seal märgitud
märkeruut Enable default content page ja vaikimisi leheks naiteks logiSisse.aspx

Kui nüüd sirviku URL peale lihtsalt www.minusait.ee kirjutada siis veebileht enam ei avane ja UrlScani logist on näha veateadet

GET / Rejected extension+not+allowed file+extension . -

Põhjus selles, et UrlScan astub ennem vahele, otsib faili laiendit . mis aga pole lubatud.
Lahenduseks ka lihtsalt . tuleb [AllowExtensions] nimekrijas lubada

[AllowExtensions]
. ; kirjuta siia lihtsalt punkt ja tühik
.png
.jpg
.gif
.aspx


ja veebileht avaneb nüüd ka sirvikul ainult www.minusait.ee sisestades Enable default content page logiSisse.aspx lehega

kolmapäev, 27. jaanuar 2010

UrlScan [AllowExtensions] ja CSS erinevate sirvikute korral

Kui võtta UrlScani nimeline ISAPI veebifilter IIS6-e peale kasutusele ja määrata seadistuses, et töötame "Valge nimekirjaga" UseAllowExtensions=1 , ehk lubame ainult teatud laienditega faile alla tirida

[AllowExtensions]
.gif
.aspx
.css

siis CSS failidega selline asi, et nende töötlemine sõltub sirvikust ja sellest, kas tegu on serveri või sirviku poolse kaskkaalaadistikuga (CSS).

Flock 2.5.2, Firefox 3.6 ja Opera 10.10 lasevad asja serveri poolel ära teha

ehk võib .css välja kommenteerida lubatavatest laienditest

[AllowExtensions]
.gif
.aspx
;.css

IE8 ja Safari 4.0.4 aga panevad pildi sirvikus endas kokku, ehk .css peab lubatavas laiendite nimekirjas olema.

Kui .txt laiend ära keelata siis tünga saavad ka need, kes robots.txt faili himustavad.

esmaspäev, 25. jaanuar 2010

Otsi stringi SQL SERVER-i andmebaasist

Kui enam meeles pole, mida kuhugi sai andmebaasi pandud siis otsimisel abiks järgnev skript:

set nocount on

DECLARE @pikkus INT, @rowID INT, @maxRowID INT, @sql NVARCHAR(4000), @searchValue NVARCHAR(100)
SET @searchValue = 'ei tööta' --seda otsitakse

DECLARE @statements TABLE (rowID INT, SQLL NVARCHAR(MAX) COLLATE DATABASE_DEFAULT)
CREATE TABLE #results (tableName NVARCHAR(250) COLLATE DATABASE_DEFAULT, tableSchema NVARCHAR(250) COLLATE DATABASE_DEFAULT
, columnName NVARCHAR(250) COLLATE DATABASE_DEFAULT, foundtext NVARCHAR(MAX) COLLATE DATABASE_DEFAULT )
SET @rowID = 1
SET @pikkus=LEN(@searchValue)

--TEXT 35
--NTEXT 99
--VARCHAR 167
--CHAR 175
--NVARCHAR, SYSNAME 231
--NCHAR 239
--XML 241

--create CTE table holding metadata
;WITH MyInfo (tableName, tableSchema, columnName, XTYPE) AS (
SELECT sysobjects.name AS tableName, USER_NAME(sysobjects.uid) AS tableSchema
, syscolumns.name AS columnName, syscolumns.XTYPE
FROM sysobjects WITH(NOLOCK) INNER JOIN syscolumns WITH(NOLOCK)
ON (sysobjects.id = syscolumns.id)
WHERE sysobjects.xtype = 'U' AND sysobjects.category=0
AND sysobjects.name <> 'sysdiagrams' --MSSQL diagramme ei vaata
AND syscolumns.XTYPE IN (35,99,167,175,231,239,214) AND syscolumns.prec >= @pikkus
)

INSERT INTO @statements
SELECT row_number() over (order by tableName, columnName) AS rowID, 'INSERT INTO #results SELECT '''+tableName+''', '''+tableSchema+''', '''+columnName+''', CAST('+columnName+' AS NVARCHAR(MAX)) FROM ['+tableSchema+'].['+tableName+'] WITH (NOLOCK) WHERE '+
CASE WHEN myInfo.XTYPE=241 --XML
THEN +'CONVERT(NVARCHAR(MAX),['+columnName+'])'
ELSE '['+columnName+']'
END+' LIKE ''%'+@searchValue+'%'''
FROM myInfo

SET @maxRowID = ( SELECT MAX(rowID) FROM @statements )
WHILE @rowID <= @maxRowID
BEGIN
SET @sql = (SELECT sqll FROM @statements WHERE rowID = @rowID )
EXEC sp_executeSQL @sql
SET @rowID = @rowID + 1
END

SELECT * FROM #results
drop table #results

neljapäev, 21. jaanuar 2010

Request.UrlReferrer abil päringuketramise takistamine "Valge" nimekirja põhiselt

Kui ei taha, et kõiksugu päringuketramist kasutavad vahendid (otsimootorid ja häkkerautomaadid) hakkavad sinu veebirakendust susima ja seal auke leidma võib kasutada
meetodit, kus näiteks MasterPage sees kontrollid UrlReferrer sisu "Valge" nimekirja alusel.

protected void Page_Load(object sender, EventArgs e)
{
if (!((this.Request.UrlReferrer.ToString().Contains("RakenduseRoll"))
|| (this.Request.UrlReferrer.ToString().Contains("login.aspx"))
))
{
Response.Redirect("~/login.aspx");
}
}

ehk kui UrlReferrer sisu pole sobiv, siis suunad avalehele tagasi.
Senikaua kuni UrlReferrer sisu ära taibata üritatakse võid ennast muretumalt tunda.
Kõrvalnähuna tuleb VisualStudio veebiteste modifitseerida ja nii mõnigi muu asi võib katki minna ehk eelnevalt kindlasti kontrollida kas
this.Request.UrlReferrer==null

kolmapäev, 13. jaanuar 2010

requestFiltering maxQueryString ja Sys.WebForms.PageRequestManager is null or not an object viga

Selline hea tahtmine, et piirame IIS7 peal requestFilteringiga päringu pikkust mida IIS7 vastu võtab

Kui juhtub, et IE8 hakkab veebilehele vasakul allääres näitama kollast hüüumärgiga kolmnurka
tekstiga "Valmis, kuid lehel on tõrkeid" (Firefox 3.5.7, Opera 10.10 ja Safari 4.0.4 ei näita midagi kahtlast)ning kui selle hüüumärgiga kolmnurga peal topeltlikkida tuleb veateade
Sys.WebForms.PageRequestManager is null or not an object

ehk veebilehel võetakse AJAX-i toimimine maha

siis korda saab nii, et seda maxQueryString parameetri väärtust tuleb suurendanda

teisipäev, 5. jaanuar 2010

SQLSERVER loginid nõrkade salakoodidega

Otsib välja need SQL SERVER-i loginid, mille salakood on etteantud nimekirjas või salakoodiks on kasutajatunnus või kasutajatunnus pööratult

Käivitage skript ning olge loov, julm ja metoodiline nõrkuste ravimisel. Ärge halastage kellelegi !!

USE [master]
DECLARE @WeakPwdList TABLE(WeakPwd NVARCHAR(255) COLLATE DATABASE_DEFAULT )
--Nõrkade salakoodide nimekiri
--@@Name on selleks, et testida kas salakoodiks on kasutajatunnus
INSERT INTO @WeakPwdList(WeakPwd)
SELECT ''
UNION SELECT '123'
UNION SELECT '1234'
UNION SELECT '12345'
UNION SELECT '123456'
UNION SELECT 'abc'
UNION SELECT 'abc123'
UNION SELECT 'qwerty'
UNION SELECT 'qwert'
UNION SELECT 'qwer'
UNION SELECT 'asdfg'
UNION SELECT 'asdf'
UNION SELECT 'asd'
UNION SELECT 'default'
UNION SELECT 'guest'
UNION SELECT '@@Name123'
UNION SELECT '@@Name12'
UNION SELECT '@@Name1'
UNION SELECT '@@Name'
UNION SELECT '@@Name@@Name'
UNION SELECT '@@Name1@@Name'
UNION SELECT '@@Name12@@Name'
UNION SELECT '@@Name123@@Name'
UNION SELECT 'admin'
UNION SELECT 'Administrator'
UNION SELECT 'admin123'
--SELECT * FROM @WeakPwdList
SELECT sql_logins.name AS [LoginName],
CASE
WHEN PWDCOMPARE(REPLACE(t2.WeakPwd,'@@Name',REVERSE(sql_logins.name)),password_hash) = 0 THEN REPLACE(t2.WeakPwd,'@@Name',sql_logins.name)
ELSE REPLACE(t2.WeakPwd,'@@Name',REVERSE(sql_logins.name))
END AS [Password]
,sql_logins.default_database_name,sql_logins.is_policy_checked,sql_logins.is_expiration_checked,sql_logins.is_disabled
,(SELECT suser_sname(owner_sid) FROM sys.databases WHERE databases.name = sql_logins.default_database_name) AS database_owner
FROM sys.sql_logins INNER JOIN @WeakPwdList t2 ON (PWDCOMPARE(t2.WeakPwd, password_hash) = 1
OR PWDCOMPARE(REPLACE(t2.WeakPwd,'@@Name',sql_logins.name),password_hash) = 1
OR PWDCOMPARE(REPLACE(t2.WeakPwd,'@@Name',REVERSE(sql_logins.name)),password_hash) = 1 )
--WHERE sql_logins.is_disabled=0
ORDER BY sql_logins.name


SQL LOGIN-eid saab sundida jälgima Windows Serveri policy-t
http://technet.microsoft.com/en-us/library/cc875814.aspx

Kontrollige, et Windowsi policyt oleksid peale seatud
ja SQL SERVERIS kasutajate tegemisel või muutmisel CHECK_POLICY = ON