Posts by FangorN

    TL;DR

    • Een methode is van zichzelf nooit veilig, er is enkel een veilig gebruik van een methode
    • Prepared statements in MySQLi zijn bagger, als je dan toch prepared statements moet gebruiken, doe dit dan via PDO
    • vertrouw nooit user input
    • filter input, escape output

    Een werkwijze is van zichzelf niet zomaar veilig (alsof je "abracadabra!" roept, en je dan beschermd bent :)), enkel als je een werkwijze juist toepast heb je wat meer garantie dat iets veilig is.
    Bovenstaande code is misschien veilig (maar dit is niet zeker, waarover later meer), maar dat is geen constructie met prepared statements - je bent daar simpelweg een querystring aan het opbouwen.


    Daarnaast is het gebruiken van prepared statements "omdat dit veilig zou zijn" misschien niet helemaal de juiste insteek en lang niet de énige reden/overweging waarom je dan maar altijd prepared statements zou moeten/mogen gebruiken.


    Bij elke werkwijze komt ook een zekere discipline kijken die ervoor zorgt dat je de werkwijze op de juiste manier toepast. Je kunt niet voor prepared statements kiezen, maar in je stoel achterover leunen en een partij baggercode schrijven want die is mogelijk even (on)veilig als een andere gebruikte methode geschreven in dezelfde "mindset".


    Ook MOET je begrijpen wat prepared statements functioneel doen en wat het gebruik hiervan impliceert.


    Los van de voorziening van MySQLi in PHP, die een handjevol functies heeft om met prepared statements te werken, is dit een voorziening van MySQL zelf. Dit is geen laag die enkel in PHP bestaat maar ook een laag in MySQL zelf. Prent dit goed in je gedachten.


    Dit in tegenstelling tot PDO waarin je alleen maar kunt werken met prepared statements, maar niet noodzakelijkerwijs enkel met MySQL (maar met een andere database type die mogelijk niet native prepared statements ondersteunt).


    In PDO heb je een optie genaamd PDO::ATTR_EMULATE_PREPARES. Deze (boolse) waarde geeft aan of prepared statements ge-emuleerd moet worden (bijvoorbeeld omdat het database-type deze voorziening niet heeft) of dat er van de native prepared statement functionaliteit van het database-type zelf gebruik gemaakt dient te worden. Als je deze waarde dus op false zet (dat wil zeggen, de emulatie staat UIT), communiceert PDO op dezelfde wijze met MySQL als dat je via MySQLi+prepared statements zou doen.


    Wat houdt dit in? Indien je gebruik maakt van prepared statements in de "native MySQL sense" dan communiceer je via een compleet ander protocol met MySQL dan wanneer je niet van prepared statements gebruik zou maken. Het aantal queries (vraagstukken) dat je de database stelt is ook compleet anders!


    Wat er "in a nutshell" gebeurt is het volgende: elke keer als jij een prepared statement uitvoert stuur je een SQL-sjabloon (het prepared statement) naar je database (1 query). Vervolgens ken je waarden of variabelen (in MySQLi kun je enkel variabelen binden geloof ik, niet simpelweg waarden, het kan wel allebei in PDO) toe aan de placeholders van dit sjabloon en voer je het prepared statement uit met execute (dit is NOG 1 QUERY). Elke "query" die je wilt uitvoeren resulteert -in MySQLi icm prepared statements in ieder geval- in het sturen van TWEE queries naar je database!


    Dan spelen er een aantal overwegingen: wanneer is dit zinnig? En we redeneren hier dan even vanuit efficiëntie, niet vanuit security.


    Bij een (ELK!) SELECT statement? 2 queries. Meh.


    Bij een INSERT statement? Misschien, als je meerdere inserts uitvoert? Maar bij één INSERT, waar meestal per keer sprake van is? Meh.
    EDIT: dit is een argument voor het gebruik van prepared statements: als je veelvuldig het sjabloon (prepared statement) hergebruikt met verschillende parameter-waarden dan zijn prepared statements mogelijk (veel) sneller: bij elke query -na de eerste- hoeft er enkel data van de parameters over de lijn. De query zelf is al geparsed en correct bevonden et cetera. Aan de MySQL kant staat alles al in de startblokken om de query (het querysjabloon (herhaaldelijk)) verder te verwerken.


    Bij een UPDATE of DELETE? Zelfde als bij een INSERT.


    Daarnaast is het gebruik van bind_param() compleet pet en ziet er nogal "clunky" uit. Een geserialiseerde string met letters om typehints van de te binden variabelen mee te geven? WTF?


    Nee, nee, driewerf nee.


    Kijk, als je dan toch prepared statements MOET gebruiken (zonder opgaaf van reden zou ik dit niet eens accepteren), gebruik dan PDO met simulatie aan (PDO::ATTR_EMULATE_PREPARES op true).


    Okay, dan terug naar jouw code. Ik denk dat je even een stap terug moet nemen en een zekere denkwijze moet gaan volgen.


    Stel je het volgende voor: je werkt met een HTML document. Hierin kunnen andere mensen berichten plaatsen (denk aan een gastenboek). Je wilt natuurlijk niet dat er allerlei onzin in gezet kan worden (HTML die je layout breekt, JavaScript die je cookies steelt). Dus je wilt de invoer op een of andere manier onschadelijk maken, in dit geval in de HTML context. Dit concept is belangrijk: je werkt in een bepaalde context en je wilt DATA, die afkomstig is uit een of andere externe bron, ontdoen van de mogelijk speciale betekenis binnen die context. Hiervoor gebruik je bijvoorbeeld htmlspecialchars(). Klus geklaard, alle flauwekul in je gastenboek geneutraliseerd.


    Zo geldt dit ook voor andere contexten: in de SQL-context heb je een real_escape_string() functie die hetzelfde doet (MITS je quotes om deze DATA zet, het een (real_escape_string()) zonder het ander (quotes) is NIET VEILIG). Ook hier is wederom belangrijk: REAL_ESCAPE_STRING() IS GEEN WONDERMIDDEL!


    Maar het is daarbij handig om ALLE DATA op eenzelfde manier te behandelen. Al die DATA is in zekere zin afkomstig uit een externe bron, die je niet zou moeten vertrouwen. Het is ook veel makkelijker in het gebruik, want je hoeft je dan niet af te vragen of je de DATA kunt vertrouwen (of er al ooit een controle is uitgevoerd) of niet. Ga er gewoon altijd vanuit dat de DATA niet betrouwbaar is. $gebruikersID zou dus in je query dezelfde behandeling moeten krijgen als $sitenaam. Deze zou je dus ook moeten escapen.


    En als je slim bent schrijf je een wrapper voor je MySQLi functies/methoden. Waarbij je bij voorkeur object georiënteerd werkt. Desgewenst heb ik hier wel code voor.


    Maar terugkomend op de eerdere escaping, onthoud de volgende vuistregel: filter input, escape output.


    Om ten langen leste antwoord te geven op je vraag: jouw bovenstaande code is niet per definitie veilig, omdat je niet al je DATA escaped, ook al komt deze uit je sessie en zou deze al veilig moeten zijn. Maar daarbij doe je een aanname. En je wilt niet, dat als deze ketting van aannames wordt doorbroken, je site ineens niet meer werkt of wel?

    Nu heeft een leraar mij gezegd dat ik prepared statements moet gebruiken tegen SQL Injections.

    Deze uitleg vind ik trouwens een leraar onwaardig. De docent zou beter moeten uitleggen hoe je prepared statements veilig toepast, en hoe dat bijdraagt in het voorkomen van SQL injection. Dan zal waarschijnlijk blijken dat prepared statements een groot deel van de eerder genoemde escaping automatisch voor hun rekening nemen. Maar dat wil niet zeggen dat, simpelweg omdat je dan een truukje volgt waarvan je niet precies begrijpt hoe deze werkt, je dit maar blind moet volgen en dan altijd "veilig"bent... Dat is het onheil over je afroepen.

    Was op een avond op mijn hoofd PC aan het gamen, laptop was in slaapstand...


    ...opeens herstart mijn laptop "Now installing windows 10".


    WHAT THE F@#%.


    Er was inderdaad geen enkele interactie, dit ging volautomatisch. Er werd zelfs niet eens de illusie van een keuze gewekt of geboden in deze.


    En dan een half uur lang dat hypnotiserende pulserende scherm met de geruststellende boodschap "Your files are exactly where you left them" (of wat dan ook). They bloody better well be!


    Laptop was inmiddels op leeftijd, weer enigszins bij de tijd gebracht met een SSD, maar dit beestje is eigenlijk wat te oud voor Win10. Win7 liep nog als een zonnetje.


    Ik ben hier echt helemaal klaar mee eigenlijk.


    Heb nog ff die thread van reddit bekeken met als openingstopic "What do I do now".


    Een van de opties was "If you are done with windows", ga mij hier toch eens in verdiepen want ben dit een beetje zat.

    Uhm, is je domeinnaam dan intussen ook veranderd?

    Kun je met je DSN en voor zorgen dat je domein naar het naam.weebly.com domein wijst maar dan wel in de adres balk eigennaam.nl weergeeft?

    Geen idee. Dit zal mede afhangen van hoe de koppeling werkt? Wat kost een abonnement? En kun je dit niet gewoon doorberekenen aan de persoon voor wie je het beheer regelt? Het is waarschijnlijk niet voor niets een betaalde dienst tegenwoordig. Dit geeft je mogelijk ook zekere privileges, als je iets betaalt kun je waarschijnlijk ook enige service verwachten.


    Of je zou de vraag bij Weebly neer kunnen leggen als er inhoudelijk niets veranderd is. Maar ik weet niet of zij veel moeite willen besteden aan de case van iemand die gratis gebruik maakt van een dienst :).

    Hoe werkt deze koppeling?


    Wat is er veranderd bij de migratie?


    En heeft je hoster dit onaangekondigd gedaan? Zou ik daar gaan klagen. Potje breken potje betalen.

    Wat is big?


    Wat is data?

    Deze twee dingen splitsen is zoiets als vragen "wat is rood" en "wat is kapje" terwijl de combinatie van deze elementen toch echt een andere betekenis heeft :s.


    Voor goede definities kun je meestal wel terecht bij WIKI.


    Volgens mij is hetgeen waarvoor big data wordt gebruikt ook zoiets als "het hercombineren van grote hoeveelheden gegevens waar nieuwe informatie/verbanden uit afgeleid kunnen worden die een zekere (strategische) meerwaarde hebben (omdat je hier vervolgens ook voorspellingen mee zou kunnen doen)".


    Als je het mij vraagt is dit net zoiets als (informatie)recycling. Je hebt een heleboel bagger waar je iets waardevols uit probeert te zeven.


    Af en toe wordt de term ook onterecht gebruikt zoals op de WIKI pagina wordt aangehaald.

    Is het niet gewoon de bedoeling dat je met je Google Account in kunt loggen op je site? Of wil je enkel gebruik maken van de Authenticator van Google om in te loggen op je eigen site, los van je Google Account, want dat zijn twee verschillende dingen.


    Misschien heb je hier iets aan.


    Als ik het goed begrijp werkt het als volgt:
    jouw applicatie levert een geheime code aan de Google Authenticator app met behulp van een QR code. Nu kan de app semi random getallen genereren voor jouw applicatie.


    Jouw applicatie heeft op zijn beurt zelf een implementatie nodig om deze code ook te kunnen genereren met behulp van de eerder afgesproken geheime code (deze zul je dus ergens moeten onthouden) en de huidige tijd. De klokken van Google Authenticator app en jouw webapplicatie zullen dus ook min of meer synchroon moeten lopen.


    Blijkbaar heb je geen externe dienst nodig om "zelf" de codes te kunnen genereren, in principe heb je hier alle informatie voor. Wel zul je dus een implementatie moeten vinden of zelf een moeten schrijven, maar volgens mij zijn er een aantal opensource verkrijgbaar, misschien zelfs inclusief de functionaliteit voor het genereren van de QR-code om je account te syncen met de GA app.


    Eentje die ik vaker genoemd zie worden is een implementatie van (hoe kon het ook anders?) PHPGangsta.


    Maar, je zult zelf ff uit moeten proberen of dit iets is. En als het allemaal is gelukt, schrijf hier dan bijvoorbeeld een blog over. Dit -two factor authentication- is best een interessant onderwerp. Misschien doe ik dit anders nog, wil mij hier ook nog wel eens in verdiepen.


    En als je dan zo'n implementatie hebt, dan vul je dus je username + wachtwoord in en de code in je GA app voor jouw applicatie. In de verwerkstap van het inloggen genereer je dan die code opnieuw met je eigen implementatie en vergelijk je die met de ingevulde code en Bob's your uncle.


    En nog een kanttekening: de achterliggende idee (ja, de idee) van je school is niet dit kunstje klaren, maar je aanleren je te verdiepen in nieuwe technieken en het opzoeken van de hiervoor benodigde informatie. De uiteindelijke implementatie om iets werkends op te leveren is eigenlijk de laatste stap in dit proces, en is eigenlijk niet meer dan "draaien aan de molen". Als het goed is heb je al het onderzoek wat leidt tot iets werkends voor die tijd al gedaan, en is het maken zelf "slechts" een uitdraai hiervan.


    Dit -het vergaren, dus eigenlijk het leren zoeken, en eigen maken van deze materie- is waarschijnlijk de echte les.

    Dit soort emoticons zullen het niveau van ongenuanceerde meningen nooit ontstijgen.


    Het maakt niet uit hoeveel smaken je hebt, als je niet kunt motiveren waarom je iets vindt dan is de kans groot dat je maar wat roept (en niet eens weet waarom).


    (Dis)likes zijn een vorm van massahysterie. Het feit dat deze nu versterkt zijn met een collectie primaire emoties zegt mij genoeg :).

    Mja, maar het wordt toch een beetje gepresenteerd alsof er een oorzakelijk verband is, terwijl er, als je het mij vraagt, enkel een correlatie is, oftewel, twee fenomenen die tegelijkertijd optreden, maar het is niet zo dat het ene wordt veroorzaakt door het andere (alleen dan is er echt sprake van zo'n oorzakelijk verband toch?). En daarmee gaat het onderzoek met haar conclusies nogal overboord.

    De hypothese zelf is misschien al wat vooringenomen. Die ging er al vanuit dat de acceptatiegraad van vrouwen lager zou zijn dan die van mannen. Ik vind de "instap" dus al niet zo professioneel.


    Ook zou het zo kunnen zijn dat de vrouwen die dan deelnemen aan GitHub hun shit gewoon beter kennen dan de gemiddelde mannelijke deelnemer (waarvan er veel meer zijn - ligt het dan voor de hand dat daarvan de kwaliteit meer uiteen loopt?). Dit is dus mogelijk al meten met twee maten. Hier wordt ook (o.a.) op gespeculeerd aan het einde van het artikel.


    Daarbij, sinds wanneer is het geslacht van een bijdrager een criterium? Volgens mij houd je op deze manier juist het denkbeeld van dit soort animositeit in stand, terwijl hier helemaal geen sprake meer van hoeft te zijn. "Hm, deze verbetering/verandering ziet er wel goed uit, toch even controleren of deze aangedragen is door een vrouw want dat kunnen we natuurlijk niet hebben". wtf?


    En tot slot, wat zo vaak bij dit soort "pop science onderzoeken" misgaat is het door elkaar halen van correlatie en oorzakelijk verband zoals ook in de reacties wordt aangehaald.


    Citaat van het artikel

    All things being equal, contributions from unknown women were accepted less often than contributions from unknown men.

    Maar dat zegt helemaal niets over de kwaliteit van de bijdrage, hier wordt alleen het feit dat de bijdrage niet werd geaccepteerd "gelijmd" aan het feit dat de bijdrager vrouwelijk was ook al hoeft dit helemaal niets met elkaar te maken te hebben. Dit is simpelweg het resultaat van een rekensom waarvan we de formule niet kennen.


    Overigens is de subtitel van het artikel:

    Citaat van het artikel

    Women's contributions to open source are more likely to be accepted than men's.

    De titel van het artikel op deze site is daarom wellicht ook een beetje misleidend (en misschien zelfs wel verkeerd?) want de uiteindelijke uitkomst van het "onderzoek" is juist andersom in vergelijking met wat de titel van het artikel op deze site suggereert. Alleen in sommige gevallen valt het opvallend tegen zoals in het artikel beschreven staat (zie eerste quote).


    En vervolgens een (niet? nauwelijks?) onderbouwde conclusie in vraagvorm (zodat je wellicht niet eens meer stilstaat bij de validiteit van zo'n stelling):


    Citaat van het artikel

    So why are women in open source more competent than men?

    ...


    Dat blauwe blok aan het einde snijdt nog het meeste hout, maar dat zijn allemaal gedachtensprongen, niet onderbouwd door feiten. Was dit onderzoek nu niet juist bedoeld om hier inzage in te verschaffen? Onderzoek elk van die stellingen dan (afzonderlijk)! Een van de eerste stappen van een onderzoek is het afbakenen van het te onderzoeken onderwerp :/. Misschien hebben ze zich hierin verslikt maar waarschijnlijk was het dan verstandiger om de eindconclusie te houden op "we weten het eigenlijk ook niet" :).


    Maar wederom:

    Citaat van het artikel

    No matter what the explanation—and it's likely some combination—we have further evidence that there is measurable bias against women in computer science. Women who work in CS have to be better prepared and perform more competently than men in order to survive, and therefore it should come as no surprise that the few women who contribute to open source projects are more skilled than their male counterparts.

    Objection! Speculation!
    Let ook op woorden als "evidence" en "measurable bias" alsof "de feiten niet te ontkennen zijn" - de data wordt in dienst gesteld van de te bewijzen hypothese en ten faveure hiervan uitgelegd, maar dat is niet hoe (wetenschappelijk) onderzoek werkt :D.


    Het klinkt aannemelijk, maar het is wat mij betreft niet voldoende onderbouwd met dit onderzoek. Het komt niet verder dan speculatie / het aantonen van een zekere correlatie.

    Hmm, heb je alleen de beschikking over JavaScript en HTML/CSS? Of ook een scriptingtaal?


    Maak je toevallig gebruik van zoekmachine vriendelijke URL's en/of verschillende directories voor de pagina's? Dan doe je er ook verstandig aan een "path" mee te geven aan je cookie om aan te geven in welke (sub)directories deze geldig is. Het default gedrag van een cookie is (wanneer je geen "path" instelt) dat deze enkel geldig is in de directory waarin je deze creëert. Dat zou mogelijk de oorzaak kunnen zijn dat wanneer je op pagina A een cookie instelt, je het effect hiervan niet ziet op pagina B.


    Als je een cookie op een heel (sub)domein geldig wilt laten zijn stel je het "path" in op "/".


    Indien je de beschikking hebt ook een serverside scriptingtaal zou je ook aan andere oplossingen kunnen gaan denken zoals het opslaan van een menu-configuratie bij een profiel van een gebruiker ofzo, die (op de achtergrond) wordt aangestuurd via AJAX-calls die een database-tabel of een cookie (of iets anders) updaten.

    Zelfs al zou je deze kunnen terughalen zou ik dit soort systemen niet zonder meer gaan gebruiken zonder een redelijk grondige controle op veiligheid.


    Er is in de afgelopen jaren flink wat in PHP-land veranderd. Grote kans dat deze "scripts" initieel al niet van hoogstaande kwaliteit waren. Nu zijn deze dus al helemaal gedateerd of is hun uiterste houdbaarheidsdatum inmiddels ruimschoots gepasseerd.

    Is het voor geleverde diensten of te leveren diensten? Hoe zijn de regels ten aanzien van verlenging en is die persoon daarmee akkoord gegaan?


    Als hier uit blijkt dat jij recht hebt op betaling zou ik hier gewoon achteraan gaan. Waarom zou jij de dupe moeten zijn van iemand anders zijn administratieve laksheid? Je bent toch geen charitatieve instelling? Zo iemand laten lopen lijkt mij een beloning voor slecht gedrag. En dat gedrag zelf is gewoon pure verlakkerij.


    Stuur dat bureau maar naar zijn ouders (mits van toepassing), dan bewandelt 'ie na afloop van een goed gesprek (of een pak slaag) wellicht wat beter het rechte pad :).

    Je zou ook kunnen overwegen om enkel de actieve div te refreshen? Anders ben je een hoop informatie nodeloos aan het overpompen.


    Speaking of which (het nodeloos overpompen van data), je zou ook kunnen overwegen om enkel relevante data te versturen (bijvoorbeeld via JSON), in plaats van elke keer plakken HTML te versturen. In het "success" gedeelte zou je dan een HTML-template kunnen definiëren waarin je de opgehaalde (JSON)data invult, die je vervolgens in de daarvoor bestemde div weergeeft.

    Een forum is zelden simpel.


    En als deze simpel is mis je vaak zekere functionaliteit.


    Ik ken eerlijk gezegd geen pakketten die zo generiek zijn dat ze precies, en "1, 2, 3" zoals je zelf aangeeft, doen wat jij verlangt (wat dat ook moge zijn).


    Het best haalbare lijkt mij dan inderdaad maar iets standaards te installeren. Die site heeft dan ook een standaard uitstraling tenzij je er zelf een design bij maakt.


    Hoe dan ook, het zal enige tijd en inspanning kosten, misschien moet daarvoor (letterlijk en figuurlijk) eerst even mentaal een knop om.