David Steinsland – informatikkstudent og webutvikler

Innlegg fra kategorien «Programmering»

Restarte Apache via PHP (Windows)

| Ingen kommentarer »

PHP tips og triks

Det å jobbe med Apache og PHP på Windows kan ha sine konsekvenser, spesielt det at du ikke har tilgang til et eneste Linux-verktøy. Men det gjelder å tilpasse seg, noe jeg kan bevise i denne artikkelen.

Apache er installert med et program som heter httpd, hvor du for eksempel kan starte/stoppe serveren, sjekke hvilke moduler som er lastet inn og så videre. Jeg har tenkt å benytte meg av dette programmet, men trenger en fremgangsmåte.

Fremgangsmåter

Det er flere måter du kan restarte Apache på, men nå skal jeg prøve å beskrive mine to favoritter:

  1. Opprette en planlagt oppgave med PHP som kjøres én gang, og som restarter Apache
  2. Opprette en planlagt oppgave som kjører hvert minutt, og som sjekker om det finnes en bestemt fil på serveren. Om denne filen finnes, restarter vi Apache.

Med løsningen i første punkt er vi nødt til å kjøre PHP-filen for å restarte Apache, mens i den andre kan opprette denne spesielle filen via for eksempel FTP. Det hele er smak og behag, men jeg bruker løsningen i punkt 2 på min server, og det er denne jeg kommer til å skrive om videre.

Det første vi må gjøre er å opprette oppgaven som skal kjøres. Dette kan du gjøre enten via command prompt (CMD) eller via kontrollpanelet på Windows.

For å opprette oppgaven via CMD, skriver du inn følgende:

SCHTASKS /Create /TN «Apache Restarter» /SC MINUTE /MO 1 /TR C:\restart.vbs

Her oppretter vi en oppgave med navnet Apache Restarter som skal kjøre programmet C:\restart.vbs hvert minutt. Restart.vbs er programmet vårt som sjekker om den aktuelle filen eksisterer og som restarter Apache.

VBS er et nyttig skriptingspråk som brukes på Windows, og kan sammenlignes med Bash på Unix.

Opprett filen restart.vbs og lim inn følgende kode:

Set WshShell = CreateObject("WScript.Shell" )

REM # hiding the command prompt
If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
    WshShell.Run "cscript """ & WScript.ScriptFullName & """", 0, False
    WScript.Quit
End If

Set filesys = CreateObject("Scripting.FileSystemObject")
restart_flag = filesys.GetAbsolutePathName("C:\www\flags\restart")

If filesys.FileExists(restart_flag) Then
	filesys.DeleteFile (restart_flag), True
	WshShell.Exec ("httpd -k restart")
End If

Det eneste du trenger å endre her, er filnavnet «C:\www\flags\restart». På min server har jeg plassert denne i en mappe jeg har kalt for «flags». Filnavnet er «restart» uten noen filendelse.

Nå har vi egentlig satt opp rutinen vår:

Den planlagte oppgaven kjører restart.vbs hvert minutt, og det programmet sjekker om flagget «restart» finnes i mappen C:\www\flags\. Det eneste vi trenger å gjøre nå, er å opprette filen «restart» hver gang vi ønsker å restarte Apache: og det kan vi gjøre med PHP.

Opprett en ny fil som du kaller restart.php på serveren din, hvor du limer inn følgende kode:

$h = fopen ('C:\www\flags\restart', 'w+');
fclose ($h);

if (file_exists ('C:\www\flags\restart')) {
    echo 'Apache will restart within one minute.';
}

Hver gang du ønsker å restarte Apache kan du da kjøre den PHP-filen fra nettleseren din, eller opprette flagget «restart» via en FTP.

Jeg ønsker løsningen i punkt 1, hva gjør jeg?

Ideen er den samme, bare du oppretter en oppgave via PHP som skal kjøres én gang med parameteret «httpd -k restart»:

exec ('SCHTASKS /Create /TN "Apache Restart" /SC ONCE /TR "httpd -k restart" /st ' . date ('H:i', strtotime ('+1 minute'));

Her oppretter vi en oppgave som skal kjøres én gang ett minutt i fremtiden.

Last ned

Her følger en ZIP-fil med de kodene du trenger.
Last ned apache_restart.zip

NB: Jeg refererer til programmet httpd.exe som kun httpd. Dette er fordi jeg har lagt bin-mappen til Apache i miljøvariabelen PATH. Om du ikke har gjort dette, må du referere til programmet med full sti, eks: C:\Apache2.2\bin\httpd.exe

Dagens tips: Cronjobber på Windows med Wget

| Ingen kommentarer »

I mange ulike sammenhenger kan det være nyttig med Cron jobs på Linux, som skal gjøre en bestemt oppgave til et bestemt tidspunkt. Som webutvikler bruker jeg dette verktøyet jevnt og trutt, for eksempel dersom jeg ønsker å kjøre en PHP-fil hver midnatt. Men hva med Windows?

På Windows har vi noe som heter «Planlagte oppgaver» (eng: Scheduled Tasks) som er så og si ekvivalent med Cron, men det er ikke så veldig utbredt å bruke. I hvertfall brukte jeg endel tid på å finne ut at dette var et brukbart verktøy!

Wget er også et Linuxprogram, og brukes til å besøke en nettjener (webserver) og hente informasjon derfra.  Heldigvis er dette gjort tilgjengelig for Windows, og er nesten identisk med Linuxversjonen.

  1. Last ned siste versjon av Wget
  2. Kopier innholdet i zip-filen til for eksempel C:\wget\

Nå som wget er på plass, trenger vi bare kjøre en kommando i kommandolinjen til Windows (Start -> Kjør -> cmd.exe). Denne starter den planlagte oppgaven vår, hvor vi setter de ulike parameterene for oppgaven.

I CMD limer du inn følgende:

schtasks /create /tn "Windows Cronjob" /tr "c:\utils\wget\wget.exe -O - -q -t 1 http://example.com/cron.php" /sc hourly

Her oppretter vi oppgaven «Windows Cronjob» som skal kjøre programmet Wget (plassert C:\utils\wget\ hos meg) med argumentene: «-O – -q -t 1 http://example.com/cron.php». Det betyr simpelthen at den skal besøke cron.php som ligger på domenet example.com. Oppgaven skal også utføres hver time.

Det var dét! Så enkelt kan det faktisk gjøres; og det fungerer fint. Kjekt «triks» å kunne dersom du utvikler på en Windowsmaskin.

Sikkerhet i PHP gjort lettere

| 5 kommentarer »

Når du utvikler en nettside, enten det er en applikasjon, rammeverk, bibliotek — hva som helst — er det desidert viktigste sikkerhet. Likevel er det mange som tar snarveier, og slurver seg unna. Om du vil unngå å stå med skjegget i postkassen den dagen du blir angrepet via XSS, CSRF eller SQL injections bør du følge med nå.

Hvorfor?

Du skal aldri stole på brukerne dine. Selv om det er familien eller vennene dine. Årsaken er at enkelte personer kan utnytte sårbarhetene i systemet ditt, som kan resultere i at sensitiv informasjon blir samlet, slettet eller endret. Det kan resultere i at noen tar fysisk kontroll over nettsiden din.

Hva kan man gjøre?

Ved å følge prinsippet ovenfor, må du sørge for å validere all data du skal hente inn fra brukerne. Du bør også sanitere data.

Validering: sjekke om data er av riktig type, for eksempel en ordentlig E-postadresse eller postnummer.
Sanitering: manipulasjon av data, som for eksempel å fjerne enkelte tegn/bokstaver/tall og så videre.

I PHP får vi tilgang til brukerdata via super-globalene $_GET, $_POST, $_COOKIE, $_SERVER og $_SESSION.

Her kan brukere bokstavelig talt skrive hva de vil, og det kan betyr store følger om du ikke sjekker dataene ordentlig.

Løsningen

Jeg har skrevet et bibliotek i PHP kalt «PHP Security Wrapper«. Dette biblioteket tar seg av brukerdata fra GET, POST, SERVER og COOKIE, samtidig som du får muligheten til både å validere og sanitere dem.

Biblioteket er selvfølgelig gratis, og oppdateres hyppig. Om du ønsker å lære mer om dette biblioteket kan du lese forumtråden jeg postet på Norsk Webforum, sjekke ut nettsiden og lese dokumentasjonen.

Det er ikke meningen at dette blogginnlegget skulle ta for seg hvordan du kan sikre deg mot angrep, men om du ønsker å lese videre på emnet kan du sjekke ut følgende linker:

Wamp: Sette opp egen hjemmeserver

| 3 kommentarer »

Tidligere har jeg beskrevet hvordan du kan installere ffmpeg på Wamp, samt hvordan du kan opprette underdomener på Wampserver. Nå tenkte jeg å forklare hvordan du kan sette opp en liten hjemmeserver som du få tilgang til gjennom Internett.

Hva er en hjemmeserver?

Kort sagt er det et Webhotell du har på din egen PC. Du styrer alt av underdomener (forklart i egen artikkel), PHP-, Apache- og MySQL-innstillinger med mer. Veldig fleksibel løsning til utvikling, da du kan invitere andre utenfor nettverket ditt til f. eks. å teste systemet.

For å koble deg på hjemmeserveren, stilles det to krav:

  • WampServer må kjøres, og satt i Online-modus
  • Port 80 må være åpen, det vil si at du har viderekoblet denne i ruteren din til PC-ens IP-adresse.

NB: Du vil ikke bli tildelt et domenenavn (som «minside.com») da dette blir styrt av en DNS, som ofte koster penger.

Hva trenger vi?

Normalt bruker Internett port 80 til å sende og motta informasjon, men noen ISP-er har denne porten blokkert slik du ikke kan sette opp en hjemmeserver. Slapp av — det er mulig å jobbe seg rundt.

Om det skulle vise seg at porten er blokkert, må du konfigurere Apache til å følge med på (eng. «listen») en annen port. Velg gjerne 8080.

Videre i denne guiden tar jeg som utgangspunkt at du kan bruke port 80 uten problem (dette gjelder de aller, aller fleste).

Let’s get to it!

I mitt internnettverk har PC-en min (som serveren er installert på) en fast IP-adresse, 192.168.0.197. Ruteren min er en Linksys WRT54GL (som jeg for øvrig anbefaler på det sterkeste). Jeg tar ikke opp emnet om å videreføre porter i denne guide, da alle har hver sin ruter og oppsettet varierer derfor. Men ved å følge Port Forward sin enkle guide, blir det en lek å åpne porten. Sørg bare for at PC-en din er stilt inn med en statisk IP!

Når du har sørget for at porten din er åpen, vel — da er du i bunn og grunn ferdig. Om du er i tvil om du har åpnet porten skikkelig, så kan du ta deg en tur innom CanYouSeeMe og skriver inn 80 som portnummer. Du er nødt til å ha Wamp kjørende for at den skal klare å sjekke det. Om du får opp en feilmelding, er det fordi:

  • Du har gjort en feil da du åpnet porten din. Har du skrevet inn riktig IP-adresse, og haket av for «Enable» ?
  • ISP-en (Internett-tilbyderen) din blokkerer port 80, og du må derfor velge en annen port

Jeg vil råde deg til å passordbeskytte både phpMyAdmin og index.php i www-mappen. På denne måten har du kontroll over at ingen uvedkommende skal ødelegge prosjektene dine.

For å sjekke om du virkelig kan koble deg til serveren din, går du innom WhatIsMyIP og finner ut hvilken IP-adresse du har på Internett. Kopier denne inn i adressefeltet i nettleseren din, og se resultatet!

IP-en peker egentlig til ruteren din (det ytterste elementet i nettverket ditt), men ruteren vil registrere at du kommer fra Internett (port 80), og retter denne forespørselen videre til en PC på lokalnettet. Dette gjelder selvsagt kun dersom du har konfigurert ruteren din slik jeg har beskrevet.

Jeg kan skissere prosessen slik:

Om du føler det blir vanskelig å huske IP-adressen din hver gang du skal innom serveren din, kan du alltids registrere deg hos en gratis DNS-tilbyder.

Håper du fikk nytte av denne guiden! Kom gjerne med tilbakemeldinger i kommentarfeltet.

Yr.no – vise værdata direkte på nettsiden din

| Ingen kommentarer »

Siden den norske nettbaserte værtjenesten Yr.no frigir sine værdata gratis, er det mange som er i stand til å vise været fra sin hjembygd på nettsidene sine. Men hvordan gjør dem det?

Jeg skrev for en stund tilbake siden en PHP-klasse som gjorde akkurat dette: hentet frem værdata basert på et norsk postnummer.

Funksjonen mellomlagrer værdataene i ti minutter, slik at belastningen på Yrs servere skal minimeres, og at lastetiden hos brukeren skal oppleves raskere.

Kort fortalt er det kun fem linjer med kode du bør konsentrere deg om:

define ('PATH_WEATHER_ICONS', 'img/weather/');
define ('PATH_CACHE', 'cache/');
define ('CACHE_EXPIRATION', 600);
// How many days we are going to show
define ('DAYS_TO_SHOW', 3);

// The Zip code to which place we will fetch information about
// Defaults to 5440
$zip = isset ($_GET['zip']) ? intval ($_GET['zip']) : 5440;

Først av alt må du fortelle hvilken mappe bilde-ikonene ligger i, og hvor PHP-klassen skal mellomlagre dataene. Deretter spesifiserer du hvor lenge dataene skal bli mellomlagret (600 sekunder = 10 minutter), samt hvor mange dager fremover i tid du skal vise.

Sist, men ikke minst må du spesifisere fra hvor du skal hente værdata fra. Du må endre «5440″ til det postnummeret du vil scriptet skal vise ved default. Dersom du vil se værdata fra et annet postnummer, skriver du følgende i adressefeltet:

index.php?zip=<nytt postnummer her>

Laste ned

PHP-klassen er tilgjengelig via tillegg.yr.no, og er som vanlig lisensiert under Creative Commons.

Tips

Du kan meget lett integrere PHP-klassen min med databasesettet mitt over alle norske postnummer. Slik kan du også finne ut om postnummeret brukeren ønsker å vise, faktisk finnes. Mer informasjon om databasesettet finner du i egen artikkel.

Tilbakemeldinger

Som vanlig setter jeg pris på tilbakemeldinger, som du kan dele i kommentarfeltet!