Category Archives: IT/Development

Vikten av bakåtkompatibilitet

Connie Tornevall liked this post

Idag har det visat sig att även minimala, triviala skitgrejer som ändras kräver mycket god bakåtkompatibilitet, om man inte vill genomlida en problematisk eftermiddag.

stripslashes_syndrome


Läs även andra bloggares åsikter om

Share
Posted in IT/Development | Tagged | Leave a comment

variable_exists()

Solving a problem with unexistent variables on fly in javascripts.

A definetive need to have!

function variable_exists()
{
	try
	{
		var ArgTest = typeof(eval(arguments[0]));       // Do the test, that gives us an error or a success

		// On sucess: Return the value of the variable content instead of a boolean if second argument is true
		if (typeof(arguments[1])=="boolean") return eval(arguments[0]);

		// On success: ... or return a truth value to indicate an existing variable
		return true;
	}
	catch (e)
	{
		// On error: Return a plain fail
		return false;
	}
}
Share
Posted in IT/Development | 1 Comment

Add and edit cookies, Firefox 8

Patchad för att fungera ihop med Firefox 8.0+!

http://tmm.tornevall.net/dev/addneditcookies-0.2.1.0.xpi

Share
Posted in IT/Development | Leave a comment

Big Brother 2011 – BBVote – Update

BBVote 2011 – Kanske även i år!

http://bbvote.se, Sweden, 2011

Det är inte mitt fel! Jag rycktes bara med. Can you feel the obsession?

Ja, så var det! Inspirationen tvingade mig. Och alla osynliga röster! Röster som Paktvakten borde haft i SITT huvud! Nej, istället satte dom sig i mitt, som en smäck, och plötsligt hade BBVote fått sig en struktur. Fast i år var jag lat, så jag stal min egen bekväma fuldesign som jag gjort för min ”centrala administrationsplats”. Men vad gör man inte, för att påskynda processen? Och AJAX finns med på ett litet hörn, så man får mer känsla av realtid. Statistiken får jag förvisso finslipa lite vad det lider. Det kommer behövas en del fixar till.

Provisoriskt första steg

Nu är BBVote förvisso ihopslängt på en höft – två dagar tog det. Eller något mindre än 1½ dygn. Faktum är att jag tack vare lite planering inte behövt så mycket tid som jag brukar för att hinna färdigställa det som krävs för att man skall kunna synka med de första inkommande nyheterna om deltagarna från hemsidan (och då menar jag naturligtvis inte wannabe-kändisar). Jag misstänker dock att jag bör undvika att  ”förvänta” mig något i år, av flera skäl. Och det är trots allt ett antal år sen senast. Det är en ganska märklig känsla jag fått om jag skall vara ärlig.

Release Candidate

Så här sitter jag nu, med ännu en BBVote-app. Den första betan i en helt ny version alltså. Nummer 4. Det måste vara Beta så man har en liten chans att även testa grejerna under drift. Det skulle faktiskt kunna vara en Release Candidate också. Nå. När jag påbörjade det här inlägget i torsdags var sidan inte klar – även om jag inte riktigt vet om jag borde kalla den klar än, det känns som att det finns en del kvar att göra. Nu tror jag mig dock vara garderad mot en del saker som jag mött under de tidigare tre åren åtminstone, men det finns säkert något man missat. Förhoppningsvis fungerar dock allt som det skall.

Nu är det bara att invänta nästa skede!

Tack även till TorneEngine som förkortade tiden med flera veckor!


Läs även andra bloggares åsikter om , , , , , ,

Share
Posted in IT/BBVote (Votech), IT/Development, Media/nöje, Seriös Journalistik | Tagged , , , , , , | Leave a comment

Union Select från tabeller med olika kolumn-namn

SUBQuery- Mode Exempel:

SELECT word FROM spam
	UNION SELECT word FROM
		(
			SELECT `text` AS word FROM spamsentence
		) u_table_1

Läs även andra bloggares åsikter om , ,

Share
Posted in IT/Development | Tagged , , | Leave a comment

Proliant + cciss

HP Proliant + cciss + kernel panic + unknown-block(104,10) så fort man kompilerar om kärnan?

Device Drivers => Block devices:

Compaq SMART2 Driver (v 2.6.0)
HP CISS Driver (v 3.6.14)

<*>   Compaq SMART2 support

CONFIG_BLK_CPQ_CISS_DA (Observera: CISS!)

<*>   Compaq Smart Array 5xxx support

Device Drivers => SCSI Device Support => SCSI Transports

Fusion MPT SPI Host driver 3.04.06
Fusion MPT FC Host driver 3.04.06
Fusion MPT SAS Host driver 3.04.06

{*} Parallel SCSI (SPI) Transport Attributes
{*} FiberChannel Transport Attributes
{*} SAS Domain Transport Attributes

Device Drivers

<*> I2O device support  —>
<*>   I2O Configuration support
<*>   I2O Bus Adapter OSM
<*>   I2O Block OSM
<*>   I2O SCSI OSM
<*>   I2O /proc support

/etc/sysctl.conf: kernel.panic = 10
sysctl -p
make bzImage && make modules && make modules_install && make bzlilo
reboot!

Oh!

BACKUP!!


Läs även andra bloggares åsikter om , ,

Share
Posted in IT/Development | Tagged , , | Leave a comment

Svensk SMS-tjänst för statusuppdateringar på Facebook (Beskrivning)

SweMobile – En svensk SMS-tjänst för statusuppdateringar på Facebook

Applikationen SweMobile som ligger uppe på prov, finns på http://dev.tornevall.net/facebook/mobile/ som en stand-alone-sida eller http://apps.facebook.com/swemobile/ om man vill ha Facebook-designen inkluderad i gränssnittet.

Vad är ”SweMobile Gateway”?

Tjänsten SweMobile byggdes för att det inte funnits någon möjlighet att ansluta svenska mobiltelefoner till Facebook. Jag pratar naturligtvis om den funktion som ligger på adressen http://www.facebook.com/mobile/?settings där man registrerar sig för ”Facebook SMS”. Man kan välja operatör i princip för alla länder – utom Sverige av någon märklig anledning. Andra mobila tjänster fungerar däremot, men då måste mobiltelefonerna naturligtvis även ha stöd för det, vilket äldre modeller högst sannolikt inte har. I synnerhet inte de mobiler som levereras utan surfmöjligheter.

Hur fungerar tjänsten? Är jag anonym?

I stort sett, ja. SweMobile lagrar nästan ingen information alls om användaren – bara den information som krävs för att kopplingen skall fungera. Inga namn, personnummer eller dylikt sparas alltså i någon databas och eventuella namnuppgifter som finns på webbsidan kommer direkt från Facebook.

Inloggning

För att tjänsten skall fungera måste man till att börja med logga in. Vid första inloggningen är applikationen dock oanvändbar. För att SweMobile skall kunna ta emot dina SMS och logga dem som en statusuppdatering på facebook, måste användaren själv godkänna att det är okej. Detta sker alltså inte direkt. Väl inloggad så kommer den möjligheten däremot att finnas. Om aktivering från användarens sida inte sker, kommer denne inte heller att kunna använda applikationen.

Aktivering

Aktivering sker genom ”Aktivera”-knappen i applikationen. I det ögonblick som aktivering av SweMobile sker, så sparas också Facebooks användar-ID undan (och endast detta), flaggad som ”aktiverad”. I samma stund som detta görs, så kan man också testa om allting fungerar som det skall, genom att simulera ett SMS-utskick genom knappen ”testa publiceringsfunktionen”. Detta innebär att applikationen själv postar ett inlägg från dig till din status.

Koppling av mobilnummer

Applikationen är dock inte aktiverad till fullo ännu. Först måste du koppla ett mobilnummer till det användarid som facebook tillhandahåller. Detta gör du genom att klicka på ”Aktivera en mobiltelefon”. När du klickar på länken för att aktivera en mobiltelefon skapas en kod på fem bokstäver. Denna kod måste du skicka, via SMS, till SweMobile (se  nummer och instruktioner nedan). När detta är gjort, så kommer applikationen att markera att just ditt användarid använder det mobilnummer du skickade SMSet ifrån. Det finns ingen begränsning på hur många mobiler du kan aktivera, dock kan det bara vara unika nummer; att aktivera ett mobilnummer på två användare fungerar alltså inte. Själva aktiveringen görs genom att skicka meddelandet ”FACE REG AKTIVERINGSKOD” till 0702747703. Har du exempelvis fått koden ABCDE så skickar du alltså ”FACE REG ABCDE” till 0702747703.

Statusuppdateringar / Facebookloggen

När aktiveringen har gjorts kan du börja skicka SMS till din status på facebook. Detta gör du genom att du helt sonika, återigen till 0702747703, skickar meddelandet FACE, men denna gången med den text du vill skriva. Exempel: ”FACE sitter just nu i tältet och dricker bärs”.


Läs även andra bloggares åsikter om , , , , , , , , , , ,

Share
Posted in IT/Development | Tagged , , , , , , , , , , , | 1 Comment

proftpd: Begränsad åtkomst för virtuella ftp-användare

Jag blev nyligen uppmärksammad på att säkerheten för bloggpalatset.se kunde förbättras en liten aning. Plötsligt från ingenstans önskade jag att ftp-användare bara skulle kunna logga in från den lokala servern som alla bloggar är inställda att anropa. Detta av den enkla anledningen att alla ftp-lösenord finns synliga ifrån blogg-admin om man bara tänker till lite. Så hur begränsar man en FTP-server på vilken vars användare är virtuella och där alla användaruppgifter inte hämtas från unix-passwd – så att de plötsligt inte får för sig att lägga upp grejer som vi definitivt inte vill ha in i systemet?

Jo, det är faktiskt väldigt enkelt!

Istället för

SQLUserInfo     ftpuser userid passwd uid gid homedir shell

Så gör man loginkontrollen så här:

SQLUserInfo     custom:/getusers
SQLNamedQuery getusers SELECT "userid,passwd,uid,gid,homedir,shell FROM
           ftpuser WHERE userid = '%U' AND '%a' = '127.0.0.1'"

%a står för ipaddress (likt apaches logsystem alltså, så använder man såna parametrar med fördel här). I det här fallet kontrolleras alla användare helt enkelt om användaren ansluter från 127.0.0.1 eller någon annan adress. Om ipadressen är någon annan än 127.0.0.1 så kommer alltså proftpd att säga ”nopp, den här användaren finns inte”.

Jag gillar proftpd – hittills har den kunna göra precis allt jag har viljat att den skulle göra. Så med tanke på denna anpassningen, så tror jag att jag stannar kvar hos den servern en stund till.


Läs även andra bloggares åsikter om , ,

Share
Posted in IT/Development | Tagged , , | Leave a comment

Bloggfusk

Det var ett tag sedan jag skrev om mer-trafik.se och bloggfusk, då jag menade att det var ganska lätt att fuska med mer-trafik.se. Nu är det kopiöst onödigt att fuska eftersom man då missar att det faktiskt finns riktigt intressanta bloggare där, som kan vara värda att följa och mer-trafik uppfyller ett väldigt viktigt syfte med sin funktion. Framför allt är den enkel att använda, poängsystemet är konkret och okomplicerat! Man får heller inte prestationsångest när man använder mer-trafik (vilket därmed ger dom högsta poäng som bloggbooster).

Nyligen uppmärksammades jag återigen, efter ett långt uppehåll, på att även bloggtrafik.nu finns tillgänglig för den som är intresserad. Bloggtrafik baseras på liknande system som mer-trafik gör, där man får poäng för varje blogg man besöker. Deras anti-fusk-system ser lite annorlunda ut och på ett sätt är det en säkrare variant, då de använder captcha för att undvika att folk gör script som gör att de själva slipper plocka poängen. Men captchan såg väldigt enkel ut och jag slog vad med mig själv om att den kan knäckas med väldigt enkla medel, på grund av bland annat utformningen med rakt uppställda siffror. Nyfiken som man är, så var man så klart tvungen att ta reda på vilken styrka denna captcha hade.

Det krävs naturligtvis mer än bara en captcha-decrypter för att fuska med sånt här, något jag varken tänker gå in på här eller prova själv. Jag kunde dock bekräfta ganska fort, att man med hjälp av endast ImageMagick och Tesseract-OCR (ett OCR-läsningsprojekt som finns på google) kan läsa av siffrorna på bilderna. Följande fyra bilder användes (testet jag gjorde var inte särskilt omfattande och det var generellt sett nyfikenheten som drev mig att prova), tre av dessa kunde relativt enkelt tolkas av programmen:




Resultatet blev, som följer och som synes inte helt perfekt, men tillräckligt nära en bitter sanning – inte ens bildverifiering är ett bra skydd:


Läs även andra bloggares åsikter om , , ,

Share
Posted in IT/Development | Tagged , , , | Leave a comment

RSSFind 1.0.0

Tornevall Presents RSSFind 1.0.0

A script that scans a single webpage for possible RSS-feeds. Howto? It’s in the comments!

Share
Posted in IT/Development | Leave a comment

Numeric values in a DB2-table

I’ve read a bit about people that wants to find out if a columnvalue in a DB2-table contains numerics only. I’ve also read solutions that’s is more advanced than it have to be. So the solution I found, is the following… Can it be easier?

LENGTH(REPLACE(TRANSLATE(COLUMN_NAME, ' ', '0123456789'), ' ', '')) = 0

It’s all about removing all numerics in the search, so the column only returns non-numerics. Then count the characters that were left alone. If the length of the output is zero, we know that the column contains nothing after the clearout. If that’s the case, we’ve found a numeric-only value.

Share
Posted in IT/Development | Leave a comment

NNTP Gateway Modification – vB4 Compatibility Fix

With a quite simple solution based on a version-check ($vbulletin->versionnumber actually), this script now seem to be compatible with both 3.x and 4.x. My (only) test was at least successful – at last. The solution to (hopefully) make the gateway compatible with both vBulletin 3.x and 4.x, was to separate the insertion data into two sections: one for the old attachment-query, and one for attachments handled by vBulletin 4.x (where attachment-tables are separated), starting with this little helping row…

if (!preg_match("[^4]", $vbulletin->versionnumber))

Probably, this is not a foolproof solution, but it seem to work! The script was tested with vB 4.0.2 with a successful output, so far. So here we go!

includes/functions_nntp.php version 2010-03-26 22:17

http://tmm.tornevall.net/dev/functions_nntp_vb4_100326_2217.tar

Example post from de.alt.dateien.misc

http://forum.tornevall.net/showthread.php?343942-Eislutscher-am-Wiener-Heldenplatz


Läs även andra bloggares åsikter om , , , , , , , , , , ,

Share
Posted in IT/Development | Tagged , , , , , , , , , , , | 1 Comment

NNTP Gateway Modification – 100312

This post is for the guys at vbulletin.org, by request.

First of all, here’s the current source:

http://tmm.tornevall.net/dev/nntpgw-100312.tar

Changes made:

  • admincp/nntp_settings.php
    • Added settings for ”static email” for the from-header. Using this, will set a non-dynamic sender e-mail.
  • gateway.php
    • Added ”support” for console-runs (fix for vBulletin 4.0 that doesn’t like this)
    • ”Debug”-modes: 1 = Activate debug (not used), 2 = Unlock the script if it got stuck (this is a console thing)
    • Added some info into a logfunction to get more verbose info on connection
    • Dupechecker for threads/posts. If the xref/lastpost-value changes due to the nntpserver, this function avoids duplicate posts from the newsserver. This is extremely nice, if the newsserver used in some reason has been reset due to reinstallations, crashes etc (yes, this has happened to me – this is the fix)
    • Last-Insert-ID fixed, an old issue that happens when trying to read a new post from a forum
  • includes/functions_nntp.php
    • Small fixes, including footer changes – in some reason the original footer added to posts, made from a forum disturbed me, so this has been cleaned up so it looks more like a ”real” post on usenet. This fix was something about the signatures, so to speak.
    • Message-ID, References and From manipulated (partially referred to the static-email-setting above)
    • Another first-post-id/last-post-id fix
    • An old issue about attachments fixed here (observer that this is always accepting attachments/thumbnails). It also includes some kind of extension fix. Well, this is a very old fix and one of the first made to the script and my memory is quite blurry in this case… But I’ve never needed to change this back to it’s original state
    • require class_image.php replaced for attachments support. Also this is an old issue, and documented somewhere in the thread at vbulletin.org
  • includes/nntp.php
    • Fix for handling usenet-traffic if the webserver where the script is running, happens to run a peer for the nntp-server (sending MODE READER on connection – if the server is a peer, some servers initially are expecting MODE  STREAM, which the script won’t understand)

This is it I think. Wishes and questions will be answered if possible!

See you at vbulletin.org!


Läs även andra bloggares åsikter om , , , , , , , , , ,

Share
Posted in IT/Development | Tagged , , , , , , , , , , | 2 Comments

Dagens regexp

$loc = preg_replace("/(.*?)Location: (.*?)\n(.*)/s", '$2', preg_replace("[\r]", '', $test));

Rensar allt framför och bakom exempelvis följande text:

Server: Apache
X-Powered-By: PHP/5.3.1
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Location: http://www.tornevall.net/index.php?id=77
Content-Type: text/html

Utresultatet blir:

http://www.tornevall.net/index.php?id=77
Share
Posted in IT/Development | Leave a comment

SQL-Implode – Injection control

TorneEngine har fått ytterligare en funktion för att förenkla livet – saker man borde ha tänkt på tidigare… Denna gången handlar det om att snabbt kunna skicka in SQL-frågor i en databas och samtidigt slippa tänka själv. Det sparar åtminstone en del tid och en del kodutrymme.

Exempel:

Parametrar och dess värden lagras i en array. Dessa vill jag snabbt kunna skicka in i en databas, antingen för att modifiera värden, eller för att lägga in helt nya.

$sql[username] = "Pelle";
$sql[password] = "p4ssw0rd123";

Implodefunktionen fixar det galant! Den skall dock användas från en class, så att den inte förstör PHPs befintliga implodefunktion.

$ins = $tornevall->db->implode($sql);
$upd = $tornevall->db->implode($sql, "update");
echo "INSERT INTO test ($ins[0]) VALUES ($ins[1])\n";
echo "UPDATE test SET $upd[0] WHERE userid = 3\n";

Resultatet blir fantastiskt bekvämt enligt nedan!

INSERT INTO test (username, password) VALUES ('Pelle', 'p4ssw0rd123')
UPDATE test SET username = 'Pelle', password = 'p4ssw0rd123' WHERE userid = 3
/*
	Implode columns and their values

	Returned data:

	INPUT TYPE: Insert
	$array[0] - "Column names"
	$array[1] - "Column values"

	INPUT TYPE: Update
	$array[0] - "Columns = '$values'"

	- Tornevall
*/
function implode($sql = array(), $type = "insert")
{
	foreach ($sql as $p => $v)
	{
		$inserts[] = $p;
		$values[] = "'" . $this->injection($v) . "'";
		$updates[] = "$p = '".$this->injection($v)."'";
	}
	if ($type == "insert")
	{
		$ret = array(implode(", ", $inserts), implode(", ", $values));
	}
	else
	{
		$ret = array(implode(", ", $updates));
	}
	return $ret;
}
Share
Posted in IT/Development | Leave a comment

Projekt Mailserver – Flytten

Det här inlägget påbörjades klockan 22:01 under gårdagen. Jag somnade 7 och väcktes klockan 9 igen av att telefonen ringde. Någon hade upptäckt att popmailen hade slutat fungera. Jag funderade på vad det var, men kom sedan på att det bara var en portforward jag missat. Mail hade nämligen ramlat in i mailboxarna mellan 7-10 precis som om inget hade hänt så det avhjälptes rätt snabbt. Så här kommer dokumentationen, kring hur mailflytten gick! Åtminstone grovt sett.

22:00 – Ikväll blir uppenbarligen den stora dagen. Mailservern har börjat konstra igen och startar spontant om sig på grund av värmeproblem. Så nu är måttet rågat. Skiten ska väck, bort, slängas, ut! Jag vill inte se eländet längre. Nästan allt är klart. Den nya servern har stått och väntat på sina användare, men av lathet har jag inte orkat ta itu med det. Dessutom har jag haft en e-postlist-server på samma maskin som även den måste fungera. Men nu är det som sagt dags. Det får bära eller brista och jag tvingar mig själv att offra min dyrbara fritid.

Så till att börja måste jag se till att ezmlm är patchad och klarar vad den klarar nu. Jag har redan hunnit bli förvånad, eftersom utvecklingen av listservern tydligen har varit rätt ordentlig sedan jag kollade på den sist. Jag sitter med en ezmlm-idx 0.43 när det uppnebarligen finns en ezmlm-idx 7.0.2!

Självklart önskar jag ha kvar mitt ”eventuella” MySQL-stöd så det blir till att glo igenom en massa dokument samtidigt. I det första dokumentet jag hittar står det lite om tabeller, men det finns ingen riktigt info om hur man skapar tabellerna – och jag är ju lat, så jag skippar den delen tills den dag jag snubblar över eländet. SQL-stödet skall dock med ändå. Just in case. Jag börjar dock med att hämta idx-versionen. Den gamla standardversionen har jag ju redan. Förhoppningsvis fungerar kompileringen hela vägen även med denna…

make
make man
make mysql
conf-lang ändrar jag till sv i för att få svenskt språkstöd
make setup
cp ezmlmrc /usr/local/bin/ezmlm/ezmlmrc.en
cp lang/sv/ezmlmrc /usr/local/bin/ezmlm/ezmlmrc

Eftersom testprogrammen nästan alltid failar för mig, så skippar jag de procedurerna, som INSTALL-filen gärna vill att jag gör. Så, första delen av installationen bör alltså vara klar nu. Nu börjar det fruktansvärt långtråkiga kopierandet av användare och deras mailboxar… Glöm dock inte att uppgradera gamla listor om det finns några. Detta görs bland annat med ”ezmlm-idx DIR” för att återindexera listorna (har inte kunnat bekräftat detta själv iofs). Men det viktigaste är att man gör en ”ezmlm-make -+ ~alias/listdir” på alla gamla listmappar – jag stötte nämligen i efterhand på felet ”deny/key does not exist/Sorry, I’ve been told to reject your posts”. Efter remaken, så fungerade listorna igen. Relativt smärtfritt om man jämför med hur resten av flytten gick (det sista här är skrivet efter att allt blivit färdigt).

[...]

Några timmar senare var man klar. För att verkligen vara säker på att alla hemkataloger fortsätter tillhöra rätt användare avslutas nu användarprocessen med en liten sök-och-ersätt:

grep -i /home /etc/passwd | sed s/”[ ]”/”_”/ | sed s/”[:]”/” ”/g | awk ‘{printf ”chown -R ” $3 ”:” $4 ” ” $6 ”\n”}’ | grep -i home

Och för gruppbehörigheterna för varje undermapp…

find -type d -maxdepth 1 | sed s/”[\/]”// | sed s/”[\^\.]”// | awk ‘{printf ”chgrp ” $1 ” ” $1 ”\n”}’

Problem uppstår givetvis på andra håll dock. Med pop3-servern som vägrar acceptera användare som loggar in. Courier-lösningen som tidigare installerats fungerar inte heller eftersom authdaemon där kräver grejer jag inte vill ha. Ju lite inverkan som möjligt, desto bättre. Standard-auth via passwd/shadow är alltså ändå alternativet jag godtar. Det löstes dock genom att …

pop3   stream  tcp     nowait  root    /usr/sbin/tcpd  /var/qmail/bin/qmail-popup tornevall.net /bin/checkpassword qmaill /var/qmail/bin/qmail-pop3d Maildir

… måste ändras till …

pop3    stream  tcp     nowait  root    /usr/sbin/tcpd  /var/qmail/bin/qmail-pop

Därefter skapar man en fil i qmail-bin-katalogen som innehåller:

#!/bin/sh
/var/qmail/bin/qmail-popup tornevall.net /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir

Och vips var den delen färdig! Varför folk jämt skall envisa med helt sjuka lösningar förstår jag faktiskt inte, när man kan göra det så enkelt för sig…

Beträffande ett authpaket som saknas för courier så kan varken jag eller någon annan (figures! det har vi aaaaaaaaaldrig varit med om förr) svara på varför authshadow saknas vid kompileringen. Ja, förutom att ett gäng shadowlibs saknas, så att kompilatorn kan hitta dom ordentligt. Och förutom att det är helt omöjligt att hitta libs att installera också. Förutom ”shadow suite” – som inte går att kompilera. GÖTT! Därför ligger libauthshadow för courier HÄR nu! Fysiskt om min första courierinstallation efterföljs, så skall dessa filerna placeras i /usr/local/lib/courier-authlib och i /usr/local/etc/authlib/authdaemonrc på raden authmodulelist skall authshadow finns med. Fixat och klart!

Efter många om och men så är då projektet – till synes – avslutat. Numera sitter man här, med en specifik in- och uthanterande mailserver, med mailauth. Det står även en annan smtp-server, hos ”grannen”, som explicit skickar ut mail från interna nätet – där enbart några få ipadresser släpps in för att få skicka mail. Bland annat ovanstående nya mailserver (och den gamla). Det är en sendmail-daemon som inte har så många andra uppgifter än att forsla mailtrafiken förbi port 25, genom en VPN-tunnel. Inga fel har hittats ännu och förhoppningsvis håller sånt sig borta även i fortsättningen, så man slipper sitta ytterligare timmar och rätta fel.

Share
Posted in IT/Development | 1 Comment

Säkerhet i javascript

IMVU – En stor 3D-community som antagligen – förhoppningsvis – har haft sin boom för längesen. Den drar, precis som alla andra sidor i sin kategori, till sig en massa skumma människor och är i princip en fantasi-köttmarknad, där man bygger upp förväntningar på varandra i form av små figurer som egentligen inte existerar. Det finns också en vanlig marknad, för försäljning av modegrejer, kläder, grejer, djur, osv som egentligen inte existerar. För mig är dock den här platsen enbart en historisk säkerhetskatastrof. Jag har tidigare skrivit ett inlägg på engelska (http://tmm.tornevall.net/blog/2007/10/01/xss-at-imvu-still-unprotected/) angående just säkerheten på sidan, eftersom man tillåter en liten aning för mycket designande på användarnivå. Och när man befinner sig på en webbplats där man tillåter användarna att redigera sin design fullt ut, i html, så kan man också räkna med problem.

Naturligtvis var just ”problem” en term som dök upp tidigt under den period i mitt liv då jag ”lärde känna” communityn. 17 februari 2007 dök en tråd upp i IMVU-forumet, där man påpekade att krediter hade börjat försvinna från olika konton. Detta hände bara några månader efter att jag varnat ett par exvänner, som haft problem med förföljelse, för att använda IMVU ”för mycket” till sina privata grejer, eftersom profilsidorna var extremt sårbara för olika attacker. I mars samma år stängdes möjligheten att använda javascript i användarnas profiler, tillfälligt. Tills ”problemen var åtgärdade” hette det. Saken var nämligen att man med hjälp av javascript kunde stjäla andra användares konton, genom att anropa parametern document.cookie – vilket förmodligen var precis vad som hände.

IMVU löste sitt problem. Fast på ett fånigt bekvämligt sätt, visade det sig. Vad man egentligen gjorde var en ”sök och ersätt” om innehållet ”document.cookie” fanns med på användarnas egendesignade sidor. Problemet är att, så länge all html-kodning fortfarande är möjlig för användaren räcker det med att slänga runt orden lite och nyttja övrig javascript-funktionalitet för att passera ett sådant skydd. Om någon förstått det än är oklart och samtidigt ganska förståeligt, på grund av att variabler i modifierad form vanligtvis är harmlösa. Och säkerheten i javascript är alltså precis vad det här inlägget tar upp.

Någon ”vanlig” XSS-injection är det inte tal om, eftersom säkerheten i alla webläsare har stärkts betydligt. I det här specifika fallet talar jag om AJAX, som gör websidor mer interaktiva; en del sökmotorer använder sig av AJAX idag och innebär kort att när användaren exempelvis skriver in en bokstav i ett sökfält, så returneras alternativa sökord till användaren. Anropen sker, som AJAX antyder, i bakgrunden med hjälp av javascript. Men som jag sade så har säkerheten blivit högre – det går till exempel inte längre att hämta data från andra websidor med AJAX, om inte datat man anropar befinner sig under samma domän som själva huvudanropet. Det går således inte att skicka iväg cookies till en annan server heller, som fångar upp dem. Inte längre i alla fall, men det har fungerat. Vilket jag svurit över några gånger på jobbet, då vi själva nyttjar sådan funktionalitet. Enda lösningen på det är att helt enkelt lägga allt på samma server. AJAX fungerar förvisso fortfarande rätt bra om man ser till att anropa alla funktioner från samma domän, annars det krävs det att användaren själv väljer att sänka säkerheten i sin webbläsare och det lär det inte vara många som gör.

I alla fall – jag nämnde nyss att variabler i omskriven form är effektlösa. Vilken tur!

Nja… Det går ju faktiskt att komma förbi. För att få en textsträng från en variabel att fungera som om det vore ett script kan man evaluera den med eval-funktionen:

var ingredient = 'cook documentie';
var newword = eval(ingredient.substr(5,8) + "." + ingredient.substr(0,4) + ingredient.substr(13,2));

I ovanstående funktion skapas en textvariabel innehållande ”cook documentie”. Det ser väl harmlöst ut, vid första anblicken?

På andra raden i scriptet kastar vi om textsträngen så att den åter bildar ordet ”document.cookie” istället. Skickar man ut det med en alert eller en document.write, så får man alltså på skärmen läsa ”document.cookie” igen, om det inte hade varit för evalueringen av den. En evaluering av textsträngen gör nämligen att den åter körs ”live”. En alert(newword) kommer alltså returnera de cookies som är aktuella för den websida man besöker och därmed de sessionsvariabler som håller användaren inloggad på sidan – vilka, om en webmaster är en dålig programmerare, kan vara okrypterade lösenord. Det har visserligen ingen större betydelse, när man plockar upp cookies så här eftersom man ändå kan komma åt ett konto på det här sättet. För det mesta i alla fall. Nackdelen med okrypterade lösenord i en cookie är just att de är okrypterade och därmed ges en angripare bara större möjligheter att förstöra något.

Problemet med den här typen av script är att få dem att fungera helt utan interaktion från användaren. Eftersom AJAX bara fungerar så länge man inte lämnar samma domän så blir det alltså svårt att dölja anropen och enda sättet att snappa upp cookies är om man ber användaren att klicka på en knapp, som man sedan länkar till en annan websida – eller helt enkelt be användaren skicka dem direkt och spara tid. Det blir dock lite väl uppenbart om man ber användaren att klicka någonstans, eftersom detta lämnar rejäla avtryck i användarens webläsare, om man inte använder webformulär med POST-metoden. Samtidigt, som det faktiskt krävs att användaren gör något. Å andra sidan så är all hänvisning bort till en helt annan plats generellt sett väldigt suspekt. Och även om det går att lura några så går det lyckligtvis inte att lura alla. Mycket källkod i ett dokument innebär också större chans att någon ser vad som sker och det kanske inte är all kod som fungerar, beroende på hur webmastern städar sina användares källkod. Vi vill alltså bara använda det lilla som krävs för att koden skall fungera.

Så, då är det alltså omöjligt att stjäla cookies eftersom säkerheten hindrar webläsarna att lämna domänen – och så länge man inte interagerar med användaren så fungerar det inte.

Jo… Det gör ju det. Och faktum är att man inte behöver be användaren att interagera alls. Det är alltså här någonstans som webansvariga bör fundera på hur mycket kod de egentligen borde tillåta att användarna kör. Ju fler funktioner, desto mer skräp kan passera, så att säga. Egentligen räcker det med att döda eval och document.cookie för att man skall kunna frånta väldigt många sätt att knäcka cookies på. Så det återstående problemet är att dölja anropet och ändå få tag på cookies utan att visa användaren att man vill ha dem. Och utan att först behöva be användaren om dem…

Bilder är bra! När man laddar in en bild så ser användaren bilden och inget annat. Men via bilder kan man inte skicka cookies. Eller? Jo. Tack vare webläsares flexibilitet via javascript, så kan man göra många anrop både här och där i källkoden som man inte ens trodde var möjligt. Exempel? Något som är vanligt, i synnerhet på köttmarknadswebsidor (läs: datingsiter), är att man låter användaren föra muspekaren över en miniatyrbild som föreställer någons fotografi för att öppna en större bild av användaren. Väldigt kortfattat fungerar detta genom att man anropar onmouseover-funktionen och då har interaktion med användaren skapats. Men med onmouseover följer också ett krav på användaren, att de måste göra något, så det blir inte riktigt bra. Men som bekant tillåter javascript väldigt mycket… Exempelvis så finns funktionen onload tillhands om man vill utföra kommandon på en websida, som skall ske när websidan laddas in första gången. En intressant sak som kan vara värt att påpekas är att onload bara fungerar en gång, så en fuskmetod som den nedan kommer alltså inte fungera:

<body onload="alert('1')">
<body onload="alert('2')"></body>
</body>

Men alla websidor som inte själva laddar in något kan man således uppenbarligen lura. Det kan exempelvis se ut så här, vilket fungerar utmärkt:

<body>
<body onload="alert('2')"></body>
</body>

På skärmen, vid laddning av den koden, kommer siffran ”2″ dyka upp. Så i kombination med interaktionskommandon, borde det alltså gå att ladda in en bild, med hjälp av onload och samtidigt be bilden att skicka över alla cookies till en websida som inte ligger inom samma domän, även om document.cookie är avstängd? Javisst!

<script>
AnropaEnFunktion()
{
    document.getElementById("BildUtrymme").innerHTML = '<img src="http://server/bild.jpg">';
}
</script>
<body onload="AnropaEnFunktion()"></body>
<div id="BildUtrymme">&nbsp;</div>

I ovanstående funktionsanrop, under förutsättning att huvudsidan inte redan har en body onload, har vi gjort det möjligt att ersätta innehållet i ett element med en bild, helt automatiskt. Anropet blir naturligtvis effektlöst om webläsaren inte har javscriptfunktioner aktiva, men så vitt jag vet så levereras alla vanliga webläsare med denna funktionalitet öppen. Man kan förstås, till exempel i Firefox, skaffa sig NoScript-tillägget, men stänger man av javascript så stängs också alla andra funktioner på hemsidan man besöker av. Eftersom javascript är vida använt idag riskerar man därmed, om man tar IMVU som exempel, att stänga av saker som behövs för att sidan skall fungera överhuvudtaget. Om ovanstående kod skrivs om, bara en liten aning, kan man alltså på samma sätt även börja skicka parametrar till en annan server. Denna annorlunda funktionalitet gör att vi kan passera alla tidigare vanliga säkerhetsspärrar, eftersom vi inte ber javascriptet att exekvera något som ligger på en annan server. Vad som egentligen sker är att vi ber javascriptet göra ändringar på den sida vi redan befinner oss på. Således kommer hela idén med att skydda webbläsare mot ”dålig” Cross Site Scripting (XSS) vara överflödig, med teknisk knockout på första slaget.

Så, ett hett tips till alla webprogrammerare där ute, som vill ge sina användare hög tillgänglighet på sin design i community-profiler är: Don’t do it!


Läs även andra bloggares åsikter om , ,

Share
Posted in IT/Development | Tagged , , | Leave a comment

Lösenordsfria SSH-sessioner

Att minnas…

====== SSH-Certifikat och lösenordsfria sessioner ======

För att skapa en SSH-länk där inget lösenord för inloggningen krävs (i synnerhet för att smidig-göra backuper mellan två linux-system) kan man skapa ett certifikat som gör det möjligt att överföra data säkert och slippa klartextöverföringar via FTP. Nedan beskrivs hur dessa SSH-nycklas skapas och används.\\

1. ssh-keygen -t rsa

Citat:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your public key has been saved in /root/.ssh/id_rsa.pub.

2. scp /root/.ssh/id_rsa.pub root@:/root/key

3. ssh

4. cat key >>~/.ssh/authorized_keys

5. chmod 700 ~/.ssh/authorized_keys

6. logout

7. ssh

Om allt fungerat enligt planerna så kan nu inloggning ske utan användning av lösenord. En överföring via SCP startas sedan genom exempelvis:

Kod:
scp apache-090529.tar.bz2 root@server:/tmp/mirror

Share
Posted in IT/Development | Leave a comment

GNU Kalops v1.0.0

Pure Open Source!

Kod:
 
require_once('cook_engine.php');

define('KÖTT', '1 KG');
define('KÖTT_TYPE', 'GRYTBITAR');
define('LÖK', 2);
define('MOROT', 2);
define('SMÖR', '2 MSK');
define('SMÖR_TYPE', 'MARGARIN');
define('SALT', '1 TSK');
define('VITPEPPAR', '1 KRM');
define('VETEMJÖL', '3 MSK');
define('VATTEN', '5 DL');
define('KRYDDPEPPARKORN', 10);
define('LAGERBLAD', 2);
define('STORLEK', '6 PRT');

define('KNIV', true);
define('SPIS', true);
define('SOURCE_HANDLE_SKÄR', 1);
define('SOURCE_HANDLE_SKAL', 2);
define('SOURCE_HANDLE_BRYN', 4);

define('COOK_DESTINATION', 'STEKGRYTA');

function HandleKalops()
{
    $Output = $CookEngine->Chop(KÖTT, KNIV, COOK_DESTINATION, null, SOURCE_HANDLE_SKÄR);
    $CookEngine->Skicka($Output, COOK_DESTINATION);

    $Output = $CookEngine->Chop(MOROT, KNIV, COOK_DESTINATION, null, SOURCE_HANDLE_SKAL);
    $CookEngine->Skicka($Output, COOK_DESTINATION);

    $CookEngine->Bryn(array(MOROT, LÖK, KÖTT, SMÖR));
    $CookEngine->Krydda(array(SALT, VITPEPPAR));
    while ($CookEngine->CookGuard)
    {
        if (KÖTT == "FINFÄRG")
        {
            continue;
        }
    }
    $CookEngine->Add(VETEMJÖL);
    $CookEngine->Add(VATTTEN);
    $CookEngine->Add(KRYDDPEPPARKORN);
    $CookEngine->Add(LAGERBLAD);
    while ($CookEngine->CookGuard)
    {
        if (KÖTT == "MÖRT" && $CookEngine->CookTimer >= "2 TIMMAR")
        {
            continue;
        }
    }
    $CookEngine->Späd("VATTEN", define('TÄCKA_KÖTTET', true));
    $CookEngine->Wait('DUKA');
    if ($CookEngine->CookGuard_Test == FINISH)
    {
        return true;
    }
    else
    {
        return false;
    }
}


class UserHandle Extends CookEngine
{
    function Chop($type = '', $tool = '', $destination = 'trashbin', $size = '', $metod = '')
    {
        global $CookEngine;
        return $CookEngine->HanteraVerktyg($tool, $type, $size);
    }
}

$CookEngine->Init('KÖK');
while (HandleKalops() == false)
{
    // Wait here
}

$CookEngine->Servera();
$CookEngine->Ät();

?>
Share
Posted in IT/Development | Leave a comment

Bitmasking for C#

Referring to the scripts that handles the bitmasking for the dnsbl.tornevall.org-scripts, this is how to make the same routine in C-Sharp. Based on the Hashtable-namespace to get it as similar as possible.

Kod:
public Hashtable BitMask(int MaskVal, params  int[] bitcheck)
              {
                 Hashtable ReturnThis = new Hashtable();
                 Hashtable Arr = new Hashtable();
                 int loadbits = 8;
                 try { loadbits = bitcheck[0]; } catch (Exception)  { }
  
                 /*
                   * PHP SOURCE
                   * 
                   *   function bitmask ($bit = '', $loadbits = 8)
 *    {
                   *       for ($i = 0 ; $i < $loadbits ; ++$i) {$arr[] = pow(2,$i); }     //  Automatisera bitvärden
                   *       for ($i = 0 ; $i < count($arr) ; ++$i) {$mask[$i] = ($bit &  $arr[$i]) ? '1' : '0';}     // Sätt 1 till de bitvärden som är  påslagna
                   *       return $mask;
                   *   }
                   */
  
                 for (int i = 0 ; i  < loadbits ; ++i) {Arr.Add(i.ToString(), Math.Pow(2, i).ToString());}     // Automatisera bitvärden
 for (int i = 0; i < Arr.Count; ++i)  {ReturnThis.Add(i.ToString(), Convert.ToInt32(Convert.ToBoolean(MaskVal & Convert.ToInt32(Arr[i.ToString()].ToString()))).ToString());}
 return  ReturnThis;
              }

Share
Posted in IT/Development | Leave a comment