<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; plugin</title>
	<atom:link href="http://hovenko.no/blog/tag/plugin/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Slik lurer man PHP Magic Quotes</title>
		<link>https://hovenko.no/blog/2008/09/20/slik-lurer-man-php-magic-quotes/</link>
		<comments>https://hovenko.no/blog/2008/09/20/slik-lurer-man-php-magic-quotes/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 00:41:15 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sikkerhet]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=166</guid>
		<description><![CDATA[Det er fredag kveld, jeg sitter hos en kamerat og progger litt Perl. Så begynte vi å titte litt på hvilke Firefox plugins vi kjørte og fant ut at vi begge hadde Firebug, Web Developer og Download Statusbar. Videre har jeg også en Firefox plugin som heter XSS Me. Da bestemte jeg meg for å [...]]]></description>
			<content:encoded><![CDATA[<p>Det er fredag kveld, jeg sitter hos en kamerat og progger litt Perl. Så begynte vi å titte litt på hvilke Firefox plugins vi kjørte og fant ut at vi begge hadde <a href="https://addons.mozilla.org/firefox/addon/1843" title="Last ned Firefox plugin Firebug">Firebug</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/60" title="Last ned Firefox plugin Web Developer">Web Developer</a> og <a href="https://addons.mozilla.org/en-US/firefox/addon/26" title="Last ned Firefox plugin Download Statusbar">Download Statusbar</a>. Videre har jeg også en Firefox plugin som heter <a href="https://addons.mozilla.org/en-US/firefox/addon/7598" title="Last ned Firefox plugin XSS Me">XSS Me</a>.</p>
<p>Da bestemte jeg meg for å teste Perl-applikasjonen min for sikkerhetshull. Denne applikasjonen er svært enkel. Den har ett HTML-skjema med ett input-felt, og data fra dette feltet blir listet ut på forsiden. &#8220;Shout&#8221; heter det, enkelt og greit. Jeg fyrte avgårde alle testene i XSS Me mot dette skjemaet og fikk ørten sikkerhetsvarslinger i retur. Dette løste jeg riktignok med en enkel pipe igjennom html-filteret til Template Toolkit.</p>
<p>Vi utforsket dette videre. Kameraten min smalt opp et lite PHP-script som tok innholdet fra et textarea-felt og viste det uendret ut på HTML-sida. Vi fant fort ut at PHP gjorde noe magisk bak scenen, som PHP så gjerne ofte gjør; magic quotes heter det. Men jeg lurte jæveln&#8230;</p>
<p><code><br />
&lt;script&gt;<br />
&nbsp;window.location=String.fromCharCode(104)<br />
&nbsp;&nbsp;+ String.fromCharCode(116)<br />
&nbsp;&nbsp;+ String.fromCharCode(116)<br />
&nbsp;&nbsp;+ String.fromCharCode(112)<br />
&nbsp;&nbsp;+ String.fromCharCode(58)<br />
&nbsp;&nbsp;+ String.fromCharCode(47)<br />
&nbsp;&nbsp;+ String.fromCharCode(47)<br />
&nbsp;&nbsp;+ String.fromCharCode(103)<br />
&nbsp;&nbsp;+ String.fromCharCode(111)<br />
&nbsp;&nbsp;+ String.fromCharCode(111)<br />
&nbsp;&nbsp;+ String.fromCharCode(103)<br />
&nbsp;&nbsp;+ String.fromCharCode(108)<br />
&nbsp;&nbsp;+ String.fromCharCode(101)<br />
&nbsp;&nbsp;+ String.fromCharCode(46)<br />
&nbsp;&nbsp;+ String.fromCharCode(99)<br />
&nbsp;&nbsp;+ String.fromCharCode(111)<br />
&nbsp;&nbsp;+ String.fromCharCode(109);<br />
&lt;/script&gt;<br />
</code></p>
<p>Denne koden dekoder tallene til tegn, setter dem sammen til en tekststreng, tilordner tekststrengen til &#8220;document.location&#8221;. Javascriptet sender deg så videre til en ny nettside, rett og slett til <a href="http://google.com">http://google.com</a>.</p>
<p><small>Ironisk nok klarte jeg å <em>redirecte meg selv</em> til google da jeg skulle ta en titt på preview&#8217;n på dette innlegget. Glemte visst å enkode HTML-taggene, tenke seg det&#8230;</small></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2008/09/20/slik-lurer-man-php-magic-quotes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress plugins &#8211; katalogstruktur</title>
		<link>https://hovenko.no/blog/2007/06/07/wordpress-plugins-katalogstruktur/</link>
		<comments>https://hovenko.no/blog/2007/06/07/wordpress-plugins-katalogstruktur/#comments</comments>
		<pubDate>Wed, 06 Jun 2007 22:54:43 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[katalogstruktur]]></category>
		<category><![CDATA[kontroller]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ytelse]]></category>

		<guid isPermaLink="false">http://www.hoven.ws/blog/2007/06/07/wordpress-plugins-katalogstruktur/</guid>
		<description><![CDATA[Når man utvikler en plugin for WordPress som stadig utvides med ny funksjonalitet kan den vokse så stor at det kan bli et uhåndterbart antall filer i pluginkatalogen eller at filene rett og slett blir så store at det er vanskelig å få oversikt over funksjonaliteten i filene. Dette går også ut over ytelsen til [...]]]></description>
			<content:encoded><![CDATA[<p>Når man utvikler en <a href="http://codex.wordpress.org/Writing_a_Plugin">plugin</a> for <a href="http://www.wordpress.org">WordPress</a> som stadig utvides med ny funksjonalitet kan den vokse så stor at det kan bli et uhåndterbart antall filer i pluginkatalogen eller at filene rett og slett blir så store at det er vanskelig å få oversikt over funksjonaliteten i filene. Dette går også ut over ytelsen til WordPress. Et eksempel er plugin-siden i administrasjonsgrensesnittet som søker i alle PHP-filer i alle underkataloger ett nivå under plugins-katalogen etter filer med en <a href="http://codex.wordpress.org/Writing_a_Plugin#File_Headers">plugin-header</a>.</p>
<p>Dersom man kun beholder én PHP-fil, som vi kaller for &#8220;loader&#8221;, i rotkatalogen til pluginen kan ytelsen økes noe. Denne filen inneholer plugin-headeren og den eneste oppgaven til denne filen er å laste de resterende filene i pluginen. Denne loaderen vil videre laste en kontroller i en katalog vi kan kalle for &#8220;core&#8221;. Denne kontrolleren har som oppgave å sette opp hooks for å intregere mot WordPress og ellers kontrollere dataflyten i pluginen.</p>
<p>Den viktigste grunnen for å organisere filene sine er for å få bedre oversikt. En måte å gjøre dette på er å benytte underkataloger basert på funksjonalitet og filtype. For eksempel kan man plassere alle Javascript-filer i en &#8220;js&#8221;-katalog og alle CSS-filer i en &#8220;css&#8221;-katalog. Dersom pluginen din skal ha et administrasjonsgrensesnitt kan disse filene legges i katalogen &#8220;admin&#8221;, og en widget-støttet plugin kan ha widget-relaterte filer i en &#8220;widget&#8221;-katalog. All denne strukturen krever litt ekstra koding og flere filer å holde styr på, men til gjengjeld slipper man å se sine filer vokse til store monstere på flere tusen linjer. Store filer kan lett bli et problem, noe jeg selv har erfart i utvikling av WordPress-plugins.</p>
<p>Eksempel på katalogstruktur for en plugin av passe stor størrelse:<br />
<code><br />
my_plugin_loader.php<br />
/actions/controller.php<br />
/actions/widget.ajax.php<br />
/admin/options.php<br />
/core/my_plugin.php<br />
/css/admin.options.css<br />
/css/widget-css.php<br />
/js/script-loader.php<br />
/js/some_lib.js<br />
/js/widget-js.php<br />
/languages/my_plugin-nb_NO.po<br />
/languages/my_plugin-nb_NO.mo<br />
/widget/widget.control.php<br />
/widget/widget.php<br />
</code></p>
<p>Jeg har her brukt noen passende filnavn. Det er ofte ikke nødvendig å spesifisere katalognavnet som en del av filnavnet, men av og til kan det være smart, avhengig av hvilken editor som benyttes. Selv benytter jeg Eclipse som viser kun filnavnet, og det kan være vanskelig å skille tre åpne filer som alle heter &#8220;control.php&#8221; fra hverandre.</p>
<p>Jeg har tatt med i eksempelet en fil som heter &#8220;script-loader.php&#8221; som kan benyttes for å laste Javascript-filene. WordPress har funksjonalitet for å registrere Javascriptene med navn, URL og avhengigheter. Det er også mulig å spesifisere versjon av Javascriptet, som blir en del av URL-adressen til filen. Dette er svært aktuelt for å tvinge nettlesere til å laste den nye Javascript-filen fremfor å benytte en som kan finnes i en cache ett eller annet sted.</p>
<p>Man kan ha behov for å kalle på funksjonalitet i pluginen som ikke skal benytte det vanlige themet til WordPress, men kanskje bare returnere noe data til et Javascript, utføre en oppdatering eller printe ut en CSS- eller Javascript-fil. Man kan dermed ha behov for en egen <a href="http://www.hoven.ws/blog/2007/03/08/wordpress-plugins-front-controller/">front-kontroller</a> som tar seg av disse forespørslene.</p>
<p>Jeg benytter PHP5 og objektorientering for å utvikle plugins til WordPress, men tankene og forslagene i denne artikkelen kan like gjerne benyttes med en strukturell programmeringsmetodikk. Jeg synes det er alt for mange dårlig skrevne plugins for WordPress, hacket sammen for å gi funksjonaliteten som er ønsket på det gitte tidspunktet. Dette gjør det vanskeligere å vedlikeholde dem senere når nye krav kommer og det gjør integrasjon med andre plugins og nyere versjoner av WordPress til et mareritt. Disse pluginene benyttes så som et utgangspunkt for nye plugins ved hjelp av copy/paste-metoden. Jeg tror at bedre dokumentasjon med gode eksempler kan bidra til bedre kodestandard på plugins.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/06/07/wordpress-plugins-katalogstruktur/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress plugins &#8211; Front Controller</title>
		<link>https://hovenko.no/blog/2007/03/08/wordpress-plugins-front-controller/</link>
		<comments>https://hovenko.no/blog/2007/03/08/wordpress-plugins-front-controller/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 21:05:05 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Jobb]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">/blog/2007/03/08/wordpress-plugins-front-controller/</guid>
		<description><![CDATA[WordPress støtter utvidelser via plugins. Plugins kommuniserer med WordPress-kjernen ved å hekte seg på kroker (hooks). Disse krokene blir eksekvert visse steder i koden, for eksempel når en side med poster skal vises, når en bruker opprettes eller når en post slettes. Det er en handlingskrok (action hook) som heter &#8220;init&#8221; som blir kalt på [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wordpress.org">WordPress</a> støtter utvidelser via plugins. Plugins kommuniserer med WordPress-kjernen ved å hekte seg på kroker (hooks). Disse krokene blir eksekvert visse steder i koden, for eksempel når en side med poster skal vises,  når en bruker opprettes eller når en post slettes.</p>
<p>Det er en handlingskrok (action hook) som heter &#8220;init&#8221; som blir kalt på rett før themet skal lastes inn for presentasjon av postene. Når denne kroken skal eksekveres er plugins lastet og innstillinger lest fra databasen, så denne kroken egner seg svært godt for det jeg nå skal vise, nemlig hvordan man kan kalle på funksjoner i sin egen plugin med via lenker på siden, med HTML forms eller via Javascript og AJAX.</p>
<p>Jeg har ofte hatt behov for å kalle på funksjoner i min plugin fra Javascript på siden, også kjent som Ajax/Web2.0. Jeg har utviklet en plugin som lar brukeren sette et filter, slik at kun innlegg som matcher dette filteret vil bli vist. Jeg skrev denne pluginen på jobben og den er foreløpig kun for internt bruk og er derfor ikke tilgjengelig, men det hindrer meg ikke i å forklare hvordan jeg har brukt denne teknikken.</p>
<p>Dette filteret settes i cookie i nettleseren til brukeren slik at filteret er aktivt helt til brukeren bytter til et annet filter. Filtere kan ligge i nivåer underhverandre. Tenk på det som kategoriene i WordPress, hvor kategorier kan ha en forelderkategori. Jeg skal her vise to eksempler hvor jeg først bruker en link for å bytte til et annet filter, for så å vise hvordan jeg bruker AJAX for å hente en liste med filter.</p>
<p>Linken for å bytte filter kan for eksempel se slik ut:<br />
<code><br />
&lt;a href="http://example.com/?myplugin=set&#038;filter=sport"&gt;Sport&lt;/a&gt;<br />
</code></p>
<p>Da har jeg behov for en sjekk i min plugin, som jeg har valgt å kalle &#8220;myplugin&#8221; (ja, jeg vet, men dette er ikke navnet på min ekte plugin <img src='https://hovenko.no/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ), for å kunne snappe opp ønsket om å bytte filteret til &#8220;sport&#8221;. Jeg har valgt kodeordet &#8220;myplugin&#8221;, det samme som navnet på pluginen jeg har skrevet for å minke risikoen for navnekollisjon. Jeg har en funksjon jeg har hengt på &#8220;init&#8221;-kroken som sjekker om kodeordet er blitt angitt i adressen samt om det finnes en passende handling å utføre.</p>
<p>I eksempelet nedenfor viser jeg også PHP-kode som tar i mot ønsket om å liste ut alle filtere som har et angitt filter som forelder. Legg merke til dersom testen matcher &#8216;list&#8217; vil den printe ut listen for så å dø, hardt og brutalt. Dette er faktisk ønskelig fordi vi skal utføre et asynkront kall med Javascript, noe som betyr at nettsiden ikke skal lastes på nytt, men bare en liten del av nettsiden skal oppdateres. Det som PHP-scriptet skriver ut i eksempelet nedenfor blir hentet opp av Javascriptet som utførte kallet, klar til å inkluderes på nettsiden. Om det er en &lt;select&gt;-liste, en rekke med checkboxer eller noe annet som gjøres med denne listen bestemmes av Javascriptet.</p>
<pre>
<code>
$myplugin = new MyPlugin();
add_action('init', array(&#038;$myplugin, 'check_action'));
//
// Hovedklassen i min plugin
class MyPlugin {
    function check_action() {
        $action = _REQUEST['myplugin'];
        switch($action) {
            case 'set':
                $this->set_filter($_REQUEST['filter']);
                break;
            case 'list':
                $list = $this->get_list($_REQUEST['parent']);
                echo $list;
                exit;
        }
    }
    // Setter nytt filter
    function set_filter($filter = '') {
        // Setter en cookie for brukerens nettleser
    }
    // Returnerer en liste med filtere som har en angitt forelder
    function get_list($parent = '') {
        // finner og returnerer listen med angitt forelder
    }
}
</code>
</pre>
<p>Hvordan Javascriptet som utfører dette asynkrone kallet er programmert skal jeg ikke komme inn på her. Det er et for stort tema å skrive om i denne artikkelen, men det finnes gode ressurser på Internett om AJAX, <a href="http://www.google.com">Google</a> vet det meste. Det kan være verdt å sjekke ut <a href="http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/">Cross-Browser XMLHttpRequest</a>, som gjør det enklere å bruke Ajax uten at man vrir seg i smerte over de mange forskjellige teknikkene som er brukt i nettlesere.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/03/08/wordpress-plugins-front-controller/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
