skræddersyet database tabeller: sikkerhed først,,,,, andel,,,,,,,, 11,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet skik database tabeller. skik database tabeller: at skabe tablecustom database tabeller: at skabe en grænseflade, dette er anden del af en serie om skik database tabeller i wordpress.i del vi, der er begrundelsen for og imod, ved hjælp af custom tabeller.vi har kigget på nogle af de oplysninger, der skal tages i betragtning - kolonne navngivning, kolonne former - samt at skabe bordet.før vi går videre, vi er nødt til at dække at interagere med det nye skema, sikkert.i en tidligere artikel jeg dækkede generelle sanitisation og validering – i denne forelæsning, vi vil se på det i detaljer i forbindelse med databaser.,,, sikkerhed for at kommunikere med en database, er afgørende – - og derfor er vi for tidligt i serien.hvis det ikke gøres ordentligt, så kan du forlade dit bord til manipulation via sql injektion.det kunne give en hacker, til at få oplysninger, at erstatte indhold eller ændrer din hjemmeside er - og den skade, de kan gøre, er ikke begrænset til din brugerdefinerede tabel. lad os hvis vi vil tillade administratorer for at slette dataposter fra vores opkaldslisten.en almindelig fejl, jeg har set, er følgende: hvis (!tom ($_get [»tiltaget«) & & slette opkaldslisten '= = $_get [»tiltaget«) & & isset ($_get ['log_id'])) (samlet $wpdb; unsafe_delete_log ($_get ['log_id ']);} funktion unsafe_delete_log ($log_id) (samlet $wpdb. $sql = "slettes fra ($wpdb - > wptuts_activity_log}, hvor log_id = $log_id" $udgår = $wpdb - > søgning ($sql)}, hvad er der galt her?masser: de har ikke tjekket tilladelser, så enhver kan slette en opkaldslisten.de har heller ikke set nonces, selv med tilladelse kontrol, en administration bruger kunne blive narret til at slette en træstamme.det var helt dækket i denne forelæsning.men deres tredje fejltagelse forbindelser, de første to: den, unsafe_delete_log(), funktion, anvender den passerede værdi i et sql kommando, uden at det først.dette efterlader det åbner mulighed for manipulation, hvis den påtænkte anvendelse, er, www.unsafe-site.com?action = slette opkaldslisten & log_id = 7, hvis en person besøgte (eller snød en lejlighed til at besøge):, www.unsafe-site.com?action = slette opkaldslisten & log_id = 1% 20drop% 20table% 20wp_posts,.det, log_id, indeholder en sql kommando, som derefter injiceres $sql, og vil blive henrettet som:, ikke wp_wptuts_activity_log, hvor log_id = 1 dråbe tabel wp_posts, resultat: hele, wp_posts, tabellen udgår.jeg har set kode som denne fora –, og resultatet er, at enhver, der besøger deres hjemmeside kan opdatere eller slette en tabel i deres database. hvis de to første fejl blev rettet, så det gør det sværere for denne type angreb, til at arbejde –, men ikke umuligt, og det ville ikke beskytte sig mod en "han, som har tilladelse til at slette aktivitetslogge.det er utrolig vigtigt at beskytte jeres sted mod sql injektioner.det er også meget enkelt: wordpress giver, forberede, metode.i dette eksempel, funktion safe_delete_log ($log_id) (samlet $wpdb. $sql = $wpdb - > at forberede ("slettes fra ($wpdb - > wptuts_activity_log}, hvor log_id =% d" $log_id); $udgår = $wpdb - > søgning ($sql), sql kommando vil henrette, som ikke wp_wptuts_activity_log, hvor log_id = 1;,, saneringen database forespørgsler, de fleste sanitisation kan foretages udelukkende på grundlag af de $wpdb, global – bl.a. ved at udarbejde, metode.det giver også metoder til at indsætte og ajourføring af data i tabel sikkert.de plejer at arbejde ved at erstatte en ukendt input, eller at et input med et format, indikation af en art.dette format fortæller wordpress, hvilke data der er det at forvente:,,%, betegner en snor,% d, betegner et heltal,% f, betegner en vogn, starter vi med at se på tre metoder, som ikke kun steriliseret spørgsmål - men bygge dem for dig.indsættelse af data, wordpress giver den metode, $wpdb - > insert(),.det er et stykke papir for at indsætte oplysninger i databasen og håndterer sanitisation.det tager tre parametre:,, tabel navn, – navnet på bordet, data, – vifte af data til at indsætte som kolonne - > værdi par, formater, – række formater for den tilsvarende værdi i data system (f.eks.,% s,% d, f,%), bemærker, at nøglerne af data bør være kolonner: hvis der er en nøgle, som ikke svarer til en kolonne en fejl kan blive kastet. i de eksempler, der følger vi udtrykkeligt har fastsat de data, men naturligvis generelt disse data kunne have kommet fra brugerinput, - - så den kan være hvad som helst.som nævnt i denne artikel, data, er blevet valideret først, så som at vende enhver fejl for brugeren, men vi er stadig nødt til at sterilisere data før tilføje det til vores bord.vi kigger på validering i næste artikel i denne serie, globale $wpdb; //$user_id = 1 $aktivitet = 1 $object_id = 1479, $activity_date = date_i18n ('y-m-d h: i: s, falske sande); $indsættes = $wpdb - > indsæt ($wpdb - > wptuts_activity_log, system ('user_id = > $user_id "aktivitet" = > $aktivitet, object_id = > $object_id, activity_date = > $activity_date,), system (% d', '% s "% d', '% s')); hvis ($indsættes) ($insert_id = $wpdb - > insert_id;} andre (//stik ikke}, ajourføring af data til ajourføring af oplysningerne i databasen, har vi $wpdb - > update(),.denne metode accepterer fem argumenter:,, tabel navn, – navnet på bordet, data, – vifte af data til ajourføring og kolonne - > værdi par, hvor, – vifte af data til at matche som kolonne - > værdi par, dataformat, – række formater for tilsvarende data "værdier, hvor format, – række formater for de tilsvarende", hvor værdier, en række, der svarer til opdateringer, hvor vifte med værdier fra data system.igen, som med $wpdb - > insert(), nøglerne i data system skal svare til en spalte.den kommer tilbage, falske, om fejl, eller antallet af række ajourførte. i det følgende eksempel vi ajourfører fortegnelser med log - 14 "(der skal være mindst en plade, som det er vores primære nøgle).det er en ajourføring af det bruger - id - 2 og aktivitet "redigeret. global $wpdb. $user_id = 2 $aktivitet ='edited. $log_id = 14 $ajourførte = $wpdb - > ajourføring ($wpdb - > wptuts_activity_log, system ('user_id = > $user_id" aktivitet "= > $aktivitet), system ('log_id = > $log_id,), system (% d', '% s) system (% d)); hvis ($ajourførte) (//antal rækker ajourførte = $ajourført}, slettet, da 3.4 wordpress har også givet de $wpdb - > delete(), metode til let og sikkert), at række (r).denne metode tager tre parametre:,, tabel navn, – navnet på bordet, hvor – vifte af data til at matche som kolonne - > værdi par, formater, – række formater for den tilsvarende værdi type (f.eks.,% s,% d, f, i%),, hvis du vil have din kode er forenelig med wordpress pre-3.4, så skal du bruge $wpdb - > at forberede, en metode til at sanere de relevante sql erklæring.et eksempel på dette er angivet ovenfor.de $wpdb - > slette, metode kommer antallet af rækker ikke, eller falske ellers –, så du kan afgøre, om sletning var vellykket. global $wpdb. $udgår = $wpdb - > slette ($wpdb - > wptuts_activity_log, system ('log_id = > 14) system (% d)); hvis ($udgår) (//antal rækker udgår = $udgår}, esc_sql, i lyset af de ovennævnte metoder, og den mere generelle, $wpdb - > prepare(), metode drøftet næste, denne funktion er en smule overflødigt.den, der som et nyttigt stykke papir for $wpdb - > escape(), metode, som i sig selv er en glorificeret, addslashes,.da de som regel mere passende og hensigtsmæssigt at bruge de tre ovennævnte metoder eller $wpdb - > prepare(), vil du vel finde ud af, at du ikke har brug for, esc_sql(),. som et enkelt eksempel: $aktivitet = "bemærkninger" $sql = "slettes fra ($wpdb - > wptuts_activity_log}, hvor aktivitet =". esc_sql ($aktivitet). "" og "generelle forespørgsler til general sql kommandoer, hvor (dvs. dem, der ikke tilføjelse, fjernelse eller ajourføring af rækker, er vi nødt til at bruge metoden, $wpdb - > prepare(),.det accepterer et variabelt antal argumenter.for det første er det spørgsmål, vi ønsker at gennemføre sql med ukendte data erstattet af deres format, indikation af en art.disse værdier er vedtaget som et yderligere argument i den rækkefølge, som de synes, f.eks. i stedet for: $sql = "vælg * fra ($wpdb - > wptuts_activity_log}, hvor user_id = $user_id og object_id = $object_id og aktivitet = $aktivitet, for activity_date $for" $kævler = $wpdb - > get_results ($sql); vi har $sql = $wpdb - > at forberede ("vælg * fra ($wpdb - > wptuts_activity_log}, hvor user_id =% d og object_id =% d og aktivitet =% er for activity_date% s" $user_id, $object_id $aktivitet, $for); $kævler = $wpdb - > get_results ($sql), udarbejde, metode gør to ting. det gælder mysql_real_escape_string() (eller addslashes()) til de værdier, som er indsat.navnlig vil det forhindre værdier, der indeholder citater fra at springe ud af forespørgslen.det gælder vsprintf(), ved at tilføje de værdier, det spørgsmål for at sikre, at de er formateret hensigtsmæssigt (så tal er hele tal, lager er flyder osv.).det er grunden til, at vores eksempel i begyndelsen af artikel fjernet alt ud, men '1'.,, mere komplicerede spørgsmål, det burde du finde $wpdb - > at forberede, sammen med indlægssedlen, ajourføre og slette metoder er alt, du har brug for.nogle gange, men der er tilfælde, hvor en mere "manuelle" tilgang er ønskeligt - nogle gange bare fra læsbarhed synspunkt.for eksempel, hvis vi har en ukendt spektrum af aktiviteter, som vi ønsker, at alle stammerne.vi kunne tilføje * * dynamisk,%, placeholders for sql spørgsmål, men en mere direkte metode synes lettere: //en ukendt system, der skal indeholde strenge bliver spurgt, for $aktiviteter = system (...); //steriliseret indholdet af array $aktiviteter = array_map ('esc_sql, $aktiviteter) $aktiviteter = array_map ('sanitize_title_for_query, $aktiviteter); //skabe en kæde af sterile system, der indgår i den indre del af i (...)erklæring in_sql = "dollars".implodere ("," "$aktiviteter)." "; //føje dette til forespørgslen $sql = "vælg * fra $wpdb - > wptuts_activity_log, hvor aktiviteten i (($in_sql});" //udføre forespørgslen $kævler = $wpdb - > get_results ($sql), er det tanken at anvende, esc_sql, og sanitize_title_for_query, at hvert enkelt element i nettet.den første er her for at undslippe de betingelser, – svarende til, hvad, $wpdb - > prepare(), gør.den anden kun gælder, sanitize_title_with_dashes(), – om adfærd, kan blive fuldstændig ændret gennem filtre.den faktiske sql erklæring er dannet ved at sprænges den nu renset array i comma separated snor, der er tilføjet i i (...), som er en del af forespørgslen. hvis systemet forventes at indeholde tal, så er det tilstrækkeligt at anvende, intval(), eller, absint(), for at sterilisere hvert element i rækken. whitelisting, i andre tilfælde whitelisting kan være hensigtsmæssige.f.eks. den ukendte input kan være en række kolonner, der tilbagebetales i forespørgslen.da vi ved, hvad de kolonner i databasen kan vi blot whitelist dem – at fjerne alle de områder, som vi ikke kan genkende.men for at gøre vores kode menneskelige venlige bør vi være ufølsom.for at gøre dette skal vi ændre noget, vi modtager, til små – siden i del vi specifikt anvendes små kolonne navne. //en ukendt system, der indeholder kolonner skal indgå i forespørgslen $områder = system (...); //en whitelist af tilladt områder $allowed_fields = system (...); //omdanne områder, små (som vores kolonne navne er lavere - sag, jf. del 1) $områder = array_map ('strtolower, $); //steriliseret ved hvide lister $områder = array_intersect ($områder, $allowed_fields); //vende tilbage kun udvalgte områder.tom $områder fortolkes således, hvis (tomme ($)) ($sql = "vælg * fra ($wpdb - > wptuts_activity_log}"} andre {$sql = "vælg". implodere ("," $). "($wpdb - > wptuts_activity_log}"} //udføre forespørgslen $kævler = $wpdb - > get_results ($sql), whitelisting også er praktisk, når man fastsætter, for en del af forespørgslen (hvis dette er fastsat ved brugerinput): data kan blive pålagt, desc eller, asc, kun. //ukendt bruger input (forventes asc eller desc) $for = $_get ['order ']; //give input til nogen, eller blandede, sag $for = strtoupper ($for); //renset for dollars for = (asc) = = $for? "asc. dec. "), ligesom forespørgsler, sql som erklæringer støtter anvendelsen af wildcards som f.eks.,% (en eller flere bogstaver), og _ (præcis en karakter), når matchende værdier for forespørgslen.f.eks. den værdi, foobar, svarer til forespørgsler:, udvælge * fra $wpdb - > wptuts_activity_log, hvor aktivitet som "foo%" vælg * fra $wpdb - > wptuts_activity_log, hvor aktivitet som "% bar" vælg * fra $wpdb - > wptuts_activity_log, hvor aktivitet som "% oba%" vælg * fra $wpdb - > wptuts_activity_log, hvor aktivitet, som fo_bar% «, men disse særlige tegn, kan også være til stede på sigt bliver undersøgt for – og forhindre dem i at blive fortolket som wildcards –, vi er nødt til at flygte fra dem.for det wordpress giver, like_escape(), funktion.Note that this does not prevent SQL injection – but only escapes the ,%, and ,_, characters: you still need to use ,esc_sql(), or ,$wpdb->prepare(),., //Collect term $term = $_GET['activity']; //Escape any wildcards $term = like_escape($term); $sql = $wpdb->prepare("SELECT* FROM $wpdb->wptuts_activity_log WHERE activity LIKE %s", '%'.$term.'%'); $logs = $wpdb->get_results($sql);,Query Wrapper Functions,In the examples we’ve looked we’ve used two other methods of ,$wpdb,:, ,$wpdb->query( $sql ), – This performs any query given to it and returns the number of affected rows., ,$wpdb->get_results( $sql, $ouput), – This performs the query given to it and returns the matching result set (i.e. the matså rækker).- output, fastlægger formatet af de returnerede resultater:,, array_a, – numerisk række rækker, hvor hver række er et overordnet system, ridsede ved kolonnerne.,, array_n, – numerisk række rækker, hvor hver linje er en numerisk system.,, genstand, – numerisk række rækker, hvor hver linje er en række formål.misligholdelse.,, object_k, – associative række rækker (forbundet med værdien af den første kolonne), hvor hver linje er en automatiseret system.,,, der er andre, vi ikke har nævnt:,, $wpdb - > get_row ($sql - produktionen, $row), – denne udfører de spørgsmål og vender tilbage i rækken.- ro, fastsætter som række skal returneres, der som udgangspunkt er 0, den første matchende row.- output, fastlægger formatet af den række:,, array_a, – row er a, kolonne = > værdi, par.,, array_n, – row er numerisk system af værdier,.,, genstand, – row er tilbage som et objekt.misligholdelse.,,, $wpdb - > get_col ($sql - kolonne), – det udfører de spørgsmål og vender tilbage med et numerisk system af værdier fra den, der er angivet i kolonne.- kolonne angiver, hvilke kolonne tilbage i hele tal.uden at dette er 0, første kolonne., $wpdb - > get_var ($sql - kolonne, $row), – det udfører de spørgsmål og vender tilbage til en bestemt værdi.- ro, og $kolonne, som anført ovenfor, og angive, hvilken værdi tilbage.f.eks. $activities_by_user_1 = $wpdb - > get_var ("vælg tæller (*) {% wpdb - > wptuts_activity_log}, hvor user_id = 1"), er det vigtigt at bemærke, at disse metoder er kun på papiret, for at udføre en sql forespørgsel og formatering resultatet.gør de ikke sterilisere forespørgslen, –, så du bør ikke anvende dem, når den forespørgsel indeholder nogle ukendte data.,, smdrg., vi har dækket meget i denne forelæsning - og data sanitisation er et vigtigt emne for at forstå.i den næste artikel, vi vil anvende det til vores stik.vi ser på udviklingen af et sæt indpakning funktioner (svarende til funktioner, wp_insert_post(),, wp_delete_post() osv.), som vil tilføje et lag af abstraktion mellem vores stik og databasen.
skik database tabeller: sikkerhed først
Previous:udtryksfulde test med hamcrest