mboost-dp1

Sikkerhed og PHP


Gå til bund
Gravatar #1 - Bllets
5. nov. 2008 20:43
Jeg er pt. i gang med Webintegrator uddannelsen og efter en snak med lærerne om det videre forløb, fik jeg lokket ud af dem hvad kunne give de dejlige 12 taller.

Dette var ting som:
-God brug af CSS
-Javascript
-Javascript finurligheder som f.eks. Lightbox
-Sikkerhed
-Og diverse andre ting som vi ikke når at lære

Nu er det sådan at jeg har styr på 3 ud af de 4 ting som jeg har listet. Men er jeg næsten på bar bund angående sikkerhed og PHP.

Det jeg har fattet indtil videre er at det er en god ide at bruge mysql_real_escape_string(). Og det er så det...

Jeg har selv kun fundet frem til: http://www.devlounge.net/code/php-security og jeg forstår sådan set det godt delvist, dog forstår jeg ikke helt hvordan jeg skal bruge kryptering ind og ud af MYSQL databasen.

Nogen med nogle tips eller gode/bedre tutorials?
Gravatar #2 - arne_v
5. nov. 2008 20:52
#0

Sikkerhed afhænger normalt mere af design end af teknologi.

Datavalidering client side for convenience - datavalidering server side for security.

Altid parameters / prepared statement for at undgå SQL injection.

Altid datavaliderng for at undgå XSS.

Kræv at AJAX requests er POST ikke GET.

HTTPS til transport af alt der bare er tilnærmelsesvist er fortroligt.
Gravatar #3 - arne_v
5. nov. 2008 21:02
#0

Brug af mysql_real_escape_string() ville hos mig give dumpe karakter. I moderne PHP er mysqli og prepared statement den rigtige måde.

Kryptering i databasen er voldsomt overvurderet som sikkerheds faktor. En egentlig kryptering hvor key findes enten i app eller i samme database er stort set værdiløst. Hashing (nogen gange kaldt envejs kryptering) af passwords er godt i et enkelt tilfælde, nemlig hvor de sorte hatter af anden vej har fået adgang til databasen og nogle af brugerne har samme password andre steder. Det er godt, men ikke et af de vigtigste punkter. Eksemplet fra newz.dk viser dog at det skal gøres !

Artiklen er ikke super-god:
* MD5 og SHA1 er ikke kryptering men hashing
* der er ingen som kan dekryptere en hashing - man kan allerhøjest generere en collision
* MD5 er forældet og bør aldrig bruges, SHA1 kan lige akkurat bruges, men SHA256 er det man bør bruge
* quote navne i SQL bidrager ikke med noget til sikkerheden
* mysql_real_escape_string() er som sagt ikke den bedste måde at beskytte mod SQL injection på
* felter i databasen som er reserverede ord er ikke pænt
Gravatar #4 - Bllets
5. nov. 2008 21:17
#3
Takker for informationen.

Jeg går ud fra at med mysqli mener du MySQL Improved, som ikke ser ud til at være så meget anderledes end MySQL, men så let er det vel ikke?

Og så er der lige alt det her:
Datavalidering client side for convenience - datavalidering server side for security.

Altid parameters / prepared statement for at undgå SQL injection.

Altid datavaliderng for at undgå XSS.

Kræv at AJAX requests er POST ikke GET.

HTTPS til transport af alt der bare er tilnærmelsesvist er fortroligt.


Siger mig faktisk ikke det store, måske lige bortset fra "Altid datavaliderng for at undgå XSS.".
Som det er tydeligt at jeg forholdsvis ny (1år on/off) til programmering.

http://php.net hjælper en del, men syntes dog at den er forvirrende nogen gange.

Det jeg sådan set håbede var sådan længere artikler/tutorials/guides/etc. som kunne få mig videre i forløbet med PHP, nu hvor uddannelsen ikke rigtig gør..
Gravatar #5 - arne_v
5. nov. 2008 21:23
#4

Ja.

http://www.php.net/manual/en/book.mysqli.php

Og sikkerhedsmæssigt er der stor forskel på den og den gamle mysql extension.
Gravatar #6 - arne_v
5. nov. 2008 21:24
#4

Prøv og google/wiki'e nogen af tingene.

Selvom det du finder ikke er laver eksempler i PHP, så kan du sikkert lære noget af det alligevel. Meget af det er som sagt ikke spor PHP specifikt.
Gravatar #7 - Bllets
5. nov. 2008 21:28
#5
Den der havde jeg dog spottet, og er i gang med at læse (:

#6
Jeg prøver.. Men garantere jeg nok vender tilbage :)
Gravatar #8 - arne_v
5. nov. 2008 21:39
#7

Jeg mener faktisk at der er en del PHP programmører her på newz.dk, så ...
Gravatar #9 - Windcape
10. nov. 2008 15:51
Bllets (4) skrev:
#3
Takker for informationen.

Jeg går ud fra at med mysqli mener du MySQL Improved, som ikke ser ud til at være så meget anderledes end MySQL, men så let er det vel ikke?

Og så er der lige alt det her:

[...snip...]

Siger mig faktisk ikke det store, måske lige bortset fra "Altid datavaliderng for at undgå XSS.".

Det er lidt skræmmende at du ikke har LÆRT DET på din uddanelse.

Men ikke overraskende, har selv tilbragt en 8 måneder på webintegrator for at leeche SU mens jeg spillede WoW.

Men alt hvad arne_v har sagt er sådan set korrekt, hvis du har mere konkrete spørgsmål senere, så prøver jeg at holde tråde her tagget.

Gravatar #10 - Windcape
10. nov. 2008 15:57
http://php.net hjælper en del, men syntes dog at den er forvirrende nogen gange.
php.net skal ligesom så mange andre sprog-dokumentationssider betragtet som API DOCS, hvor php er dit API.

Sikkerhed handler som tidligere nævnt om design, og design er grundlæggende og ikke noget man definerer per sprog.

En af de store problemer med php har dog været mangel på værktøjer til implementeret af typiske design. Det er der dog rettet meget op på i PHP5.

Hvis du ikke allerede benytter PHP5, kan du godt begynde nu. Der er officielt ingen support af PHP4 om 1½ månede.

Hvad du rent faktisk skal lære uden for skoletiden, er noget noget i retning af design patterns og OOP, som du så kombinerer med din rent pratiske erfaring med php.

Sikkerhed er simpelt: ALT BRUGER INPUT SKAL VALIDERES!.

Og med ALT, mens der ALT!

Derudover er der serverside teknikker som at lave 99% af siden under public-dir, og kun have media (billeder/css/lyd) og en frontcontroller i public-dir.

Ligesom at du ALDRIG må benytte eval() , og ALDRIG have nogen som helst form for backup og konfigurationsfiler liggende i public-dir.

dinside . dk / config.php må simpelt ikke kunne lade sig gøre, ligegyldigt om du ikke kan se indholdet af den eller ej.
Gravatar #11 - Windcape
10. nov. 2008 16:01
Og et et par links:

PHP & Web Application Security Blog af Chris Shiflett :)

Sara Golemon's Blog - Hun skriver nogle gange nogle nice ting som er værd at vide, men det er nok over i den meget nørdede sektion.

:-)
Gravatar #12 - Spiderboy
10. nov. 2008 16:12
arne_v (2) skrev:
Kræv at AJAX requests er POST ikke GET.

Hvorfor? (PS: jeg er ikke ret AJAX-erfaren)

Windcape (10) skrev:
Ligesom at du ALDRIG må benytte eval() , og ALDRIG have nogen som helst form for backup og konfigurationsfiler liggende i public-dir.

Som udgangspunkt er jeg enig, men hvad hvis man f.eks. har PHP-kode liggende i sin database (skrevet af webudvikleren), er det så et problem? Hvis en blackhat får adgang til databasen er det jo selvfølgelig, men så er man jo screwet under alle omstændigheder.

Windcape (10) skrev:
dinside . dk / config.php må simpelt ikke kunne lade sig gøre, ligegyldigt om du ikke kan se indholdet af den eller ej.

Tja, hvis den kun definerer variable kan jeg ikke se problemet i at den ligger i public-dir.
Gravatar #13 - Windcape
10. nov. 2008 16:38
Som udgangspunkt er jeg enig, men hvad hvis man f.eks. har PHP-kode liggende i sin database (skrevet af webudvikleren), er det så et problem?
Du skal ALDRIG have php kode liggende i en database.

Forestil dig SQL injection + eval() = Jeg ejer din server nu. *host* newz.dk *host*

Hvorfor? (PS: jeg er ikke ret AJAX-erfaren)
Så folk ikke kan tilgå dem direkte, det er et performance boost. Ved ikke om der er mere i det :) Men det er god skik.

Tja, hvis den kun definerer variable kan jeg ikke se problemet i at den ligger i public-dir.
Indtil den dag du installere et 3rd parts modul med sikkerhedsfejl i.

At være ligeglade med ting fordi de VIRKER sikre er en normal falgrube. Undgå det mens du kan, design dit system så det ikke kan lade sig gøre.

Det er lidt ligesom at de ikke er et problem at kører med Admin rettigheder på din pc hele tiden :-) Hov vent...
Gravatar #14 - arne_v
10. nov. 2008 16:45
#12

GET requests er langt nemmere at injecte end POST requests.
Gravatar #15 - Windcape
10. nov. 2008 16:49
#14

Du tænker på at sende injectiondata igennem GET ?
Det er jo så mere relateret til general udvikling end AJAX :-)

Hvis jeg husker rigtigt anbefaler W3C også at man benytter POST til enhver form of data der sendes.
Gravatar #16 - Niklas H
10. nov. 2008 17:09
Det kan man jo også høre på navnene. Hvis brugeren skal indtaste noget og det skal sendes videre, så skal der bruges POST (at poste / indsende), hvorimod hvis brugeren skal hente data og gerne kunne fx bogmærke siden, så kan der bruges GET (at hente).

GET til at hente data
POST til at poste data
Gravatar #17 - Spiderboy
10. nov. 2008 17:18
13 skrev:
At være ligeglade med ting fordi de VIRKER sikre er en normal falgrube. Undgå det mens du kan, design dit system så det ikke kan lade sig gøre.

Fair nok, men så gælder det vel alle include-filer så. Hvor skal man så gøre af dem? På mit webhotel mener jeg kun at kunne uploade filer til mit public dir.
Gravatar #18 - arne_v
10. nov. 2008 17:21
#15

Nej. XmlHttpRequest er underlagt same origin reglen, men den gælder ikke for forskellige simple HTML features der resulterer i GET request <img src="...">. Derfor er det godt at lade de server side scripts der processer AJAX request kun acceptere POST requests.
Gravatar #19 - arne_v
10. nov. 2008 17:23
#16

Det er det som GET og POST er designet til.

Der er så de performance orienterede udviklere som foretrækker GET og de security orienterede udviklere som foretrækker POST.
Gravatar #20 - Windcape
10. nov. 2008 18:06
Spiderboy (17) skrev:
På mit webhotel mener jeg kun at kunne uploade filer til mit public dir.
Så skal du snakke med dit webhotel, da de tilbyder en elendig løsning.

Mine løsninger ser normalt sådan her ud:


/library
/Zend
/application
/controllers
/views
/models
/cache
/www/
/index.php (Frontcontroller)
/.htaccess
/media/ (CSS/Billeder/Javascript)


Typisk så bliver nødvendige konfigurationer kodet direkte ind i frontcontrolleren.

Her er et eksempel på en frontcontroller under Zend Framework (lidt outdated version): index.phps
Gravatar #21 - 2xmy
12. nov. 2008 20:34
Fuldstændig off-topic, men det er sgu fedt at se, at der findes folk, der stadig går nok op i deres uddannelse til, at de kigger udover pensum og de skemalagte timer :)

Frameworket CodeIgniter er utrolig praktisk og giver dig mulighed for at lærer om Model/Controller/View tilgangen til programmeringen som Windcape øjensynligt også bruger, når man ser på mappestrukturen (I burde selvfølgelig blive undervist i OOP, men aner ikke om det er tilfældet).
Gravatar #22 - thorjak
12. nov. 2008 21:06
#21
Datatekniker som jeg selv er igang med, indeholder en masse programmering, desværre er det sådan, at de kloge hoveder, der bestemmer over os, har bestemt at vi skal have et nyt sprog, og begynde forfra, hvergang vi starter på et nyt ophold.

Intet teori omkring OOP, eller UML, hvilke ville have været rigtig lækkert.
Gravatar #23 - Jonasee
12. nov. 2008 21:27
#22
nu ved jeg ikke hvornår du er started, men vis du er bare et stykke ind i uddannelsen, hvad det lyder som om, så vil jeg da gerne høre hvor al den programmering er, er selv blevet færdig med H2 og efter det vil det eneste programmering være valgfag, og indtil nu har vi kun haft 5 uger i alt.
Gravatar #24 - arne_v
12. nov. 2008 21:28
#22

Kendskab til flere sprog er godt.

Men de skal jo naturligvis helst give mere indsigt og ikke bare starte forfra.
Gravatar #25 - Mnc
13. nov. 2008 01:28
arne_v (24) skrev:
Kendskab til flere sprog er godt.
Men de skal jo naturligvis helst give mere indsigt og ikke bare starte forfra.
Amen.

thorjak (22) skrev:
#21
Datatekniker som jeg selv er igang med, indeholder en masse programmering, desværre er det sådan, at de kloge hoveder, der bestemmer over os, har bestemt at vi skal have et nyt sprog, og begynde forfra, hvergang vi starter på et nyt ophold.

Intet teori omkring OOP, eller UML, hvilke ville have været rigtig lækkert.
Da jeg tog uddannelsen blev C++ berørt på 5. forløb, og på 6. forløb stod den på C#. Derfra arbejdede vi med .NET frem til og med 9. forløb, med mssql sideløbende. Java blev kort berørt undervejs, men det er lige før at det er svært at se store forskel på basic java og basic C# imo. :P Vi fik dog et par fine sorteringsalgoritme eksempler ud af det.
Vi blev også introduceret for OOP, og ved slutningen af 6. forløb var der prøver for at fastslå om vi havde forstået OOP konceptet eller ej. Havde man ikke forstået konceptet tilfredsstillende, så måtte man bruge et ekstra liv. :P Samme galdt UML.
Vi måtte også igennem udviklingsmetoder (XP <3).
Gravatar #26 - thorjak
13. nov. 2008 08:54
#23
skal starte på h6 aka sidste hovedforløb, eller ja er færdig med uddannelsen om 1½ år.
Indtil videre har vi haft c, c++, php, c#, java.
Hvor vi er begyndt forfra hver gang i hvert sprog.

Jeg som sidder og udvikler hver dag, har intet problem med det, ud over jeg godt kunne bruge noget mere teori.

#24
Ja, det er det helt sikkert, jeg kan da også en bunke sprog, men dem jeg går i skole med kan ingen ting, og de bliver kun mere forvirret.

skal måske fortælle hvilken skole det er jeg har erfaringer med, TEC ballerup, det siges de er igang med at lave det om, men indtil videre har det været håbløst, at få skolen i snak, om hvad der kunne gøres bedre.

#25 - danm du er sku heldig, jeg er godt træt af ikke at lærer noget når jeg tager på skole

Gravatar #27 - Mnc
13. nov. 2008 23:13
thorjak (26) skrev:
TEC ballerup
Jeg gik på EUC Ringsted.
Gravatar #28 - XorpiZ
14. nov. 2008 05:11
Da jeg tog datafagtekniker uddannelsen, startede vi med lidt VB (makroer og lidt småting). Dernæst hed det C, C++ (deriblandt MFC.. det giver mig stadig kuldegysninger at tænke på det) og så C#.

Ingen java, php osv. Det var rart nok, da c, c++ og C# er ret ens sprog.
Gravatar #29 - Mnc
14. nov. 2008 05:30
Hvis du mener at c/c++, og C#, er ens... Så vil du ikke kunne se forskel på C# og java. :P
Gravatar #30 - Niklas H
14. nov. 2008 07:40
#28 Jeg vil nu nok mene at der er stor forskel på c/c++ og C#. Det er mere Java og C# der minder om hinanden.
Gravatar #31 - XorpiZ
14. nov. 2008 13:00
#30

Syntaxen er ens. Der er selvfølgelig forskelle kommandoer, men kan man C, så føler man sig hurtigt hjemme i C# imho :)
Gravatar #32 - arne_v
14. nov. 2008 14:26
#28-31

Hvis keywords if/switch/for/whiile/do, brug af {} og case sensitivitet er nok til at få en til at føle sig hjemme, så har du ret.

Stort set alt bortset fra de overfladiske syntax ting er forskelligt.

Men fænomenet "føle sig hjemme" eksisterer. VB.NET eksisterer p.g.a. det. Sprog feature mæssigt kunne folk lige så godt bruge C#, men MS vurderede at der var millioner af VB udviklere som ville føle sig mere hjemme i VB.NET.
Gravatar #33 - Mnc
14. nov. 2008 23:29
Det jeg yderligere tænkte på, med henblik på C#/java var måden.man.dykker.ned.i.classes.på();
:-)
Gravatar #34 - Bllets
15. nov. 2008 17:16
#11
Jeg takker for linksne, i det at det faktisk ser rimelig interassent ud, i det at vi faktisk ikke har lært et eneste fagord endnu udover det vi har kodet.

Så følgende ord du har sagt ved jeg faktisk ikke hvad er endnu:
1. design patterns og OOP
2. public-dir
3. frontcontroller

Jeg kan dog sådan ca. regne ud hvad public-dir er, men har aldrig tidligere hørt det før. De to andre er jeg sådan lidt blank overfor.

Problemet med min uddannelse som sådan, at det virker som om man ikke vil gøre det for kompliseret og dermed ikke vil lære os mysqli, eller noget andet som er lidt mere end std. php med mysql.

Jeg ved ikke hvor mange gange jeg har skrevet mysql_query og while(mysql_fetch_array), da det faktisk er den eneste måde vi har lært at hente fra en mySQL database. Jeg syntes selv det var imporende når mine lærer blive imponeret over jeg bruger Lightbox og md5()/sha1(). :/

Jeg overvejer at bruge nogen penge på bøger angående at lærer mere om PHP/sikkered, hvor der er i dit link ser ud til at være nogen eksempler på nogen, men kan det betale sig?
Gravatar #36 - Bllets
15. nov. 2008 17:29
#35
ahh så det er hvad OOP er, det har vi dog haft om... I 2uger... Det er jeg også ved at prøve og lærer mig selv :)

Så Front Controller er faktisk en fil til at erstatte alle de filer jeg har nu til login/delete/edit/etc ?

#21
Grunden til jeg gør det at hvis jeg ikke gør det ville jeg faktisk ikke klare min uddannelse, efter at have lavet mere eller mindre 5 lignende hjemmesider, hvor den eneste forskel er en funktion som man har lavet tidligere. Som så bare skal kodes ind, det blev sådan set røv kedeligt. Og gik fra 10/12 til 02/04 i karakter.
Derfor besluttede jeg at var nødt til at simpelthen at lærer uden om skolen. Dette vil også gøre mig til en bedre programmør når jeg engang blev færdig :)
Gravatar #37 - arne_v
15. nov. 2008 17:40
#36

Front controller er kode som bliver kaldt for alle requests og delegerer til anden kode. Du kan ikke sige, at den erstatter anden kode.
Gravatar #38 - Windcape
16. nov. 2008 10:40
Billets:

Hvis du ikke har forstået alt vi har fortalt om indtil videre når du er færdiguddanet er dine chancer for et job også lig med nul.

29/30 i din klasse vil aldrig få en job som webudvikler kun med baggrund i webintegrator.

Det er som sagt, bare en SU leech uddanelse :)
Gravatar #39 - Bllets
16. nov. 2008 13:31
#38
Det er jeg udmærket klar over, jeg skal sådan set også kun bruge uddanelse til videre uddannelse eller for at lære det grundlæggende :)

Derfor jeg er her i dette topic for at lære mere udover skolen :)
Gravatar #40 - arne_v
16. nov. 2008 14:42
#38 & 39

Nu skal man holde tungen lige i munden når man diskuterer kvalifikationer til et job som udvikler.

Software engineering (som det hedder når det skal være fint) består af to dele:
- noget "videnskab"
- noget "håndværk"

Du kan putte OOP, design patterns, MVC, adskillelse af præsentation og logic etc. i videnskabsdelen.

Du kan putte brug af mysqli, brug af SHA256, reserverede ord, brug af POST fremfor GET etc. i håndværksdelen.

Det er videnskabsdelen som vil gøre dig interessant på arbejdsmarkedet på længere sigt, idet det er nogle begereber som vil kunne bruges i mange mange år. Modsat diverse PHP5 features som er håbløst forældede når PHP7 udkommer om 10 år.

Det bør faktisk også være den del der giver dig det første job. Men det er nu set at virksomheder prioriterer nogen som kan PHP5 eller C# 2.0 eller ASP 3.0 eller noget tilsvarende. Smarte virksomheder er dog klar over at de kan sagtens kan lære en der kan udvikle software et nyt sprog, mens at en der kan et bestemt sprog ikke nødvendigvis kan lære principperne bag software udvikling.

Sådan lidt kynisk sagt er den mest relevante IT uddannelse lige efter folkeskolen faktisk gymnasiet med højt niveau matematik.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login