>> [Secțiunea 9] [mai confortabil]
[Rob Bowden] [Universitatea Harvard]
[Acest lucru este CS50.] [CS50.TV]
>> Regulă. Practic astăzi este tot de până la voi a pune câteva întrebări.
S-ar putea fi capabil de a umbla cu unele subiecte
pentru un pic în cazul în care nimeni nu are întrebări să întreb.
Sperăm că faci. Are cineva vreo întrebare?
Poate din teste anterioare, lucrurile nu esti confortabil cu în prezent.
>> Da. >> [Student] Poti sa te duci peste atacuri buffer overflow? >> [Rob] Sigur.
Principalul exemplu de fapt, ar putea fi chiar aici.
Principala afacere din spatele atacurilor buffer overflow sunt
avem unele tampon, aici.
Char c - care este doar de mărimea 12 -
dar apoi ne introduce ceva în care tampon
dar nu a verifica exact cât de mult ne introduce.
Aici suntem inserarea strlen (bar) în C, dar cine știe cât de mult este bar.
Daca este mai mult de 12 caractere, atunci acest lucru este de gând să se reverse acest tampon.
Privind la această imagine -
dacă luați 61 veți obține mult mai familiarizați cu acest tip de aspect
și care se ocupă cu indicatorul frame salvat și adresa expeditorului și teancul de rutină părinte
și toate aceste lucruri reale.
Dar aici trebuie doar să știe că avem
acest spațiu mic de tampon nostru.
Aici avem c (0) și apoi avem c, 1, 2, 3, 4, 5 și așa mai departe.
În condiții normale, ne-ar umple acest tampon ca de obicei.
Dacă ne-am introdus "Buna ziua", vom avea h-e-l-l-o / 0,
și apoi doar o grămadă de spațiu gol.
Pentru un hacker - oh, cred că acest lucru este un exemplu.
Pentru un hacker avem ceva de genul asta în cazul în care
ceea ce ei în mod special încercăm să facem este
de obicei, suprascrie adresa expeditorului.
Ori de câte ori te sun o funcție și cadru stack devine împins pe stiva
că cadru stivă trebuie să știe cum -
bine, funcția care a fost numit trebuie să știe cum să se întoarcă la funcția pe care a numit-o.
Deci, în cazul în care apelurile principale foo, foo trebuie să se întoarcă în principal,
și așa mai departe asta e ceea ce face această adresă de retur.
Dar ceea ce hacker va face este
trece-l cu o adresă specială de retur
în cazul în care din nou - Micul indian - nu este simplu, dar fiecare octet este invers.
Această adresă de retur la fel de mult ca și computerul este în cauză
revenind la această adresă este echivalentă cu revenirea la foo sau principal
sau orice funcție a numit-o.
Deci, se va reveni la această adresă
care se întâmplă să fie această adresă
care, fie, uneori, ceea ce fac ei aici, este să utilizați adresa de returnare
de o funcție specifică, care știu că este deja acolo.
Nu-mi amintesc ce funcția se numește.
O să-l caut mai târziu.
>> Iată ceea ce faci este trecerea adresa expeditorului
la stiva sine, iar acest lucru este în cazul oarecum ciudat
există exemple de memorie în care -
memorie pot fi împărțite în doar-citire, citire-scriere, și de memorie executabil
unde am văzut memorie read-only înainte în cazul în care -
dacă spun char * s = salut eu nu pot modifica salut.
Care este de memorie read-only.
Există, de asemenea, această idee de memorie executabil
în cazul în care memoria executabil ar fi segmentul de text de cod.
Privind la adresa schema de spațiu de obicei -
Eu cred că va fi o imagine bună -
funcționează - în cazul în care ne-am stiva noastră aici. Avem memorie de date.
Ignora acest practic. Aceasta este grămadă nostru.
Și apoi ne-am aici codul nostru de program principal.
Acest lucru este similar cu locul unde am pus siruri de caractere noastre ca char * = salut
și care este read-only.
Dar ai putea marca, de asemenea, acest cod principal de program ca executabil.
Și dacă faci asta sau sistemul de operare face asta în mod corect
atunci acest lucru ar trebui să fie singurul loc din memorie
acest cod poate executa de fapt,
ceea ce înseamnă că acest tip de buffer overflow atac avem aici
ar fi ineficientă, deoarece acest lucru este încercarea de a executa de memorie de până aici, în stivă nostru.
Observați imaginile sunt în primul rând.
Avem stack nostru de creștere.
Aici stiva este în creștere în jos.
Scopuri CS50 stiva crește.
>> Este posibilă eludarea acestui tip special de buffer overflow
de a avea aceste regiuni executabile de memorie în regiunile non-executabile.
Dar doar așa se întâmplă că rareori este memorie executabil marcat ca executabil.
Este doar tinde să fie doar în citire și re-scriere sunt singurele lucruri care sunt folosite,
astfel încât acest lucru este încă foarte eficient.
Și aici am putea pune ce vrem.
Nu a fost făcut de fapt ca o PSET din 61 in acest an,
dar daca te uiti la oferirea de anul trecut de ea sau orice alt an
unul PSET este că ar trebui în mod special pentru a introduce aici codul care ar trebui să
imprima o anumită valoare specifică sau returna o valoare, care este diferit de
valoarea care se presupune a fi imprimate.
Sau chiar mai inteligent, vrea să-l suni sau scrie -
astfel încât aceasta va reveni până aici și apoi veți executa unele de codificare aici,
și cel mai inteligent de overflow va reveni apoi la ceea ce această adresă de retur folosit pentru a fi.
Deci, chiar dacă am nevoie pentru a trece peste acest
de a veni aici, să ne amintim, totuși, că adresa de returnare undeva
astfel încât să ne putem întoarce la principal sau orice altceva,
și e ca și cum nici nu am observat că lucrurile au mers prost.
Dar lucrurile au făcut acest lucru în care este cazul în care, poate, în interiorul de aici ne-am gelbroke iPhone nostru.
Lucrurile merg ca de obicei - ca și cum am rula unele programe și lucrurile ajung revenirea la
tot ce ar trebui să se întoarcă la, dar în același timp
ați reușit să distrugă întregul sistem de operare.
Nu aveți nevoie să știți cod cu privire la buffer overflow sau de a lua de fapt profita de ea.
Aveți nevoie să știți ideile de bază ale acestei este tampon care este înecată,
și acesta este motivul pentru care acesta poate fi umplut, deoarece nu ne verifica dacă
noi suntem de fapt în limitele de ea.
>> [Student] Soluția pentru a preveni aceasta este doar verificarea limitele?
[Rob] Da. In acest caz, soluția ar fi
ai putea spune nici dacă strlen de bar este mai mare de 12-1 -
pentru că aveți nevoie de / 0 la sfârșitul -
sau ai putea face manual pentru o buclă care numai de exemplare în primele 11 caractere,
sau doar ceva cazul în care sunteți de fapt, de verificare pentru a vă asigura că nu se reverse ca tampon.
>> Alte întrebări? Da?
[Student] Poti sa vorbesti despre încercări și poate ceva despre programare (fără sunet).
[Rob] Sigur.
Programul actual -
nu ne-ar face să faci o punere în aplicare a unui trie cu privire la examenul
deoarece ar fi nedrept pentru cei care au tabele de dispersie.
Și la fel noi nu ar face să pună în aplicare un tabel hash la examen
deoarece ar fi nedrept pentru cei care au încearcă.
Ar trebui să știi toate acestea, struct unui trie sau struct unui tabel hash sau orice altceva.
Asta este de fapt adevărat de orice fel de structură de date care le-am văzut.
Liste legate, skews stivuite, arbori binari -
ar trebui să fie în măsură să definească acele structs de inima.
Un trie - ceea ce înseamnă că singurul lucru pe care va trebui să faceți este, poate, vă vom da
un cuvânt sau ceva și vom spune construi trie care -
vă vom oferi, poate, un set de cuvinte
și noi suntem ca construi un trie care reprezintă acest dicționar.
>> Să facem pisica noastra dicționar și câine.
Ideea de trie este începem cu această matrice -
26 sloturi -
și în fiecare slot indicele real de slot corespunde literei pe care suntem în cauză cu.
Deci, aici, dacă încercăm să introduceți pisica în trie nostru
primul caracter este "c", care va fi "în cazul în care a este 0, atunci b este 1, c este 2."
Vom intra în cea de a doua index,
și vom crea un trie de pe asta.
Vom avea 26 de sloturi.
Și apoi vom index al doilea caracter de pisică.
Asta e "o", care va fi 0 la fața locului.
Și care va avea 26 de locuri.
Apoi vom merge la "t" și am avea, de asemenea, că vine în jos, care este de fapt un fel de importante
pentru că - hai l-au venit aici. Iată trie nostru pentru 't'.
Să spunem că aceasta este index "t" este 19.
Cel mai important lucru de reținut despre încercări este că nu poate ține numai evidența aceste indicii.
Trebuie, de asemenea, pentru a urmări dacă aceasta este de fapt sfârșitul unui cuvânt.
Deci, în interiorul de aici avem nevoie de un fel de steag care spune
bine, aceasta este de fapt sfârșitul unui cuvânt.
Motivul fiind, dacă vom încerca mai târziu să introduceți catastrofală în dicționarul nostru
care are aceleași începând 3 caractere
dar merge mai departe trebuie să recunoaștem că acesta este sfârșitul unui cuvânt.
Sau, alternativ, în cazul în care vom încerca să se uite în sus "ca", care, poate, nu este un cuvânt
dar ajungem până aici, atunci ne -
sau ar fi C și apoi ne uităm la un -
trebuie să recunoaștem că, deși nu există un indicator care iese din acest nod
nu reprezintă sfârșitul cuvântului.
>> Deci, ce înseamnă asta - ceea ce aveai de gând să spui?
Ce înseamnă asta struct nostru arata ca?
[Student] Este o serie de indicii care este de 26 lung și apoi o bool au fost sau nu au fost.
[Rob] Da. Deci, vom avea un struct Trie * indicii - aici vom spune [26] pe
și apoi punct și virgulă aici.
Dar, pe de PSET, avem nevoie, de asemenea, să țină seama de apostrofuri,
ceea ce a însemnat ai nevoie pe hard-cod care apostrof cu indicele de 27 sau ceva.
Dar aici ne pasă doar de 26.
Și atunci avem nevoie poate un char sau bool - hai să numim aceasta este cuvântul.
Asta-i 2 din cele 3 lucruri pe care le cred că ai vreodată ar trebui să știți despre încercări -
construirea lor, struct de ei, iar ultimul lucru pe care este run-time de ele.
>> Ce este runtime a unui trie - sau căutării într-un trie?
Acest lucru este în cazul în care se spune că este o (k), unde k este lungimea cuvântului se întâmplă să fie în căutarea în sus;
dar în același timp spunem - cel puțin de dragul PSET 5 abecedar lui - spunem noi
cel mai lung cuvânt în dicționar este de 45 de caractere, astfel încât aceasta este de fapt
O de 45, care este constantă de timp.
Deci, în cazul în care există o limită superioară pe cuvânt mai lung, atunci -
sau chiar ca dicționarul englez - există o limită superioară pe cuvânt mai lung.
Sau orice dicționar - există o lungă legat pe cuvântul tău superior.
Indiferent de ceea ce faci este constanta de timp,
dar O a k este frumos, pentru că există de fapt, este o diferență între funcționare spun
Cuvânt de 45 de caractere, față de un alfabet care are numai cuvinte de până la 3 caractere.
Un alt lucru despre care este faptul că -
oh, pentru că doar spunând că 45 se întâmplă să fie cel mai lung cuvânt
este un fel de prostie, deoarece, în același timp, să spunem că un algoritm este O, de N.
Ei bine, pentru că de memorie acceptă numai până la 2 ^ 32 bytes,
atunci N este de cel mult 4 miliarde de euro și care este constantă de timp, motiv pentru care la un moment dat
E o prostie să spun acest fel de lucru în cazul în care nu există o limită superioară
că putem reduce doar la timp constant, deoarece totul este constanta de timp
când vă gândiți la ea în acest fel.
Dar ne-ar accepta, probabil, ambele.
În orice caz, să explice, fie ca O (1), înseamnă că aveți o lungime de sus, mărginită de cuvânt;
O (k) reprezintă lungimea de cuvânt -
bine, k înseamnă lungimea cuvântului.
>> Da. >> [Student] Are bool - pentru că atunci când a făcut trie dvs.
se pare ca a fost - v-ar merge de pisică și apoi te duci la indicatorul următor
și apoi să vă spun în cazul în care este egal cu adevărat - ai pune ca adevărat, la fel ca cu t?
[Rob] Să cred că acest lucru este în cazul în care o mulțime de exemple, puteți încerca pur și simplu și să vină cu
exemple simple și / sau extreme și ceea ce ar trebui să fie, așa că haideți să gândim la cuvântul "o".
În trie noastră originală -
ne-ar dori să pună un 1 aici, sau am dori să o 1 aici.
Aș spune că în cele din urmă, ar fi, probabil, fie / sau.
Nu mă pot gândi la un motiv - sau într-adevăr tu ar fi luat -
motivul pentru care nu ar fi pus-o acolo jos este pentru că nici măcar nu trebuie să meargă atât de departe.
Noi nu trebuie să aloce această trie.
Tocmai am pus o acolo.
Acest lucru este încă îndreptat la NULL.
Dacă suntem doar de gând să aibă personaje unice
nu există nici un motiv să se extindă până la un alt trie doar pentru a marca această scrisoare în calitate de utilizat.
În mod similar, dacă am fi pus "o" acolo jos
atunci în mod obligatoriu toate acestea ar fi doar 0, în orice moment.
>> [Student] Dar nu avem nevoie de un trie de pornire care va indica acest lucru "o"?
[Rob] Avem unele global sau ceva struct trie * t
care subliniază aici, dar asta e doar un pointer.
Acesta nu este un trie în plină floare, care este îndreptat la ea.
[Student] Bine. Cum ne-ar atribui litera "I'- cu cuvântul eu?
[Rob] Întrebarea lui s-ar putea răspunde că. Stai.
Aceasta este o problemă în cazul unui trie în sine -
Eu nu cunosc modul în care PSET ar fi scris.
Struct anterior a fost rău.
Dar am putea face, de asemenea, nodul struct este un bool - și un pointer -
există de fapt mai multe moduri de ai putea scrie.
Alternativ, un trie nu trebuie să fie un struct.
Ar putea fi chiar trie - nod typedef * -
nod [26] este un trie, și acest lucru nu mai este struct.
Acum, acolo va fi - Încerc să mă gândesc la modul în care PSET s-ar fi așteptat să.
[Student] Am tras în sus că sesiune de revizuire și cred că pur și simplu du-te -
cum ar fi dacă aveți o un apoi te duci la alta - >> [Rob] Asta e cum o fac?
[Student] Și apoi, dacă există un adevărat acolo nu funcționează -
[Rob] Da. Care nu funcționează. Se irosește spațiul de -
aveți neapărat un alt nivel întreg de trie care nu ar avea nevoie, în primul rând.
Aici se face urât cu fiecare -
de fapt ceea ce am încercat să fac aici este asociat -
în loc de a fi 26 de indicatori de încercări tale,
e 26 pointer bool, bool pointer, bool pointer, și așa mai departe.
>> [Student] Nu se poate face ca 2 tablouri? O serie de bools și o serie de indicii?
[Rob] Ai putea, dar atunci ai nevoie pentru a -
2 tablouri de boolean și indicii.
Tu ar trebui pentru a construi apoi matrice dvs. de boolean -
matrice dvs. de boolean trebuie să fie la fel de mare ca trie
pentru că nu poți avea doar 26 de Boolean.
Ea trebuie să crească cu fiecare posibil -
ca trie-ul are mai mult de 26 de cuvinte adevărate sau false posibile.
În acel moment, acestea pot la fel de bine să fie doar un singur struct care trie-ul crește în jos cu.
Acest lucru nu mi se pare corect pentru că - ceea ce vreau aici?
Deci, trie * t -
poti sa faci typedef (nod *) [26] trie;
care ar putea fi sintaxa caut.
Și acest lucru ar trebui să fie doar un trie regulat.
Nu sunt sigur.
Dar că este modul în care am făcut-o în revizuire, astfel, care funcționează foarte bine, de asemenea.
În cazul în care în cazul în care acesta este doar bool este cuvântul și apoi o serie de 26
atunci tu trebuie să mergi la nivelul următor.
Mă voi gândi la modul în care mi-ar face asta.
>> Alte întrebări?
[Student] Pot să pun întrebări despre altceva? >> [Rob] Da.
[Student] Poți trece peste ceea ce diferența este și atunci când ar folosi jQuery comparativ cu Ajax?
[Rob] Ele sunt în și de ei înșiși complet diferite.
JQuery nu permite Ajax. Aceasta nu ne dea o utilizare mai ușoară de Ajax.
Dar Ajax vine livrat cu JavaScript. JavaScript are capabilități Ajax.
Toate Ajax inseamna asemui Sunt deja pe o pagină și atunci când vreau să -
atunci când fac clic pe ceva ce nu trebuie să reîncărcați pagina pentru a descărca că noi informații.
Am solicita informații noi.
Poti sa te uiti la ea în Facebook sau ceva.
Inspecta rețea.
Micsora aceasta.
Aici vedem că primim toate aceste cereri.
Acum, când am faceți clic pe - ei bine, se face Ajax înainte chiar să faceți clic pe nimic.
Dar dacă fac clic pe acest lucru, atunci se va face o grămadă de cereri aici
care face doar aceste cereri - oh, acum sa terminat aici.
Să reîmprospătare.
Face acest lucru din nou.
Vedem că vom obține toate aceste cereri, dar acest lucru ar putea fi încă în procesul de pagina de încărcare.
Observați Facebook este de a face aceste cereri constante chiar și după ce pagina sa incarcat.
Și dacă faceți clic pe aici, va face unele mai multe cereri de unele date
care este ca răspuns la ceea ce am făcut clic pe.
Asta e doar ceea ce este Ajax. Acesta vă permite să trage de date care nu au fost descărcate cu pagina inițial.
>> JQuery este separat. JQuery este doar o bibliotecă JavaScript, care face o mulțime de lucruri mai ușor.
Cu jQuery este o mulțime de avantajul este aceasta doar -
semn dolar - semn dolar este o variabilă valabilă în JavaScript.
Deci, jQuery - tot ce face este de a spune ca var $ = o grămadă de lucruri -
cum ar fi o funcție mare, cu toate aceste lucruri în ea -
și apoi să utilizați acest semn dolar, în moduri, cum ar fi
$ ("# Footer"). Style ("text-align", "center").
JQuery ne oferă acest tip de sintaxă în care un mare avantaj -
ea are alte caracteristici, dar ceea ce vrem sa se concentreze pe cele mai
este doar posibilitatea de a selecta elemente, cum ar fi acest lucru.
In simplu-vechi regulat JavaScript, puteți face lucruri, cum ar fi
Document-dot-te elemente de identitate footer-punct - Nu știu ce e în acel moment -
ceva despre CSS sau stil sau ceva -
dar apoi, alternativ, să spunem că ne-am dorit pentru a selecta de clasă.
Acum suntem styling totul cu un subsol de clasă cu acest stil.
Chiar dacă ne-am dorit să stil orice alt paragraf.
Deci, acest selector - posibilitatea de a alege lucrurile în DOM ca aceasta este incredibil de convenabil
deoarece în vechiul simplu de activarea JavaScript-ar trebui să facă documentul-dot-obține elemente de nume de clasă
sau orice ar fi, sau în cazul în care mi-am dorit o etichetă mi-ar trebui să spun a obține elemente de nume de etichetă.
Deci, eu trebuie să cunosc căile specifice pe care le accesa toate aceste lucruri.
Funcțiile vor fi diferite, în funcție de dacă eu sunt, folosind o clasa sau un ID
sau o etichetă sau ceea ce, în timp ce jQuery doar face asta pentru mine.
>> [Student] Este jQuery va fi utilizat atunci când faci styling inițială a paginii?
Sau pentru a schimba stilul, după e deja - >> [Rob] Pentru a se schimba.
[Student] După ce este deja încărcată. >> [Rob] Da.
Orice stil inițială - ei bine, chiar -
în general, ar trebui să utilizați acest tip de schimbare.
Tu nu ar schimba - acest lucru ar funcționa foarte bine.
Dar, de obicei, nu s-ar schimba stilul de genul asta.
În schimb, ai da o nouă clasă sau ceva
în timp ce CSS a fost deja definit pentru această clasă într-un anumit fel.
Prin acordarea acestor elemente am selectarea o nouă clasă
Aplic stilurile care au fost deja descărcate.
[Student] Deci ai selecta o serie de casete de selectare și lucrurile pe care le-ați selectat
schimba la un stil nou și începe căutarea diferit. >> [Rob] Da.
Alte lucruri să-și amintească despre -
bine, există mai multe funcții ar trebui să amintesc despre jQuery.
Să spunem că suntem selectarea ceva cu ID-ul P.
>> [Student] Ai mereu de a folosi lira?
[Rob] Aceasta înseamnă identitate. Este echivalent cu CSS, deci selectoare CSS - este inspirat de asta.
În cazul în care în CSS, dacă am vrut să stil de subsol -
sau ceva cu subsol ID -
ar fi ca text-align: center;
nu veți avea nevoie pentru a scrie CSS la examen, dar trebuie să știți selectorii.
Trebuie să știi ce - trebuie să știți cum să-l citesc.
Dar ne-ar niciodată -
nu aveți nevoie să memoreze toate din diferite posibile lucruri de styling. Sau oricare dintre ele.
>> JQuery lucruri trebuie să vă amintiți -
trebuie să vă amintiți dot-HTML, și un model comun în jQuery - să re-scrie acest lucru.
Un model comun este ne-am $ ("# f"). Html
Dacă am pus paranteze pur si simplu înseamnă că obține HTML;
întrucât, dacă spun HTML și a pus tot ce vreau aici - unele link către ceva -
a pune ceva în interiorul paranteze stabilește acum HTML.
Asta e destul de comun printre o grămadă de funcții.
Nu e acelasi treaba cu textul.
Diferența dintre HTML și textul este că textul se va introduce acest
ca literal-mai puțin de o, mai mare de loc de ca un tag ancoră.
Și textul va fi la fel, dacă am face acest lucru.
Se va prelua textul documentului - nu HTML a documentului
dar doar textul în acest element.
Un altul este în cazul în care "f", se întâmplă să fie un ID pentru o intrare,
apoi hash-f-dot-val - dacă vreau să setați de intrare la ceva de genul -
să spunem că am lovit o casetă de selectare și vreau să setați o valoare implicită -
dot-val - Nici nu știu - 3 -, astfel încât va introduce automat în caseta de text 3,
dar dacă spun 3-dot-val, care va prelua tot ce este în prezent în caseta de text pentru mine.
>> Acest lucru este util pentru formă de validare în cazul în care
dacă vreau doar să vă asigurați că ei de fapt completat toate lucrurile.
O modalitate de a face asta este dacă, după ce am lovit prezinte este trimis în mod inevitabil la o anumită pagină de pe server -
ca și pentru noi ar fi PHP - și care va încerca să proceseze datele și s-ar spune
ei nu au completat ceva, așa că acum le redirecționează la o altă pagină care spune
nu te-ai umple totul.
În loc de a avea de a face că, în JavaScript / jQuery puteți vedea doar în cazul în care val este gol.
Sau este val - citate goale.
Asta va doar - acum le putem avertiza că nu ai completați acest domeniu.
În mod inevitabil, aveți nevoie pentru a face verificarea server-side PHP, deoarece
puteți dezactiva doar JavaScript în toate browserele.
Dar de activarea JavaScript-face convenabil pentru cei care nu l-au activat,
și practic nouăzeci și nouă-punct-ceva la sută din browsere avea pe ziua de azi.
Foarte puțini oameni rândul său, JavaScript oprit.
Acesta este un avantaj de utilizator. Aveți nevoie pentru a face validare PHP.
Ar trebui să faci validare JavaScript.
>> [Student] Ce # f referă la aici?
[Rob] Ce # f referă la?
Există un element în documentul meu cu ID-ul "f".
Ne vom uita la -, probabil, Facebook are o multime de exemple în care, dacă vin la elementele
caută aici sub eticheta de elemente văd acest div special, care este în curs de subliniat aici -
sau este întreaga pagină - da, e acolo sus. Acest lucru are ID-ul pagelet_bluebar.
În consolă Presupun că folosesc jQuery.
Deci, am putea selecta pagelet_bluebar astfel încât selectează asta, și am făcut ceva greșit.
Să încercăm - sau poate că nu sunt utilizați jQuery și că personajul lui mapate la altceva.
Un exemplu mai bun în ceva ce știu este folosind jQuery -
încă în căutarea la elemente nostri aici - avem aici de clasă egal navbar.
Acest lucru este ceva cu clasa navbar,
atât în ​​interiorul consolei noastre ne putem uita în sus chestia cu clasa navbar.
Aici putem derula peste acest lucru și văd că despre asta e vorba.
Dacă am vrut să fac. Text Acesta este textul pe care, așa că am vedea setările pentru raportul de mai sus log out
care sunt toate sub aici, dar care este încă de text în care tag-ul HTML.
Am putea stabili HTML pentru doar câteva link-ul,
așa că vom scăpa de barul meu. Acum, că am scăpat de antet în întregime doar ca este conectat la YouTube.
>> Și nu există nici un exemplu formă?
Iată un formular.
Am posibilitatea să faceți clic dreapta și inspecta elementul să vină să-l chiar aici.
Văd că ID-ul său este de căutare de text,
așa că aici, dacă am face ID căutare text.
Voi aduce peste ea și văd că este un lucru corect am fost în căutarea pentru.
Dacă vreau să fac. Val mi-ar da ceea ce am scris acolo.
Dacă am vrut să fac salut va schimba aici la salut - jQuery.
Desigur, am putea face ridicol ca document.get elementul de identitate - Căutare text -
Nici măcar nu știu ce este în acest moment - valoare punct - nu, am uitat că tipul ăsta.
Deci, asta-i salut. Nu știu cum aș stabilit este egal cu ceva.
Da, astfel încât a schimbat asta.
Dar nu aveți nevoie pentru a utiliza aceste și foarte multe site-uri în acest moment utilizarea jQuery.
Chiar ca pe un proiect final - dacă faci un proiect web - primul lucru
Recomand este doar inclusiv jQuery astfel încât să puteți obține confortul de toate aceste funcții.
>> [Student] Cred că am văzut un alt mod de a ajunge la un element folosind dom.
Nu va trebui să utilizați punct și apoi să păstreze merge în jos?
[Rob] Puteti face asta. Nu știu dacă ar funcționa foarte bine.
Este greu pentru a naviga în acest fel.
Un exemplu este - Nici nu știu dacă avem nici o formă -
dar document.forms este de gând să se întoarcă în lista de forme care se află pe această pagină,
atunci eu pot face document.forms 0 va fi prima formă.
Dot - Nu știu ce am numit ca - asa ca nici macar nu are un nume,
asa ca poate intrări va funcționa. Nu.
Nici măcar nu știu cum să obțineți de la acest - a obține nume element-I-tag-ul de intrare.
Da, că mi-a dat de intrare, iar acum vreau de la 0 la intrare
și vreau pentru a selecta valoarea sa, astfel încât va fi text.
Am avut de a ajunge să faci elemente get de nume de etichetă, oricum.
Ar putea fi o cale de a selecta direct
prin intermediul formularului de 0, dar un lucru frumos despre acest lucru este încă cum am avut doar pentru a obține etichetele numit de intrare
care au un copil cu acest formular, în caz contrar, dacă am face asta drept în față
acest lucru ar putea selecta toate elementele pe întreaga pagină, în întregul document
în loc de doar că forma și, probabil, nu va fi chiar cel pe care îl doresc.
Nici măcar nu știu care este. Nu știu.
Cred că primul element de intrare pe pagina noastră este acest mic caseta.
>> [Student] Acest lucru este destul de legătură
și, eventual, un fel de prostie, dar pe tasta de răspuns se spune că PHP -
Nu știu dacă e tasta de răspuns sau note, dar se spune PHP este server-side
și activarea JavaScript este client-side. Care este diferența dintre două?
[Rob] Diferența dintre activarea JavaScript-client-side și PHP de server-side.
Dacă ați auzit de slash / js nod utilizate înainte de v-ar crede că
JavaScript nu este doar client-side, dar pentru scopuri de CS50 este -
sau, cel puțin în scopuri de acest test e este.
PHP fiind server-side. Nu JavaScript.
Când scrie site-ul dvs. va fi scris PHP pe server.
Tu nu va fi scris de activarea JavaScript pe server.
JavaScript se termină prin a fi trimis la browser-ul în cazul în care codul JavaScript execută.
Și codul JavaScript trebuie să trăiască în browser-ul pentru ca altfel atunci când vreau să
doar a face orice fel de activarea JavaScript-y lucru ca făcând clic pe acest lucru,
Eu nu sunt o reîncărcare pagină. Acest lucru este doar JavaScript lucruri re-formatare pentru mine.
Dacă JavaScript trăit pe server, atunci mi-ar trebui să solicite în mod inevitabil ceva
de server pentru a ști ce să facă.
PHP - nu există nici un lucru, cum ar fi PHP în browser-ul.
Când m-am solicita o pagină - așa că hai să spunem aici, am solicitat această pagină special.
Asta înseamnă că acest lucru se întâmplă pentru a solicita -
refresh - se va actualiza această pagină -
astfel încât această cerere iese la serverul nostru.
Se vede că are nevoie să se întoarcă acest subiect special cu acest ID-ul special,
Deci, acum că va fi ceva PHP că interpretul PHP se va interpreta ca pagina
și-l transforma în doar HTML, CSS, JavaScript poate, oricare ar fi.
Este PHP care prelucrează această cerere și preia tot textul și alte chestii
că eu sunt de fapt în căutarea de la baza de date.
Dar ceea ce părăsește serverul este doar HTML / JS / CSS.
Nu e nici PHP care părăsește serverul pentru că în cazul în care de fapt a făcut
atunci browser-ul va avea nici o idee ce să facă cu ea, pentru că nu știu ce este PHP.
Dar, în același gând, deoarece JavaScript este client-side,
niciodata nu poti accesa MySQL de la ea.
Deoarece PHP este partea de server ce nu accesați MySQL de la ea.
>> [Student] Poți trece peste unele dintre preocupările de securitate cu cookie-urile în HTTP?
[Rob] Astea nu sunt lucruri pe care le ai de gând să trebuie să știe.
Unele dintre problemele de securitate cu cookie-urile în HTTP.
Marea întrebare este aici vedem aici că cookie mea este PHP / ID.
E ca și cum PHP universal sesiunea.
Sesiunea este ceva care în interiorul PHP nu va trebui niciodată să fie validate
deoarece este serverul care are control complet asupra sesiunii.
Nu se poate atinge, la toate.
Dar este acest cookie - acesta -
si cred ca ai putea loga ca mine acum, dacă ai vrut să utilizați că -
dar este că cookie pe care - în mod inevitabil să faceți o singură cerere la server.
Serverul întoarce pagina. Cererea se face.
Ea nu mai are nici o idee cine ești.
Astfel, cererea viitoare când face este de gând să includă care cookie, astfel încât să știe
aceasta este persoana care a făcut această solicitare înainte.
Aceasta este datele sesiunii care este asociat cu acest utilizator.
De aceea, nu trebuie să vă autentificați în pentru fiecare pagină să utilizați.
Problema de securitate de aici este că cookie este trimis pe web.
Suntem folosind HTTPS aici, așa că, în acest caz, ceea ce înseamnă că suntem criptarea chestia asta.
Cineva nu poate veni în și doar fura cookie-ul meu și acum serverul vor crede că ești eu.
Dar cu HTTP drept ce pot.
La fel ca aceste lucruri Wireshark / Firesheep pe care le puteți asculta doar la toate wi-FIS în aer
și intercepta tot ce vrei, așa că da.
>> [Student] Un fel de risc de securitate similară este stocarea de identitate de utilizator în post
pentru că pot fi editate liber folosind console și lucruri.
[Rob] Da. Exista o multime de probleme, cum ar fi în cazul în care doar ceva care vine de la utilizator
aveți nevoie pentru a valida.
Există o mulțime de cazuri în care ar fi util pentru ca eu sunt pe cale de a face un post.
Bla, bla, bla, bla, bla. Apoi m-am lovit de răspuns.
Ar fi foarte util în cazul în care cererea de post inclus ID-ul meu, pentru că
Vreau să se asocieze acest post cu mine.
Dar eu nu pot face asta pentru că eu sunt liber pentru a face o cerere de după - la fel ca și manual
veni cu cererea mea de după -
care utilizează numele de utilizator și acum va posta ca tine.
De aceea, server-side nu mă pot baza pe solicitările poștale care conțin ID-ul de utilizator corect.
De aceea, trebuie să aparțină în sesiune mea.
Așa că am căuta numele de utilizator în matrice mea ședință și am insera că în baza mea de date
ca utilizatorul care a făcut de fapt acest post.
[Student] Și care este bazat pe cookie-ul?
[Rob] Da. Se folosește cookie-ul pentru a se potrivi în sus vă ca utilizatorul care a făcut această solicitare.
Se scoate ID-ul de utilizator de la această sesiune și care apoi introduce în baza de date
folosind acel ID de utilizator.
Acest buton ca - ceea ce, care este de fapt face este -
Eu nu am de gând să-l găsiți aici. O să fie o funcție Ajax
Ce este funcția Ajax?
Lasă-mă să aflu ce JavaScript mea este.
A fost un proiect CS50 un timp în urmă.
Nu-mi amintesc ceea ce este.
Funcția Ajax - toate funcție Ajax este de a face este de a face o cerere Ajax la o pagină cu acest ID -
cu 22453 de identitate.
Nu e nici măcar o cerere de mesaj. Este o cerere GET, ceea ce face chiar mai ușor.
Dacă aș fi știut ce URL-ul este - e ceva de genul ca aceasta / ID = 22453 -
sau ID = 22453? -
astfel încât vizita acest URL va place asta.
Ceea ce nu ar fi la fel de mult de o problemă, dar este incredibil de ușor de a scrie o buclă
care este doar de gând să vizitați această adresă URL de peste si peste din nou, care este motivul pentru care vezi
Isawyouharvard posta cu mii de lucruri.
Și ele tind să fie mesajele Isawyouharvard CS50 bazate pe.
Cum pot găsi cele mai plăcut?
Ei au tendința de a fi șters destul de repede, de asemenea.
Acest lucru nu este cel mai plăcut. Acolo mergem.
Trisorii pe pagina placut cel mai mult - care este destul de relevant pentru asta acum.
Oh wow. Ei au eliminat deja oricare dintre cei din acest an, care au fost
înșelat. Cei care toate au fost șterse.
Nu va exista niciodată un post care devine această mare.
Acesta a fost în mod evident inselat-o pe a ajunge la pagina placut cel mai mult.
>> Mai multe întrebări?
[Student] Ce trebuie să știm despre XHTML?
[Rob] Practic, nimic. Doar ceea ce este.
Diferența dintre aceasta și HTML fiind că XML este foarte similară în aparență
la HTML cu excepția HTML trebuie doar să aibă un set predefinit de etichete.
Dar cu XML - XML ​​este la fel ca un format general de unde puteți face un document XML
pentru orice scopuri vrei.
Deci, de exemplu, în cazul în care mi-am dorit am putea construi un XML pentru cursurile -
și cred că de fapt CS50 are un API pentru aceasta.
Documentul meu XML ar putea arata ceva de genul -
cursuri și, desigur, am nevoie de niște cursuri finali.
Am putea avea un curs și ar putea avea nume egal CS50.
Și apoi, desigur meu final și am putea pune în interiorul de aici studenților,
și apoi în interiorul de elevi am o listă de un elev al cărui nume este indiferent.
Am încheia ca elev și așa mai departe.
I se întâmplă doar pentru a fi construit unele documente XML arbitrare, dar este XML valid.
XML - tot ce este este acest tip de structură și un lucru frumos - motivul pentru care ne-am chiar o numim XML
este că acest tip de lucru este foarte usor de analiza.
Este foarte ușor de a lua acest document și de a face o serie de ea.
Și așa XHTML este o încercare de a obține HTML pentru a fi XML valid.
Deja acest lucru pare destul de similar cu HTML.
Unele dintre diferențele sunt HTML sunteți în stare să facă lucruri, cum ar fi de intrare poate tip este egal cu textul
care este implicită, așa că nu trebuie să spun că.
Dezactivat.
>> Sunt două lucruri aici care fac acest XHTML invalid.
Primul lucru este că toate etichetele XML nevoie de o etichetă de închidere.
Deci, în cazul de intrare am nevoie pentru a face - în ce direcție a slash este ea?
Această direcție? Pare greșit.
Altă direcție.
Tag-auto-închidere.
Al doilea lucru este că, cu XML aveți nevoie de aceste tipuri de perechi de valori-cheie, cum ar fi.
Este nevoie de o valoare asociat cu ea.
Deci, chiar dacă cu handicap în și a se exprima ceea ce vreau -
această intrare ar trebui să fie dezactivat -
asta e XHTML invalid.
Ceea ce de fapt am nevoie pentru a scrie este dezactivat egal dezactivat.
Acum este valid XHTML.
Și acestea sunt doar aceste mici diferențe care transforma HTML la un fel bazat pe XML de lucru.
>> [Student] XML este de aproximativ trage ca prin propria X totul ca de ce este ea (fără sunet)
[Rob] lucru de ca un CSV - un CSV trebuie doar valori separate prin -
cred că doar de o foaie de calcul. Un CSV este de fapt o foaie de calcul.
Ai poate coloane și aveți o grămadă de rânduri care
date asociate cu aceste coloane, dar asta-i tot.
XML este mult mai versatil în care poți - ai o ierarhie arbitrar de date.
Am putea avea mai multe cursuri care au mai multe studenți în ea
în cazul în care ar fi dificil să se gândească la o foaie de calcul care -
doar că o singură foaie de calcul - CSV mai ales ca este doar o singura foaie de calcul -
astfel încât foaia de calcul unică, având toate CS50, 51, și 61 și în cele din toate
elevii legate de acele vremuri, ori poate de întâlnire și tot de chestii din astea.
Un alt lucru este că numele tag-ul da un nume frumos pentru toate elementele
astfel încât citirea unui fișier CSV poate fi dificil pentru a încerca și de a analiza ceea ce este de fapt vedem.
XML este mult mai uman, care poate fi citit de aceea ca - veni la o persoană care nu are
știu cu adevărat ce un fișier CSV este sau ca nu este un programator sau ceva -
puteți să le dați ca un fișier șablon XML și pot urmări liniile și -
oh, eu ar trebui să introduceți numele meu aici.
Este un format mult mai ușor de utilizat.
CSV are o multime de utilizari, dar XML are utilizări diferite.
>> Mai multe întrebări?
Alte intrebari?
[Student] De la testul anterior - scalare verticală față de scalare orizontală.
[Rob] Tu nu ar trebui să știe că. Nu cred că am discutat chiar că.
Bănuiesc că a fost doar un comentariu one-off.
Oh. Orizontal față de scalare verticală nu este ceva ce avea nevoie să știți.
Cred că diferența este la fel ca - oh bine, tasta de răspuns va spune diferenta.
Scalare verticală este la fel ca oh, computerul meu face prost. Voi lua o unul mai bun.
În timp ce scalarea orizontală este oh, calculatorul meu este de a face prost -
lasa-ma sa 20 dintre ele pentru toate lucrările pe aceeași sarcină.
>> [Student] Putem trece peste lista mod legat de a face cozi. >> [Rob] Sigur.
Asta e mai ușor decât modul matrice.
Lista legate de modul de a face cozi.
În primul rând, ceea ce nu struct nostru pentru o listă legat arata ca?
[Student] o facem pentru - >> [Rob] Hai sa facem sa - Da.
Int val; apoi nod struct * următor;
deci asta e ceea ce vom folosi pentru exemplul de aici.
Să fapt tip pe chestia asta.
Să facem linked_list.
Struct nostru -
Bine. Acum uita la coada noastră avem -
hai să facă o coadă la nivel mondial.
Va fi nod * coada, și avem o funcție dequeue.
Cred că aceste lucruri ar putea, de asemenea, răsturna adevărat sau fals - hai să facem asta.
Bool dequeue - și suntem dequeueing - oh. Hmm.
Int dequeue - ceea ce am făcut cu acest lucru înainte?
Int dequeue și ne-am bool Puneți în coadă și trebuie să Puneți în coadă unele mijloace adevărat.
Să facem Puneți în coadă primul.
Avem coadă nostru. Vrem să introduceți ceva în coada de așteptare.
Care este cel mai bun mod de a face asta?
Aici coada noastră în prezent pare ca avem ceva pointer la nivel mondial pentru a începe.
Nu e coada noastră.
Presupunând că am dequeue de a lua primul element,
unde avem de gând să doriți să inserați nodul nostru, astfel încât cozile funcționează așa cum ar trebui?
[Student] La sfârșitul foarte. >> [Rob] Da. Cozile ar trebui să fie primul intrat, primul ieșit.
Ceea ce înseamnă că noul element ar trebui să fie introdus pe aici. Bine.
>> Revenind la cod,
ceea ce înseamnă că vom dori să bucla peste coada noastră.
Să facem nod * curent = coadă, în timp ce actuala nu este egal cu NULL.
Mi-ar face - în regulă, să o facem separat.
În primul rând, curent = coadă.
Ce facem în cazul în care actuala începe prin a fi NULL?
Vom face acest lucru 2 moduri. În primul rând acest fel.
Ce facem în cazul în care curent este NULL?
Este aceasta echivalent în cazul în care coada este NULL?
[Student] O să se întoarcă false. >> [Rob] Ar trebui să ne întoarcem false?
Ce e în neregulă cu introducerea ceva într-o listă goală?
[Student] Nimic nu este în neregulă cu asta. Scuze.
[Rob] Da. Deci, aici singura diferenta este coada mea global este trimis la noua mea nod.
Și atunci am să-mi fac verificarile de cazul în care coada este NULL.
Return false.
Și apoi coadă val i egal; coadă egal următor NULL; return true.
Bine. Am de gând să sari arma aici.
Amintiți-vă ce am făcut ultima dată
unde am spus că a fost mult mai ușor să lucreze cu nod ** cu acest gen de lucruri.
Deci, acum, curent va fi și coadă, și venind de aici -
în timp ce în curs - în timp ce * curent nu este egal cu NULL -
asa ca lasa-ma sa fac doar curent - Vom vorbi despre asta într-o secundă.
Următor curent. Bine.
Privind la ea în acest fel, acest lucru este iterarea peste tot de indicii mele până când am ajunge la un pointer nul.
Indicatorul nul va fi indicatorul vreau să înlocuiască cu noua mea nod.
Privind la versiunea iPad -
dacă pointer meu original și lista legat este gol, atunci curent este de gând să subliniez aici.
Acest lucru se întâmplă pentru a indica la null,
astfel încât acesta este indicatorul ajung muta la punctul de la un alt nod nou.
Întrucât, dacă exemplu este acest caz aici
atunci curent este de gând să traverseze de aici - am greșit puțin.
În cazul în care curent ar trebui să fie adresa următoare curent.
Este că ceea ce vreau? Curent, astfel încât * curent îmi dă un nod.
Lângă traversează la următoarea.
Eu sunt în prezent indică aici.
Să facem roșu - așa că eu sunt în prezent, arătând aici.
Apoi * curent se va face referire acest nod.
Și * curente următoarele referințe acest nod, dar asta nu e ceea ce vreau.
Vreau ca acest pointer la acel nod.
Astfel, că pointer la acest nod este ampersand (* curent) următor.
>> În acest moment am ajuns oficial la nodul pe care vreau să-l înlocuiască.
Să înlocui toate aceste cozi de curent - și acum am terminat.
Pot exista greșeli de tipar, dar ideea este că, cu inserție în acest fel de fel
este mai ușor să lucreze cu indicii pe care ne-o dorim pentru a schimba
în loc de care au nevoie pentru a urmări - în regulă, este început NULL meu?
Oh, este? Apoi, am nevoie pentru a crea nodul începe să fie ceva specific
altfel o să vreau să repeta până la următorul lucru pe care mi punctul de a este NULL,
și apoi voi înlocui că - ceea ce urmatorul lucru este - la nodul meu malloc.
În loc de a fi nevoie de a separa aceste cazuri, aici mă ocup doar cu cazul
ceea ce este indicatorul care este NULL că nu mai vrea să fie NULL,
și care face viața mai ușoară cu excepția acestea ar trebui să fie toate de curent * acum pentru că -
[Student] Sunt încă de mărimea unui nod?
[Rob] Da. Sunt încă mallocing un nod.
[Student] Este de gând să fie de mărimea unui nod *?
[Rob] Revenind la aici, gândiți-vă la cazul dacă aceasta este lista noastră legată.
Acest tip de puncte de pe la NULL.
După aceea bucla, punctele actuale de aici
deoarece acesta este indicatorul care este NULL.
Acum vreau să schimbe acest indicator pentru a indica un nou nod.
În primul rând am malloc că noul nod - dimensiune atât de malloc de nod.
Și care returnează un nod * și acum schimbă acest indicator este construirea a * egali actuale
acest nou nod pe care am alocat.
Deci, în cazul în care curent este un nod **, apoi * curent va fi un nod *,
și dacă am mallocing ceva dimensiunea nod, atunci acest lucru se întoarce un pointer la un nod
astfel încât acesta este un nod * - astfel încât ambele părți au în mod corect de același tip.
Și dacă ceea ce am alocat fost NULL, întoarce false;
mai termina setarea lor la ceea ce doresc ei să fie - cu excepția acestea au nevoie de paranteze
pentru că nu e modul de lucru ordinea lucrurilor.
Fără paranteze care era interpretat ca
curent-săgeată-val dereference asta.
În schimb vreau să dereference curent care ma aduce la un nod.
Apoi m-am doriți să obțineți valoarea asociată cu acel nod.
>> [Student] Am crezut că săgețile permis pentru a trece că și merge direct la valoarea.
[Rob] Ei fac. Asta dacă am - să spunem coadă este un exemplu.
Am voie să fac coada-săgeată-val egal i, deoarece coada este un nod *.
Dacă au existat unele sintaxa frumos de curent cum ar fi-mai-săgeată val sau ceva
care a făcut 2 dereferences, atunci acest lucru ar funcționa bine.
[Student] Deci, săgeata este doar pentru 1 dereference. >> [Rob] Da.
Alternativ, am putea scrie aceasta ca (** current.val).
La fel ca și cum aș putea scrie, de asemenea, coada ca (* coada). Val.
Deci, haideți să introduceți. Ei bine, asta e în coada cred.
Dequeue va fi semnificativ mai scurte.
Să punem gol aici pentru curățenie.
Deci, dequeue. Ce elemente sunt eu dequeueing?
[Student] Primul? >> [Rob] Da.
În cazul în care prima mea este NULL - retur - Nu știu ce ne-am dori să se întoarcă - INT_MAX;
și atunci ar trebui să faci o verificare pentru a vedea dacă INT_MAX a fost returnat.
Asta e genul de lucru pe care se inc nu mai vrem sa -
putem întoarce doar coadă val? Este că ceea ce vrei să faci?
Dequeue, de asemenea, elimină implicit elementul din coada de așteptare,
asa ca hai sa spunem primul - sa trecem o tmp pentru a indica la primul nod din coada noastră.
Acum vrem să avanseze coada noastră de la punctul de lucru următoare în coada de așteptare.
Acum avem tmp stânga. Tmp val este lucru pe care vrem să se întoarcă.
Deci, val = tmp-> val;
dar înainte de a se întoarce ar trebui să ne elibereze tmp și reveni val.
Ordinea operațiilor de aici este important în care avem nevoie pentru a apuca un tmp
înainte de a ne muta coada la elementul următor.
Avem nevoie pentru a obține valoarea înainte de a ne elibera tmp,
și apoi ne putem întoarce Val.
>> [Student] Ar trebui să ne-am stabilit coada de așteptare la coadă în continuare?
[Rob] Da. Care a creat o buclă de rău / ea nu ar funcționa după eliberând-o oricum.
Coada = coada-> următor.
Vrem să avanseze coada în elementul următor nu avansa elementul următor
la ceea ce în prezent este elementul.
Stive ar fi în mod semnificativ - ca și mai ușor în care dequeue este exact la fel
pentru că suntem trăgând de pe partea din față a stivei.
Coada final ar fi foarte asemănătoare în cazul în care vrem doar să aloce un nod
și introduceți-l în partea din față a stivei, așa că nici măcar nu trebuie să bucla peste nimic.
Tocmai am introduce direct în față.
Este toată lumea bine pe asta?
>> Bine. Mai multe întrebări?
[Student] Ce lucruri importante ar trebui să păstreze în minte de la cel mai recent curs?
[Rob] Cel mai recent curs.
Nu aveți nevoie să știe orice cod.
Ar trebui să știi ideile generale.
Jumătate Nate nu a avut nici un cod și astfel aceste slide-uri sunt on-line.
Sunt la fel ca uita la ei și ei au cele mai importante idei.
Jumătate mea - cunoașterea ideea generală a primei nu se poate avea încredere în nimic.
Faptul că poate ca procesul de compilator poate fi rău,
dar nici măcar nu contează că codul sursă arată bine.
Deoarece compilatorul poate fi alterat în mod specific pentru a schimba codul sursă
în procesul de compilare.
În același timp, la fel ca - Cred că acestea sunt ca ideile majore ale acesteia.
>> [Student] I-ai spus că nu avem nevoie să știți legat de Firesheep nimic -
sau avem nevoie să știm asta?
[Rob] Cu jumătate lui Nate de lucruri, tot ce Nate atins -
ca Firesheep, Wireshark - Nici nu cred că el a făcut Firesheep în detaliu.
Ai făcut, de asemenea, ceva cu care - a fost Firesheep - săptămâna trecută?
Te-ai atins pe asta?
[Student] Da, cred că am putea avea - >> [Rob] Da.
Noi nu vom da de ieșire Firesheep și spune interpreta acest lucru.
Este doar de gând să fie - ar fi o întrebare ca ceea ce este Firesheep?
Ce este folosit pentru?
[Student] Cred că funcționează doar pe versiunea 4 a Firefox sau ceva.
[Rob] Acesta ar putea fi spart de acum.
Habar n-am.
Ei nu par să-l fi dezactivat manual,
dar poate că nu funcționează cu cea mai recentă Firefox.
[Student] de fapt, am încercat de ao instala, pentru că a spus că ar fi compatibil.
[Rob] Deci, cred că nu funcționează cu cea mai recentă Firefox.
Dar ideea încă stă de ceea ce a fost menit să arate.
A fost absurd cât de mult a lumii nu a fost trăiesc în HTTPS la momentul respectiv.
Chiar și în ultimii 2 ani sau orice altceva, este încă - nu există o îmbunătățire dramatică în
număr de site-uri care folosesc HTTPS.
>> [Student] Nu avem nevoie pentru a trece peste HTTP?
[Rob] Protocolul de ea? >> [Student] Unele dintre lucrurile pe care ar trebui să știm.
[Rob] regulă. Lucrurile de bază sunt tot ceea ce se poate vedea în fila rețea.
Când m-am solicita o pagină - întoarce până la partea de sus pentru principalele lucruri.
Puteți vedea aici cererea pe care o fac.
Chrome se întâmplă cu toate formata frumos pentru noi
în cazul în care URL-ul cerere a fost aceasta, metoda de cerere a fost GET,
și codul de stare a fost de 200 OK.
Dacă l-am lovit de vedere sursa, văd mai direct că -
și acest lucru este - am putea arăta oricare dintre acestea, dar nu este prea dificil de interpretat între ele.
Aici este solicitarea directă am făcut, astfel încât acest lucru înseamnă că m-am dus la
apps.cs50.net/discuss/threads/inbox/all/HTTP/1.1.
Și protocolul folosit a fost HTTP/1.1 care este practic - este întotdeauna o să fie asta.
Aici am folosit GET, astfel încât acest lucru ar putea fi, de asemenea, POST.
Și apoi coborând - tot drumul până la anteturile de răspuns - dacă vom vedea că sursa,
este în cazul în care vom vedea 200 OK.
Cunosc posibilele coduri de stare diferite ale acestora.
Cred că în revizuirea noi nu spunem o pereche de acestea,
astfel 403, 404 - acest gen de cele comune.
Asta e ideea mare de ea.
Diferența dintre doar HTTP și HTTPS este aceasta criptare.
>> [Student] Ai terminat? >> [Rob] Cred că da. Ei bine, da.
[Student] Vrei să vorbim foarte general, despre cum funcționează de criptare?
Pentru că am vorbit de exemplu, atunci când comprimarea fișierelor Huffman,
știi cum să le decomprima, deoarece te-a trimis, de fapt, Hashtable în fișierul
așa cum funcționează de criptare?
Cum știi cum să cripta informații în cazul în care nu ați trimis, de fapt, clientul
cheia pentru a - și vă puteți apuca de fapt, cheia de la -?
Cum funcționează procesul general?
[Rob] Procesul general de criptare -
că este o chestiune incredibil de detaliate voi răspunde.
Există un scurt - bine, Tommy și am făcut pe termen scurt.
Din păcate, este ca 26 minute, deci nu este un scurt. Este o lungă.
Dar de scurtă nostru a fost pe RSA, care este doar un exemplu dintre acestea,
iar acest RSA este parte a protocolului de ansamblu HTTPS.
Ideea - RSA este un exemplu de criptografia cu chei publice,
ceea ce înseamnă că aveți două chei diferite.
Puteți utiliza o cheie pentru a cripta de fapt lucrurile,
și să utilizați o altă cheie pentru a decripta lucruri.
Această cheie pe care le utilizați pentru a cripta lucruri este cea care-i publice.
Site-ul vă poate trimite această cheie de criptare.
Ei nu va trimite cheia de criptare, și atunci când doriți să trimiteți ceva înapoi pentru a le
utilizați cheia de criptare pentru a cripta toate datele și trimite-l la ei.
Deci, ei sunt singurii cu cheia privată.
În cazul în care cheia privată a devenit cunoscut atunci oricine ar fi capabil de a decripta datele.
Dar cheia privată - ceea ce este matematic legate de cheia publică, dar nu se poate
dau unul de altul -, astfel încât cheia privată poate fi utilizată pentru a decripta datele.
Din moment ce acestea sunt singurele cu cheia privată,
ei sunt singurii care pot citi datele.
Deci, chiar dacă cheia publică este publică,
Eu folosesc același lucru - atunci când mă duc la Google.com sau orice altceva,
s-ar putea fi mai multe, nu știu - dar dacă mă duc la Google.com,
el merge la Google.com, ea se duce la Google.com, -
noi toți putem folosi aceeași cheie publică pentru a cripta informațiile noastre cu toate acestea ne-o dorim.
Dar nici unul dintre noi nu sunt de gând să fie în măsură să dau seama - sunt de gând să fie în măsură să decripteze
la informațiile lor deoarece cheia publică nu este capabil să decripteze.
Se poate cripta numai.
Și e distractiv matematica / detaliată - ca o grămadă de operatori de modul și exponentiale si alte chestii,
că pur și simplu funcționează ca cheia privată este singurul lucru care poate
decripta lucruri cheia publică de criptare.
Da. A se vedea pe termen scurt RSA pentru mai multe detalii.
[Student] este că pe site-ul?
[Rob] Da, cred că este în acest moment. Sau cel puțin un link YouTube pentru care a fost postat.
Să vedem. Pantaloni scurți. Cred că ar fi fost săptămâna 2-legate. Da. RSA.
Și este - Nu suntem de gând să joace acest lucru - 24 minute.
Este unul lung.
>> Mai multe întrebări?
[Student] Ați putea vorbi pe scurt despre bitmasks? >> [Rob] Sigur.
Pe scurt, ideea este la fel ca la fel ca - >> [student] Ce este, Rob?
[Rob] Bitmasks. Ideea este - hai să spunem că avem ceva - Suntem folosind un întreg -
int x - deci, am începe de la 0.
Acum, acest număr întreg este de 32 de biți, astfel încât un singur 1 a acestor biți poate fi utilizată pentru a reprezenta
un FLAC specific.
Acest lucru este în cazul în care dacă te uiți la codurile de sistem de operare, pe care o folosesc aceasta peste tot
unde poate până sus undeva ei hash-definesc -
Să vedem câteva exemple.
-Man 2-deschis - apelul de sistem deschis, putem vedea aici că unul dintre argumentele sale este de steaguri int -
ceea ce se așteaptă ca acest argument sunt unele dintre aceste steaguri.
Vedem O_append, O_ASYNC, O_CLOEXEC,
O_CREAT, și așa mai departe.
O_DIRECT. Aceste tipuri de steaguri sunt hash definite de undeva.
Și toate dintre ele sunt exact 1 bit.
Deci, O_CREAT ar putea fi la fel de 1 definit-hash, stânga-shift, 4 (1 << 4).
Care va fi - ori de câte ori am folosi O_CREAT care este doar de gând să fie -
în binare zerouri 1, 0, 0, 0, și 30-ish fața sa.
Este doar un singur bit un set, și că bit reprezintă acest steag.
Și astfel nici un alt steag va fi lăsat-mutat de 4.
Sunt capabil să reprezinte până la 32 de steaguri într-un singur întreg de a face -
x = bit O_CREAT înțelept sau O_DIRECT.
Tu doar alege oricare 2 dintre aceste steaguri.
Acum x va avea 2 biți stabilite care corespund 2 biți
de O_CREAT și O_DIRECT.
Modul în care atunci - da, atunci am trecut x în funcția de deschis,
și are nevoie deschise pentru a vedea ce steaguri au fost de fapt stabilit.
Deci, asta e în cazul în care se va face lucruri, cum ar fi
în cazul în care (x & O_CREAT) face ceva,
sau în cazul în care (x & O_DIRECT) face altceva,
și apoi pot exista unele steag pe care nu ne-am am stabilit -
în cazul în care (x & O_ - Nu știu ce au fost alte steaguri -
(X & O_RDONLY) - această condiție special nu va fi executat.
Sau că blocul de cod nu va fi executat,
dar acestea două sunt pentru că s-au stabilit cele două steaguri.
Și observă că, în C, orice valoare care nu este 0 este adevărat.
Deci, (x & O_CREAT) va fi 0 sau O_CREAT
deoarece O_CREAT are doar un singur set de biți.
În cazul în care bit este setat viitor, atunci acest lucru este de gând să se întoarcă O_CREAT -
binar în care este stabilit doar că pic.
În cazul în care bit viitor nu este setat, apoi se va întoarce 0, caz în care știm că steagul nu a fost stabilit.
Acesta este modul de utilizare bitmasks.
Cred ca pe un examen anterior sau, poate, în clasă sau ceva -
puteți utiliza, de asemenea, bitmasks pentru a imprima binar a unei variabile.
Deci, eu pot folosi - looping peste - 1, stânga-shift, 0 - iar apoi să imprimați, dacă x și că -
dacă x și 1, schimbare stânga, 0 - apoi imprimați un 0 sau 1. Sau imprima un 1 mai a imprima un 0.
Și apoi am trece peste încă o dată - dacă x & 1, stânga-shift, 2 - atunci înseamnă că a doua bit
a variabila este setată, așa că am imprima un 1 mai am imprima un 0.
Și cred că ne-am putea dori de fapt să fac asta în ordine inversă, deoarece
de obicei, vrei partea stângă a fi biți mai mare de ordinul
și în partea dreaptă a fi biți mai mic de ordinul, așa că ar fi, probabil, buclă 4 int i = 31, până când am lovit 0,
apoi se că starea exactă - dacă x & 1, stânga-shift, i; imprimare 1 altfel 0.
[Student] Multumesc.
>> [Rob] Cred că nu mai avem timp.
Orice mai multe întrebări în ultimii doi out-of-time de secunde?
Bine. Noroc mâine.
Aceasta a fost ultima secțiune în care săptămâna viitoare va fi opțională.
Voi da înapoi chestionare și putem trece peste ele și poate trece peste alte lucruri care
ai fost interesat, sau finală lucruri de proiect, sau viitoare CS clase de lucruri sau - Nu știu.
Dar aceasta este ultima partea de material de umplut.
Pa!
(Aplauze)
>> [CS50.TV]