76
KristiansandPHP PHP-nytt fra London, og frontend fokus på skjema Møte nr 1

Kristiansand php meeting #1

Embed Size (px)

Citation preview

Page 1: Kristiansand php meeting #1

KristiansandPHP

PHP-nytt fra London, og frontend fokus på skjema

Møte nr 1

Page 2: Kristiansand php meeting #1

PHP user groups

Page 3: Kristiansand php meeting #1

Norden: København, Helsinki og Kristiansand

Page 4: Kristiansand php meeting #1

Agenda

❖ 18:00 velkommen

❖ 18:15 PHP fokus

❖ 19:00 pizza!

❖ 19:15 frontend fokus

❖ 19:45 uformell mingling

❖ 20:00 ferdig

Page 5: Kristiansand php meeting #1

Kort om Morten

❖ Jobbet som webutvikler (frontend og fullstack) i 13 år

❖ Perl, Java, PHP, ASP og ASP.NET

❖ Jobbet for Ericsson, Logit-Systems, Current Software og Netlab

❖ Bakgrunn fra drift, support og opplæring

❖ Hobby-firma, getOnWeb i 12 år (av og til er det litt kjedelig på jobb…)

Page 6: Kristiansand php meeting #1

Hvem er vi?

❖ Navn?

❖ Firma?

❖ Hva du lager?

❖ Hvor mange år har du programmert i?

❖ Hvilke andre språk har du jobbet med?

❖ IDE/editor?

Page 7: Kristiansand php meeting #1

http://phpconference.co.uk/ https://joind.in/event/view/3063 https://youtu.be/os1-plBMaKU?

list=PL_aPVo2HeGF_VdlTpUF6ViNgLC7Raph0i

PHP UK Conference 2015Morten har vært på PHP UK Conference 2015 nettopp, og kom hjem til Norge med mange impulser og fantastiske opplevelser. 700 PHP-nerder samlet i 2 hele dager, foredragsholdere fra USA, Italia, Tyskland og England :-)

Page 8: Kristiansand php meeting #1
Page 9: Kristiansand php meeting #1

Alle andre…

❖ Objekt orientert programmering, alt annet er latterlig…

❖ GIT er selvsagt

❖ Composer er forventet

❖ API, det er kult og alle bruker det

❖ Community, dersom du ikke er en del av det, så går du glipp av mye!

Page 10: Kristiansand php meeting #1

Coderabbi`s råd for læring

❖ Mentor

❖ Lær av andre

❖ Det er mye læring i å lære til andre

❖ Kollega

❖ Code review (begge kan lære)

❖ Open source (viktig for egen læring)

❖ Rubber ducking (code review self)

❖ Pair coding / ekstrem programmering

Page 11: Kristiansand php meeting #1
Page 12: Kristiansand php meeting #1

Lornajane – nytt i PHP❖ Er du på eldre enn v5.5? Oppgrader!❖ date.timezone må settes i v5.5 ellers kan det bli

uforutsigbart❖ Les E_STRICT loggen (nyttig til forbedring, spesielt

ved oppgradering)❖ Traits likner på klasser, men de er PHP snippets som

blir "kopiert" inn❖ Ny passord håndtering i PHP, salt og algoritme i

passordet er sterkt anbefalt!❖ password_hash()❖ password_verify()

❖ Built-in OpCache, opensource fra Zend, men må enables ;-)

Page 13: Kristiansand php meeting #1
Page 14: Kristiansand php meeting #1

Jordi - Composer best practices❖ Jordi og Adermann har lagd Composer❖ Viktig med README.md❖ Kommandoen "composer require " er enklere enn å hacke json-filen❖ Bruk Packagist for å søke etter komponenter❖ Vær bevist på hvilke versjoner du henter ned, spesialtegn hjelper

med kontroll på dette:❖ ^ ~ * er tegn som kan kombineres med versjonsnummer❖ F.eks. ~2 vil gi alle updateringer av versjon, men ikke v3. Bra

oppdatering/kontroll ❖ Og han anbefaler Monolog:

❖ Logs to files, sockets, inboxes, db, web services.❖ Tips for optimalisering:

❖ -optimizer-autoload❖ -prefer-dist

Page 15: Kristiansand php meeting #1

Javier, continuosly delivering

❖ git + github

❖ Jenkins

❖ Ansible

❖ Phing (tilsvarende Ant i Java....)

Page 16: Kristiansand php meeting #1
Page 17: Kristiansand php meeting #1
Page 18: Kristiansand php meeting #1
Page 19: Kristiansand php meeting #1
Page 20: Kristiansand php meeting #1
Page 21: Kristiansand php meeting #1
Page 22: Kristiansand php meeting #1
Page 23: Kristiansand php meeting #1
Page 24: Kristiansand php meeting #1
Page 25: Kristiansand php meeting #1
Page 26: Kristiansand php meeting #1
Page 27: Kristiansand php meeting #1
Page 28: Kristiansand php meeting #1
Page 29: Kristiansand php meeting #1
Page 30: Kristiansand php meeting #1
Page 31: Kristiansand php meeting #1

Rob Allan - API with Apigility (Zend)

❖ Bruk HTTP codes for alt det er verdt!

❖ Apigility provides the boring bits of API building:

❖ Content negotiation, versioning, validation, authentication, documentation

❖ Anbefaling: swagger.io og frisbyjs.com

Page 32: Kristiansand php meeting #1

HTTP Methods for RESTful Services

PUT komplett replace

PATCH enkelte endringer

POST nye objekter

DELETE sletting

GET henting av data

Page 33: Kristiansand php meeting #1
Page 34: Kristiansand php meeting #1

Trust no one!❖ Steps for input:

1. Filter fikser input. Eks: trim();

2. Validering av filtrert data. Eks: epost sjekk, steng lengde

❖ HTTP codes for errors:❖ 400: client error❖ 422: partly wrong data

❖ Gi klare feilmeldinger

Page 35: Kristiansand php meeting #1
Page 36: Kristiansand php meeting #1

Versjon i URL eller i Accept?

Page 37: Kristiansand php meeting #1

Hypermedia in JSON (Collection)

Page 38: Kristiansand php meeting #1

Authentication

❖ HTTP Basic (htpassword) and Digest, for internal APIs

❖ OAuth2 (Facebook, Google…), for public APIs

❖ Correct errors: 401, 403, etc.

Page 39: Kristiansand php meeting #1

MVVM and Silex

❖ Halve salen bruker Silex (Symfony light...)

❖ Bower.io er tilsvarende Composer

❖ MVVM rammeverk:

❖ Angular (mest populært)

❖ Backbone (lang fartstid)

Page 40: Kristiansand php meeting #1

AngularJS fra Google er populær...

Page 41: Kristiansand php meeting #1

OWASP.org - top 10, av Gary Hockin

❖ Basert på omfang og alvorlighetsgrad, har OWASP kommet fram til de viktigste sårbarhetene.

❖ Listen revideres jevnlig.

Page 42: Kristiansand php meeting #1

10. UNVALIDATED REDIRECTS AND FORWARDS

❖ Alternative løsninger:

❖ Whitelist

❖ Bare interne lenker på forward

Page 43: Kristiansand php meeting #1

9. USING COMPONENTS WITH KNOWN VULNERABILITIES

❖ COMPOSER === EPICCOMPOSER === BADNot just your dependencies, but the dependencies of the dependencies of the dependencies…

Page 44: Kristiansand php meeting #1

8. CROSS-SITE REQUEST FORGERY (CSRF)

❖ Use only POST

❖ Require user interaction

❖ Don’t use sticky logins for anything that important

❖ Use CSRF token

❖ Eks: neste gang du går inn på Amazone, så er det kanskje en ukjent bok ihandlevognen din…

Page 45: Kristiansand php meeting #1

7. MISSING FUNCTION LEVEL ACCESS CONTROL

❖ F.eks: delete, uten rettighets sjekk

Page 46: Kristiansand php meeting #1

6. SENSITIVE DATA EXPOSURE❖ If you’re loading your form over

http you’re already too late

❖ Password_hash

❖ Don’t store sensitive data at all

❖ Listen to an expert @ircmaxell

❖ You’re a developer, not a security expert

❖ “Don’t store naked pictures of yourself on a a cloud server you don’t control" - Gary Hockin

Page 47: Kristiansand php meeting #1

5. SECURITY MISCONFIGURATION

❖ You’re a developer, not a security expert

❖ You’re a developer, the code is your problem

Page 48: Kristiansand php meeting #1

4. INSECURE DIRECT OBJECT REFERENCES

❖ F.eks hacke url og få tilgang til noe du ikke burde

Page 49: Kristiansand php meeting #1

3. CROSS-SITE SCRIPTING (XSS)

❖ Escape all user input all the time

❖ Whitelist allowable characters rather than blacklisting bad characters

❖ Good escaping libraries are out there

Page 50: Kristiansand php meeting #1
Page 51: Kristiansand php meeting #1
Page 52: Kristiansand php meeting #1
Page 53: Kristiansand php meeting #1
Page 54: Kristiansand php meeting #1

2. BROKEN AUTHENTICATION AND SESSION MANAGEMENT

❖ Session.Use_only_cookies

❖ Session regeneration

❖ Password confirmation, inni applikasjonen for ekstra sikkerhet på enkelte elementer

❖ “Secure” sessions: $_SESSION[‘ipAdr’] = $ipAdr; if ($ipAdr!== $_SESSION[‘ipAdr’]) session_destroy();

Page 55: Kristiansand php meeting #1

1. INJECTION

❖ Filter all the tings all the time!news.php?news_id=;DROP TABLE news;

Page 56: Kristiansand php meeting #1

Enda et injection eksempel

❖ login.php?user=m.moss&password=1’%20OR%201=1;

Page 57: Kristiansand php meeting #1

PHP har innebygd filter funksjon

❖ $username = filter_var($_GET[‘username’], FILTER_SANITIZE_EMAIL);

❖ $priority=filter_input(INPUT_GET, 'priority', FILTER_VALIDATE_INT);

Page 58: Kristiansand php meeting #1

Use parameterised queries (binding)

❖ $stmt = $pdo->prepare( 'SELECT user_id FROM user WHERE username = :username & password = :password’);

❖ $result = $stmt->execute([ ‘username’ => $username, ‘password’ => $password]);

Page 59: Kristiansand php meeting #1

PHP binding mot Oracle db

$stid = oci_parse($conn,"INSERT INTO mytab (id, text) VALUES(:id_bv, :text_bv)”);

oci_bind_by_name($stid, ":id_bv", $id);

oci_bind_by_name($stid, ":text_bv", $text);

oci_execute($stid);

Page 60: Kristiansand php meeting #1

My debugging and performance toolbox

❖ Charles - http proxy (Fidler for Windows brukere)

❖ XDebug - remote debugging, tips: ini_set("xdebug.scream")

❖ Xhprof - profiling

❖ JMeter - load testing

❖ PHPunit - unit testing

❖ Behat - behavior-driven development

❖ https://github.com/lovesoftware

Page 61: Kristiansand php meeting #1

Frontend - skjema

Page 62: Kristiansand php meeting #1

Skjema - et nødvendig onde…

❖ Skjema står mellom bruker og mål

❖ Login -> tilgang

❖ Registrering ->gi veldighet

❖ Gi info -> få nedlastning

❖ Selvbetjening

❖ Bestille sydentur

❖ Søk og filtrering

Page 63: Kristiansand php meeting #1

Konvertering

❖ Tommelfinger regel: 5% reduksjon pr felt i skjema

❖ Det man forstår vil man lettere oppgi

❖ Det man ikke forstår, vil man være motvillig til å oppgi

❖ Graden av motivasjon har innvirkning på hvor mye motstand man orker å jobbe seg gjennom

❖ Kan du flytte noen spørsmål/valg til etterpå?

Page 64: Kristiansand php meeting #1

Bedre skjema

❖ Økt omsetning

❖ Lavere administrasjonskostnader

❖ Fornøyde brukere

Page 65: Kristiansand php meeting #1
Page 66: Kristiansand php meeting #1

Don`t make me think❖ Tekstene er viktige, både label,

placeholder, hjelpetekst og feilmelding

❖ Bruk riktig input type

❖ Riktig rekkefølge

❖ Intern og ekstern konsekvent design, ikke vær “kreativ”

❖ Det er bedre å fikse, enn å komme med feilmelding (trim, regex, uppercase osv)

Page 67: Kristiansand php meeting #1

Don`t waste my time❖ Ikke spørr om unødvendigheter

❖ Ikke tving meg til å lese lange tekster

❖ Bruk oppslag på postnr, mobil, medlemsnr osv (spesielt viktig på mobile devicer, der inntasting er kostbart)

❖ Ikke spørr om noe som systemet kan/bør vite, er du innlogget, eller kommer via en PURL, så utnytt det til å gjøre det enkelt for bruker

❖ Det som er inn nå, er å gjette hva bruker vil, og så heller ha en undo-mulighet. Noen valg er opplagte…

Page 68: Kristiansand php meeting #1

Brukervennlighet

❖ Tips og hjelp nærme feltet

❖ Feilmelding som er til hjelp

❖ Tydlig design på feilmeldinger

❖ Validering med JavaScipt (evt. ajax, om det trengs en tur til serveren)

❖ Possitiv validering kan i noen tilfeller forbedre skjema betraktelig (f.eks. om ønsket brukernavn er ledig)

Page 69: Kristiansand php meeting #1

Standard fargebruk

Page 70: Kristiansand php meeting #1

Captcha er dårlig brukeropplevelse

❖ Bruk heller et skjult felt

❖ Som skal være tomt

❖ Som skal ha fast innhold

❖ Som skal ha et bestemt innhol, som du programmer mot, serverside

Page 71: Kristiansand php meeting #1

UU - Universal Utforming

❖ http://uu.difi.no/veiledning/nettsider/uu-skolen

❖ Mange krav til skjema

❖ Label koblet med for=id

❖ Hjelpetekster og feilmeldinger

❖ Knapper må være tydelig knapper

❖ Tastatur navigering

Page 72: Kristiansand php meeting #1

HTML kode

❖ pattern og required er glimrende for validering

❖ novalidate på skjema hindrer browser fra å validere, bedre at vi gjør det

❖ data- gir oss utrolig mange mulighet, f.eks. data-msg=“Vi trenger din e-post for….”

Page 73: Kristiansand php meeting #1

Litt jQuery har aldri skadet noen…❖ // vise felt for e-post, dersom man vil ha nyhetsbrev

$(“#nyhetsbrev”).on(“change”, function(){ if($(this).is(“:checked”)) $(“#epost”).slideDown(); else $(“#epost”).slideUp(); });

❖ // vis resten av skjema, dersom bruker trykker på knappen $(“#add”).on(“click”, function(){ $(this).remove(); $(“#more”).fadeIn(); });

Page 74: Kristiansand php meeting #1

PHP snacks

❖ $c = $a ?: $b;

❖ $_POST=array_map(‘trim’,$_POST);

❖ $array = (array)$object;

❖ if (!isset($_SESSION)) session_start();

❖ /* @var $item ItemModel */echo $item->title;

Page 75: Kristiansand php meeting #1

Tools og anbefalinger

❖ http://snipsave.com - ta vare på code snippets

❖ https://security.sensiolabs.org/check - sjekk composer.lock

❖ https://www.transformy.io/#/app - alternativ til Excel for å jobbe med copy&paste og export/import

❖ http://www.webpagetest.org

Page 76: Kristiansand php meeting #1

jQuery plugins

❖ http://digitalbush.com/projects/masked-input-plugin

❖ http://bootboxjs.com

❖ http://harvesthq.github.io/chosen