MySQL - replace - sök och ersätt

tisdag 31 juli, 2007 kl. 12:59 e m

En smidig funktionalitet i MySQL för att göra enkla sökningar-ersättningar (find-replace) i texter är att använda sig av strängfunktionen replace. Den har visat sig väldigt användbar då jag av misstag fått in en massa junktext i databasen och måste rätta detta.

Syntax:
REPLACE(sträng,från_sträng,till_sträng)

Exempel:
mysql> SELECT REPLACE(’www.mysql.com’, ‘w’, ‘Ww’);
Resultat> ‘WwWwWw.mysql.com’

Förhindra php mail injection

fredag 6 juli, 2007 kl. 10:30 f m

PHP’s mail-funktion (mail) ska man använda med viss försiktighet eftersom spambot’ar relativt enkelt kan utnyttja en inbyggd svaghet/feature/”kalla-det-vad-du-vill”. Det farliga är att många som utvecklar i php inte vet vad som kan hända med svaga osäkrade webbside-formulär som använder denna funktionalitet. Om en spambot hittar och utnyttjar “svagheten” på dina webbsidor så kan du på ett ögonblick bli en storspammare och får då stå för konsekvenserna då du förr eller senare blir uppsökt av din internetleverantör eller webbhotell.

Vanligtvis har man “kontakta oss” eller andra sidor där användare får skriva in sitt namn, e-postadress, ämne samt meddelande. Då man sedan skriver koden som ska maila till den som ska ha informationen så kontrollerar man vanligtvis  att e-postadressen är riktig samt att några av fälten inte är tomma. Eventuellt filtrerar man även meddelandet och tar bort html, konstiga tecken eller liknande. Då man processat variablerna så skickar man in dessa i mail-funktionen som skickar ut mail till den/de som ska få det.

Mail-funktionen anropas enligt följande:

bool mail ( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] )

Exempel på användning:

$to = “kontakt@person.se”
$subject = $[Ämne från webbformuläret];
$message = $[Meddelande från webbformuläret];
$additional_headers = “From:”.$[sändaradress från webbformuläret];
mail($to,$subject,$message,$additional_headers);

Eftersom man hårdkodar mottagaradressen så kan man tro att det enbart är den personen som kommer att få mailet. Men så är INTE fallet utan mejlet kan skickas till ett mycket stort antal personer utan din vetskap (om du nu inte läst detta innan) med så kallad mail injection. Detta nämner inte php-manualen utan kodaren måste själv veta hur mail skickas och hur mail är formaterade. Med tanke på att nivån på php-programmerare varierar kraftigt så är det viktigt att man har koll på något sånt här.

Hur fungerar då detta?
Spambot’arna injicerar ytterligare mottagare i parametern för additional_header som kommer från formulärets sändaradress-input ruta. Genom att lägga till fler mottagare genom CC samt BCC i oskyddade formulär så agerar ditt webbformulär som en spam-proxy.

Exempel på mail injection av sändaradress:

sender@anonymous.www%0ACc:recipient@someothersite.xxx %0ABcc:somebloke@grrrr.xxx,someotherbloke@oooops.xxx

Lösning
Använd rigorösa kontroller även på simpla formulär. Kontrollera att det inte går att injicera mail headers. Använd exempelvis en mail-class som har skydd mot denna typ av problem eller något reguljärt uttryck.

Länkar
mailinjection.com - Mailinjection - Mer om problemet
SecurePhp - Email injection - Beskrivning av problemet och lösningar
Hardened PHP - Suhosin patch - Patch som bl.a används av freebsd ports

Minimera alla program från snabbstartsfältet

onsdag 27 juni, 2007 kl. 8:49 f m

Den lilla behändiga ikonen som “minimerar alla program” som finns i Windows XP’s snabbstartsfält råkade försvinna idag. Jag lyckades inte hitta den heller så vad gör man? Det visade sig att man enkelt kan återskapa ikonen. Öppna din favorit-texteditor och skriv in följande rader

[Shell]
Command=2
IconFile=explorer.exe,3
[Taskbar]
Command=ToggleDesktop

Till sist sparar du denna fil med namnet ShowDesktop.scf
Du har nu en sprillans ny quick launch ikon.

Vad är då filer med scf-filändelsen? Jo en “Windows Explorer Command Shell Command File”. Dessa filer körs av SHELL32.dll och är en speciell filändelse som håller sig hidden även fast man i windows väljer att visa filändelser.

Gömma delar av sidan vid utskrift med CSS

onsdag 27 juni, 2007 kl. 8:33 f m

Idag ställdes jag inför en liten men delikat uppgift. På en webbsida där det finns en “skriv ut” knapp så skall denna knapp gömmas då man skriver ut sidan. Efter en stunds funderande så hade jag en krånglig lösning i huvudet och bestämde mig för att googla efter en bättre lösning. Och som vanligt så har någon haft samma problem.

Det jag inte visste var att det i CSS-2 finns direktiv för hur man lägger till olika stilar (styles) för en sida beroende på vilket medium som används för att titta på den. Så man kan alltså enkelt ha olika stilar för en bunt olika mediatyper. Läs mer om CSS och mediatyper. I mitt fall så var det print-mediatypen den som löste problemet.

Enkelt exempel nedan:

<HTML>
<HEAD>
<STYLE type=”text/css”>

@media print {
.printOnly {display:block;}
.screenOnly {display:none;}
}

@media screen {
.screenOnly {display:block;}
.printOnly {display:none;}
}
</STYLE>
</HEAD>
<BODY>
Sidans innehåll som visas på både skärm samt då sidan skrivs ut
<div class=”screenOnly”>På skärmen enbart, ||min-knapp||</div>
<div class=”printOnly”>På utskriften enbart</div>
</BODY>
</HTML>

Enkelt sätt att undvika spam från webbformulär

onsdag 16 maj, 2007 kl. 11:22 f m

Jag har på ett flertal sajter haft problem med att spam-robotar letar upp “oskyddade” formulär och fyller i dessa med en massa junk som sedan submittas. En lösning på problemet skulle vara att använda någon slags Captcha som är ett slags turing-test som avgör om användaren är människa eller spam-bot. Men detta känns som lite väl mycket overkill för mina sajter.

En lösning som jag använt mig av är att användaren får en input box där de måste fylla i årets år, ex: 2007, för att få gå vidare. Den lösningen har fungerat bra och innebär inte särskilt mycket kod för mig som utvecklare. Men det innebär ett extra steg för användaren som kan upplevas som jobbig eller onödig. Så jag undersökte om det finns ett alternativ som innebär lite kod samt att användaren slipper mata in ytterligare uppgifter.

Den enkla lösningen är att lägga in en extra textarea-kontroll i formuläret som inte visas för användaren genom CSS. Självklart så kan inte spam-roboten hålla sig ifrån att fylla även denna med junk eftersom dom vanligtvis inte förstår sig på CSS. När formuläret sedan valideras på server-sidan så kontrollerar man om fältet är ifyllt eller inte. Om det är ifyllt så är det en spam-robot på sidan och annars är det en människa. 

I formuläret:

<textarea name=”to_adress” style=”display: none;”></textarea>

I formulär-kontrollen

if($_REQUEST[”to_adress”] == “”)
{
// Människa
} else if($_REQUEST[”to_adress”] != “”)
{
// Robot
}

Detta är en fast-and-dirty lösning och se det som en sådan. Använd Captcha eller något mer avancerat om du vill ha en mer avancerad kontroll. Men till enkla low-profile formulär så funkar detta alldeles ypperligt.

Samma lösning i .NET bör fungera enligt följande:

I formuläret:

<textarea runat=”server” id=”to_adress” name=”to_adress” style=”display: none;”></textarea>

eller

<style type=”text/css”>    .gommig {display: none;}</style>
<textbox Runat=”server” CssClass=”gommig” TextMode=”MultiLine” id=”to_adress2″></textbox>

I formulär-kontrollen;

   // Alt textarea
   if( to_adress.Value == “” )
   {
    // Människa
   }
   else
   {
    // Robot
   }

 // Alt textbox
   if( to_adress2.Text == “” )
   {
    // Människa
   }
   else
   {
    // Robot
   }

Hur man blir kvitt det störande “starta om datorn” meddelandet i Windows

fredag 11 maj, 2007 kl. 8:37 f m

Givetvis poppar det förhatliga meddelandet om att jag måste starta om datorn precis då jag är mitt i nått viktigt arbetsmoment. Känner ni igen er? Den säger: Automatiska uppdateringar. Installationen har nästan slutförts. Datorn måste startas om innan uppdateringarna börjar gälla. Vill du starta om nu? “Starta om nu” eller “starta om senare”

 Starta om datorn

Om jag råkar fortsätta skriva så kan det bli så att jag automatiskt väljer “starta om nu” med konsekvensen att windows stänger ner mina program och startar om datorn. Eftersom jag har ett 20-tal applikationer igång med en massa data i dessa så tar denna procedur säkert 10-15 minuter.

Om du väljer “starta om senare” så tror du att du ska slippa meddelandet. Men icke, det dyker upp igen då man minst av allt vill se det. Om du sedan försöker döda processen wuauclt.exe i aktivitetshanteraren så går det bra men inom kort så börjar dialogen poppa upp igen.

Men det finns ett sätt att få stopp på eländet på ett enkelt sätt. Det gör man genom att stänga av tjänsten som sköter detta. Klicka på Start -> Kör… för att få upp en kommandoprompt. Väl där skriver du:

sc stop wuauserv

Om du tittar i tasktray (meddelandefältet) så ser du att den förhatliga ikonen är borta och du slipper popupen. Voila! Men kom ihåg att du förmodligen bör starta om datorn inom den närmsta tiden. För att lättare komma ihåg det här kommandot så kan du skapa en bat-fil med detta kommando.

Marcus Nyberg på google

lördag 28 april, 2007 kl. 2:02 e m

Ett av målen med hemsidan var att folk skulle hitta mig på nätet genom att söka på Marcus Nyberg. Om man söker på Marcus Nyberg på svenska google så kommer min hemsida på tredje plats i sökresultatet. Men tredje plats är väl inget för mig. Målet är givetvis att komma överst i sökresultatet och komma före racingkillen och hockeyspelaren. Tiden får utvisa om jag lyckas.

DateTime till yyyy-MM-dd

torsdag 26 april, 2007 kl. 12:46 e m

En användbar kodsnutt för att få dagens datum på formatet yyyy-MM-dd (ex 2007-04-27):

string dagensDatum = DateTime.Now.ToString(”yyyy-MM-dd”);

Det går givetvis att använda det på vilket DateTime som helst:

DateTime datum = new DateTime(2007,4,27);
string nagatDatum = datum.ToString(”yyyy-MM-dd”);

För att veta vilka fler formateringar som går att göra så kan man läsa mer på DateTime.ToString Method (String) på MSDN.

Quiesce på svenska

tisdag 24 april, 2007 kl. 1:26 e m

I Sharepoint 2007 finns en funktion för att gradvis stänga ner en MOSS-farm för underhåll. Denna feature har fått det märkliga namnet Quiesce som inte säger särskilt mycket. Men efter att ha letat på den engelska och svenska delen av Internet så har jag kommit fram till en lämplig översättning. Det engelska ordet quiescent betyder stilla eller rofylld. Därmed borde den svenska överättningen av quiesce bli något i stil med “att lugna ner”. Frågan är hur man uttalar det på svenska. Min egna version blir “kuishe”.

Microsoft förklarar detta som:
“Quiescing is the process of gradually bringing long-running applications of a resource offline without incurring data loss. It has been introduced in Microsoft Office servers for 2007.”

Wikipedias förklaring av quiesce är denna:
“Quiesce means to slow down a computer to save power while still being available. The process may include shutting down some services. The term is also used to describe minimizing the number of running processes on a computer, particularly those that might modify information stored on disk during a backup in order to guarantee a consistent and useable backup.”

Quishe i Sharepoint betyder att man stoppar farmen från att ta emot nya användaranslutningar och tar gradvis ner applikationer utan dataförlust. Det finns tre nivåer av quiescing:
1) Normal - Aktiv och tar emot alla förfrågingar
2) Quiescing - Farmen hanterar bara existerande förfrågningar men nekar nya.
3) Quiesced - Farmen tillåter inte att nya sessioner startar.

Flipperspelet The Flintstones är färdigt

fredag 20 april, 2007 kl. 9:55 e m

The Flintstones pinball

De senaste veckorna så jag har shoppat (renoverat på flippertugg) mitt nyinköpta flipperspel The Flintstones. Spelet var ruskigt skitigt efter att ha stått ute i lokal de senaste tio åren. Varje del på spelplanen plockades bort och sedan gjorde jag en grundlig rengöring av spelplanen. En halv flaska Novus 2 senare så såg det bättre ut.

Spelet hade ett konstigt fel relaterat till switchmatrisen som gjorde att det blev kortslutningar då switchar på kolumn 8 aktiverades. Det här felet var relaterat till CPU-kortet och närmare bestämt U20 ULN2803A. Efter att jag bytt ut denna IC så funkade allt på spelet som det skulle. Kabinetthögtalaren var helt söndersparkade så jag installerade en av mina gamla 12-tummare där istället. Oj oj vilken bas det blev…

Självklart blev det en ny beställning från p4p med diverse prylar såsom nya gummin, lampor, dropdown targets etc. Efter att allt kommit på plats så blev det en provspelning som resulterade i ett nytt personligt high score på första försöket :D

Kolla på resultatet här: The Flintstones Pinball