[Música tocando] DAVID Malan: Este é CS 50, e este é o comezo de semana nove. E o que pensamos en facer hoxe non é só pechar o capítulo sobre a da semana pasada material de onde nós nos concentrados en servidor programación web lado con PHP e SQL, algunhas cousas base de datos. Imos falar un pouco de hoxe a seguridade e, a continuación, transición á programación do lado do cliente linguaxe coñecida como JavaScript. Pero, primeiro, algunha redención. Debe lembrar que, en Mércores, eu me propuxen para escribir un sitio web que tomou na entrada do usuario por un código HTML que forman entón almacenado que os nomes de entrada do usuario, teléfono números e móbil portadores na base de datos. E entón eu tiven un pouco de orde guión de liña escrita en PHP que era para interactuar sobre as liñas na base de datos e enviar mensaxes de texto. A pesar de varias, varios intentos, nos non conseguir que o traballo ata o final. Entón eu pase toda esta semana de traballo en que o código para levarnos máis alá do punto de onde paramos, en que todos Teño ata finais deste mércores Foi esa mensaxe de texto de Margo mentres eu loitaba, seguido dunha mensaxe de texto dende outro compañeiro, ten ese David. Seguido por este, marabillosas estimulante. Seguín indo, moi alentador. Eu case puiden ata entăo-- e esa é a nota que rematou o mércores. E entón, de feito, quizais o meu favorito, un momento despois, este entrou. Porra Asistir xogos. Entón, hoxe, nós solucionar isto cunha rápida mira o que eu teño feito dende entón. Entón, todo este código está dispoñible liña desde a semana pasada, oito semanas, código fonte. E vai ver que eu pase, e realmente limparon un pouco as cousas. Eu presentei un par outro características de unha base de datos SQL. Por exemplo, en vez de basta facer transportadora de carbón var como eu creo que eu fixen en tempo real a semana pasada. Eu no canto definiu como o que se chama un enum. E algúns de vostedes poden ver iso como nós explorar C. Enum é realmente unha característica do C, onde pode enumerar unha chea de constantes e asignar-lles valores automáticos, como un, dous, tres, catro sen ter os números de código duro. Entón SQL soporta o mesmo, en que se ten un campo de base de datos que só quere asumir unha das finita valores, pode, literalmente, especificalo lo como eu fixen alí por catro operadoras de móbiles populares estadounidense. Entón eu fixen iso. E eu fixen unha serie de cambios como así, o máis importante dos cales foi para traballar correo electrónico porque recall, que este programa baseouse en que xeralmente chamado de un correo-e a Pasarela SMS, que é só un xeito elegante de dicir que a Verizon, e AT & T e outras persoas soportar un servidor, polo cal se recibe correo electrónico, el converte a SMS e envía un texto mensaxe ao teléfono de alguén. Entón, se eu fixen iso correctamente, aquí é unha forma nova e mellorada que vai falar con nova e mellorada de código, que pode xogar en liña. E espero facer o meu Campá teléfono en só un momento. Entón, primeiro, eu vou escribir o meu nome. En segundo lugar, eu non vou ao facelo neste momento. Vou facer Inspect Element. E este é só un pouca cousa para que eu non faga crear horas de post-produción traballar como eu fixen a última vez. Existe agora o meu número de teléfono. Vou seleccionar Verizon. E aquí, imos conectar o micrófono aquí, e buscar iso no meu teléfono móbil aquí. Vou prema Register, esperemos que deberá poñelas na base de datos. Agora eu estou indo a ir ao programa de liña de comandos, que recall foi chamado barra dot texto, e cruzar os dedos. Aquí imos nós. [Dings TELÉFONO] [Aplausos] DAVID Malan: Entón, máis divertido do que isso- é divertido, por suposto, se eu chegar a el. Pero é máis divertido, eu penso que, se nós creado un deses momentos de cine onde como algo realmente malo aconteceu no mundo, e como toda a xente da NSA móbiles comezar a apitar con mensaxes de texto alertando-os a este feito. Entón eu penso que ía tentar para recrear o mesmo aquí, en que non está a usar unha base de datos, I en vez de antelación escribiu un programa que se parece con isto. Esta é unha index.php-- e engada este código en liña como bom-- que aparentemente só fai form.php, usando un paradigma de estilo MVC que nós falar con máis detalle no conxunto de problemas Sete. Este formulario é moi sinxelo. Vai someterse a unha ficheiro chamado here.php vía post. E está ao parecer vai pedir por un nome e un número de teléfono, e, a continuación, a través da así-chamada Seleccione o menú, é vai darlle polo menos catro operadoras de móbiles populares dos Estados Unidos, e, a continuación, permitir que efectivamente levar atención premendo aquí. E aquí, mentres tanto, vai prestar algúns dos códigos da última vez. E se só roçar tanto, vai ver que non hai unha morea de verificación de erros. Pero a beleza ao final é que nós non estamos escribindo para unha base de datos actual. Estamos manténdose o simple e só o envío de espera unha mensaxe de texto vía función I escribiu sobre o pasado poucos días chamada Texto, que está en funcións. php, que é de novo dispoñible en liña. Entón, se quere participar desta. Non imos ser almacenar nada. Ir a este URL aquí en tempo real. Non presenta-lo aínda, pero imos ver se podemos ter un destes película momentos en que o móbil de todo o mundo comeza a apitar, espero só xa este ano, a diferenza, en 2011 onde esta deu terrible mal. E xa que vai a ese enderezo, ten que ver unha forma super sinxelo que se ten un nome, un teléfono móbil número, e un vehículo que teléfono corresponda á lista de aí, vai adiante e encher o formulario. Pero non bateu presentar aínda. O formulario está indo ollar coma este. Dalle escribir o seu nome, número de teléfono. Oop, alguén vai á fronte da curva. Está certo. OK, todo o mundo está cuberto o formulario. Isto debería funcionar nun teléfono, tamén, se queres. Todo ben, nas súas marcas, preparar, vai. Bater Aquí. O que? Non. Xuro por Deus, eu proba iso varias veces hoxe. Vostede entendeu? [Interpoñendo voces] DAVID Malan: OK, quizais o erro do usuario. Isto é dous. El traballou por dous en cada unha algúns centenares, tres, catro. OK, iso é bo. Catro de cinco para exactitude como sobre. Entón o que pasou? Así, presume-se, sen ver o pantallas, por que pode ter con erro? É, probablemente, que estabamos só intentando facer moitas conexións ao servidor de correo de Harvard, todo ao xa que desde o mesmo enderezo IP. Estou só adiviñando xa que eu non fixen ten o luxo de probas este código con algúns 300 persoas de antelación pero por agora entender que que, polo menos, debe comezar o traballo feito neste momento. Todo ben, entón por que todo isto é o máis pertinente para o que está pasando? Ben, primeiro, unha rápida par de anuncios. Entón un, se quere unirse Chang, e Nick, e outros no xantar deste venres, facer de RSVP na URL habitual alí. Se está a pensar en se concentrar ou facendo un secundario en CS, se é un estudante de segundo ano, ou calouro, ou mesmo Júnior ou Senior neste momento e aínda pode espremer nos cursos, entender que a escola de enxeñería está recollendo balde Ben e Sorbete de Jerry eo consello este mércores logo da aula en 4:00 no edificio CS Maxwell en Dworkin. Se esta é moi rápido na pantalla, só tes que ir para cs50.harvard.edu para unha enlace ao evento en Facebook onde se pode ver máis detalles. Mentres tanto, eu penso que eu ía corrixir outra cousa que eu gozado o mércores. Acontece que ID de Marcos en Facebook non tiña tres anos. Tiña catro anos. Acontece que tiña máis proba contas do que me lembro. Pero o que este se sentiu como un oportunidade que facer é tirar unha URL como esta. Así, verifícase que o Facebook ten unha API, Application Programming Interface, que é un mecanismo a través do cal pode solicitar datos programaticamente en Facebook e volver máquina información lexibles, e non páxinas web pero só o texto cru, algo chámase JavaScript Object Notation. E, de feito, se eu visitar esta URL, e ampliar, por defecto, este é Marcos publicamente información accesible. E o detalle interesante aquí é só que o seu ID é, de feito, o número de catro, que I entender logo que eu fixen iso. Podes facelo só, se sabe o seu nome de usuario de Facebook, se ten un. Basta escriba-lo enriba alí. E nada diso é privada. Eu só estou facendo iso mesmo no modo de incógnito. Entón eu non estou mesmo logueado. E está a ver que eu aparentemente era o número de usuario 6454 en Facebook, o que non é moi mal estes días. Entón, de calquera forma, tamén vai ver información alí. E o aspecto útil de que é o que pode escribir o seu propio software que dalgún xeito, integra datos como este na súa propia aplicación. Pode que os usuarios para rexistrar na súa páxina web, non usar o seu propio nome de usuario personalizada e contrasinal, pero quizais o seu login do Facebook e obter información mesmo sobre os seus amigos, se aproban tal, ou similar. Así, teña en conta que CS50, tamén, ten algunhas das súas propias APIs, unha para os datos do catálogo curso, algúns dos menús abrazos na cea salóns, todos do edificios e locais no campus, temos unha API para ben que pode consultar de forma semellante e obter datos textual de volta que pode integrar nun PHP ou JavaScript, ou incluso, aínda que menos común, unha C baseada proxecto final. De feito adiante para a final proxecto son algúns marcos. Ten unha mensaxe o outro día. Entenda que a proposta débese esta próxima luns. Non é necesariamente obligatorio, pero precisan recibir os seus compañeiros de ensino aprobación, antes de facer Calquera cambio posteriores. E, a continuación, á cabeza son un número doutros marcos. Entón, para provoca-lo, tamén, con algunhas posibilidades, temos unha morea de estas lámpadas matiz. E algúns de vostedes xa teñen algún destes no seu cuarto do dormitorio tamén. E eles tamén teñen unha API. Así recordar aquelas semanas lámpadas binarios atrás que Dan Bradley e Ansel Duff creou para nós. Eles usaron unha interface de software para esta lámpada, que no momento está conectado á enerxía eléctrica e logo, vía wireless está conectado a unha pequena cousa chamado a Ponte aquí en baixo, como un pequeno propietario router para este dispositivo en particular. Pero resulta que se sei como enviar mensaxes de HTTP, como todos nós facemos agora, Podo enviar unha mensaxe como esta para esta lámpada para liga-lo ou apagado ou facer calquera número de outras operacións sobre el. Teña en conta que non é chegar, non é escribir. Hai outro chamado put. En realidade, hai algunhas outras tales verbos. Pero repare que hai un camiño de alí, reducir API, slash novo colaborador, cortar a luz, cortar unha, barra de estado. Isto é, ao parecer, só o camiño que a empresa, Philips, decidiu que ten que bater cunha solicitude HTTP se quere cambiar o estado da lámpada coa utilización de HTTP 1.1. Logo, teña en conta a liña en branco. E entón, finalmente o que parece ser tipo de unha matriz de algunha sorte, iso de novo vai ser chamado JavaScript Object Notation, é Jason. E o que ve aquí é que hai tres pares de valores clave. Unha clave é chamado. E o seu valor ao parecer será verdade. O brillo é de 128, o que é algún tipo de int. E entón o tempo de transición é cero, o que é aparentemente canto tempo vai necesario para transformar esa cousa. Entón, agora esta lámpada está apagada. Pero, se fago exactamente isto-- deixar me ir a unha folla de fraude pouco que Dan creada en advance-- e eu vou para ir adiante e copiar a orde a seguir. Curl, como algúns de vós podería recollido en CS50 Discutir é unha utilidade como o Telnet, tales que pode simular as solicitudes HTTP, especialmente pon. Podo enviar estes datos, especialmente o que acabamos de viu un momento atrás especialmente para este URL aquí. E despois da onda está indo a tratar con todo cabeceiras necesarios e análise de alí. Entón, todo o que teño que facer é copiar este en unha fiestra de terminal e, a continuación, prema Intro. E a lámpada acéndese. E todo isto é pasando por meu ordenador sen fíos dalgún xeito á ponte, que é, entón, a falar con esta lámpada. Podo facer outra cousa. Podo facer esa cousa vai o vermello, por exemplo. Podo, por exemplo, facer esa cousa de ir verde. Podo facelo ir azul. E teña en conta en cada unha delas casos, todo o que eu estou cambiando é o chamado valor de tonalidade de realmente darlle un pouco de cor. Entón deixe-me pegas en ben. Agora é azul. E pode facer aínda máis chic cousas where-- imos para verde. E eu podería facelo de Claro que co meu propio código. Pero mesmo a propia API soporta as tarefas de funky como este, que agora vai se preocupar nos para os próximos 30 segundos. Entón esta é unha mostra do que pode facer unha API, esta vez envolvendo lámpadas. Teña en conta que CS50 ten unha parella pares de Google de vidro se quere abordar algo ao longo estas liñas, Arduino unos, que son ordenadores minúsculos pequenos, esencialmente, nunha placa de circuíto pequena que pode conectarse fíos e outras cousas e, de feito, para o control seu ambiente de mundo real. E entón hai un par de novos xoguetes que temos. Esta literalmente só chegou a Outro día, por correo, un Myo Armband. E eu penso que é unha forma de vostede animado sobre proxectos que pode usar con este hardware faría ser para xogar este pequeno clip que empregan para burlar persoas que estamos agora a vivir no futuro. [Música tocando] DAVID Malan: Entón, en só unhas semanas, ten Tamén pode ser que legal na feira CS50. Outro dispositivo que ten unha morea de que estamos feliz para prestar para proxectos chámase un controlador de movemento. Este é un dispositivo USB pouco se conecta a un ordenador que permite que interactuar con seu portátil, Mac ou PC, como se tivese como un Xbox Kinect e realmente facer movementos físicos moi como vemos neste visión de futuro. [Música tocando] DAVID Malan: Entón, mesmo se ten ningunha idea de como algo así podería ser posiblemente inventado ou traballo nun nivel de hardware, non importa. Mesmo despois de só uns meses de CS50, e unha comprensión de programación máis xeral, e programación web máis recentemente, e despois tamén APIs, e HTTP, terá acceso vía APIs de software se quero pedir unha delas dispositivos para realmente falar con el e non ten que se preocupar a posta en marcha subxacente detalles, o cal é totalmente consistente coa noción de estratificación unha abstracción que temos ver ao longo do semestre. Así tamén na fin de semana, vin algunhas pezas de novas. Vaia primeiro, ir a seminarios se quere aprender algo máis en calquera número de temas. Consulte o URL alí. E este foi enviado a me por Chang, que sabe, quen está a imprimir o noso exército de elefantes. E foi un titular como segue. Teño pavor da miña nova TV. Por que eu estou con medo de converter este cousa e estaría moito. Entón, nós estamos agora en apuntan no semestre, tamén, onde mesmo se ten a menor de entendemento de como a web funciona e HTTP, e de seguridade, cousas como esta debe comezar a chamar a atención. Pero tamén, vai entender se estas cousas son ou non ameazas reais. Entón eu peguei algúns fragmentos a partir deste artigo aquí. E a historia é a seguinte. Agora son o dono da unha nova televisión intelixente, que promete entregar streaming contidos multimedia, xogos, app, medios sociais e Internet navegación, oh e TV tamén. O único problema é que eu son agora medo de usalo, di o autor. Vostede sería, tamén, se ler a política de privacidade páxina 46 para a TV. A cantidade de datos esta que colecciona é impresionante. El rexistra onde, cando, como e por canto tempo usa a TV. Establece cookies de seguimento, como xa discutir, e beacons deseñado para detectar cando ten determinado contido visto ou unha mensaxe de correo electrónico especial se quere comprobar correo-e no seu televisor. El rexistra as aplicacións que usar, os sitios que visita, e como interactúa co contido, facendo todo o que vía a súa televisión intelixente. Tamén, yet-- creepier esta é a miña addition-- ten un construído en cámara con recoñecemento facial. O obxectivo consiste en ofrecer control por xestos para a TV e permiten que faga o login para personalizado conta co seu rostro. No lado positivo, as imaxes son gardados na TV ao contrario de cargado a un servidor corporativo. No lado negativo, a internet conexión fai que toda a TV vulnerables a hackers que demostraron a capacidade para asumir o control total da máquina. Máis preocupante, como se isto non fose intelixente abondo, é o micrófono. A TV posúe unha voz recurso de recoñecemento que permite aos espectadores controlar a pantalla con comandos de voz. Pero o servizo ven con unha advertencia moi sinistro. Por favor, estea en conta que se as súas palabras faladas inclúen persoal ou outro sensible información, que a información estarán entre os datos capturados e transmitida a un terceiro. Entendeu? Non diga persoais ou confidenciais cousas diante do televisor. Polo tanto, este é, en realidade, de verdade. E é difícil non ver se ir á Best Buy ou similares para televisores nos días de hoxe. Son todos intelixentes de algunha maneira. E eles están recibindo máis intelixente e máis asustado. E eles están simplemente a obtención de datos de formas que falamos de e, a continuación, envialo vía HTTP ou algún outro protocolo para un servidor. Polo tanto, este foi dun artigo de diversión neste sitio en liña aquí, que falou sobre a especial erro ou código equivocado que podemos realmente amarre para discusión da semana pasada. Polo tanto, este título era como segue, a historia pasa aquí, Josh Breckman traballaba para unha empresa que conseguiu un contrato desenvolver unha xestión de contidos sistema, ou CMS como son chamados, para unha moi grande sitio web do goberno. Gran parte do proxecto implica desenvolvemento dun sistema de xestión de contidos para que os funcionarios serían capaz de construír e manter a constante cambio contido para o seu sitio. As cousas correron moi ben para poucos días despois de ir ao vivo. Pero o sexto día, as cousas non correu tan ben. Todo o contido no sitio desaparecera completamente. E todas as páxinas levou ao estándar, por favor entrar na páxina web de contido. Whoops. Josh foi chamado para investigar e notei que unha particularmente problemático enderezo IP externo tivo ir e excluídos todos o contido do sistema. O enderezo IP Non pertenzo para algúns no exterior hackers dobrado en destruír útil información do goberno. El resolveu googlebot.com, Moi propia araña de Google web seguimento. Whoops. Despois dun pouco de investigación e loitando en torno a atopar un backup noncorrupt, Josh atopou o problema. Un usuario tiña copiado e pegado algún contido dun páxina a outra, incluíndo un Edit Hyperlink para modificar o contido da páxina. Normalmente isto non sería un cuestión, xa que un usuario fóra faría necesario escribir un nome e un contrasinal, pero o sistema de autenticación CMS, o sistema de login, non tivo en conta piratería sofisticado técnicas de Google Araña. Whoops. Como se ve, Google A araña non usar cookies, que significa que pode facilmente evitar un cheque para a está rexistrado no set cookie para ser falsa. Tamén non prestar atención a JavaScript, que normalmente solicitar e redireccionar usuarios que non está dentro do sistema. Isto, con todo, seguir cada hyperlink en cada páxina que atopa, incluíndo aqueles con Borrar páxina no título. Whoops. Entón que é o que isto significa en máis termos técnicos, pero moi accesibles? Significa só que en todo o seu sitio web, eles tiñan URL non moi diferente deste que podes ver no conxunto de problemas sete. Teña en conta que no conxunto de problemas de sete ou coñecen en conxunto de problemas de sete que está desafiado, entre outras cousas, para vender accións en nome dos usuarios. Pero a implantación deste recurso por medio de obter a través de hiperlinks no seu usuario interface, probablemente non a idea máis intelixente porque se o sitio é dalgunha forma accesibles, ou por un ser humano quen está premendo en torno ou mercar un bot como Google ou a Spider como son chamados iso é só seguimento web intentando índice a web como un buscador, que podían moi facilmente acadar mediante obter este tipo de URL. E iso é funcionalmente equivalente a, neste caso, venda de todas as accións de Google. Agora, a verdade, é totalmente asinino que o CMS Usado JavaScript e cookies para aplicar o sistema de login e non a facer iso ao lado do servidor, como vostedes fan e ganas en PSet 7-- hai unha login.php file-- sempre, sempre, sempre a seguridade debe ser feito no lado do servidor, non no lado do cliente, xa que, como esta artigo suxire que pode e vostede mesmo ver, nalgún momento, é trivial para un usuario, bo ou malo, para simplemente apagar JavaScript para non falar de cookies. Entón esta é a súa WTF diaria. Hai máis dun, que é só un pouco asustado, entón eu vou falar que se só como unha lección de vida. Sempre que usar unha aplicación chamado como Snapchat ou similares que di que estas fotos só duran cinco segundo, dez segundos, ou outros enfeites. Son efémeras que é absolutamente non é o caso. Como non hai ningunha maneira, dixitalmente, para aplicar algún tipo de vídeo, ou imaxe, ou textual compartir tales que un receptor na outra extrema non pode dalgún xeito gardar os datos. Na forma máis inxenua, alguén podería tomar o seu teléfono. E eles teñen unha segunda xanela 10 mentres mira para algunha presión só tomar algún outro teléfono e fotografala lo, obviamente. Así, pode preservar algo dixitalmente desa forma. Algúns de vostedes saben como tomar screenshots do seu teléfono. En realidade, se non sabe iso, entender que, polo menos, Snapchat, e eu creo que outro aplicacións nos días de hoxe, polo menos dicir se a destinatario ten, de feito, tomado un screenshot da súa imaxe. Pero peor aínda, esta foi a snappening, como alguén acuñou hai pouco, onde algúns 100.000 snaps fora liberado no que se chama un ficheiro torrent en varios sitios, en última instancia. E estes contiñan un grupo enteiro de mensaxes privadas e artigos. Acontece que a maioría delas benigna, polo que non é o que podería esperar. Senón porque a xente tiñan utilizado unha web de terceiros, facer login coa súa Snapchat nome de usuario e contrasinal e, a continuación, gardar todos os seus snaps neste sitio de terceiros. E foi ese terceiro sitio que foi hackeado, que só quería dicir que alguén descubriu como para obter todos os 100.000 máis desas imaxes no seu propio disco duro para compartir posterior. Francamente, aquí tamén, é unha especie de asinino que Snapchat é aplicado de xeito que un terceiro pode clasificar de interceptación os datos e que non está ligada á súa propia aplicación en execución no teléfono. Pero aquí, tamén, entender que estes as cousas non deben incorporarse vostede de sorpresa, ou polo menos non debería ser unha lección de vida aquí. Se desexa que o técnico detalles, vaia á URL alí que está láminas de hoxe. Todo ben, calquera dúbida sobre leccións de vida de hoxe no CS? Desactivar iso. Calquera cousa en todo? Calquera cousa en todo? Eu teño unha morea de xente verificación súa Snapchat ou algo agora. Todo ben, entón SQL, Structured Query Language. Imos acabar con isto. E tamén, aínda que estamos só rabuñando a superficie desta linguaxe, nós imos dar-lle suficiente da lingua baixo a forma de PSet 7 de modo que pode afrontar algúns funcionalidade bastante común. Pero entendo que hai unha parella cousas que non esixen de ti, pero eles están indo a ser importante vir proxectos finais e, por suposto, veñen facendo real sitios con usuarios reais É esta decisión deseño. Acontece que en unha base de datos MySQL, vostede ter acios de opcións como tipo de datos para as columnas e outras cousas, pero tamén ten a elección dun así chamado almacenamento motor para todos os seus datos, o tipo de sistema de ficheiros, se está familiarizado, para todos os seus datos. O formato é en definitiva, almacenados? E o máis común, quizais, foi MyISAM e InnoDB, termos técnicos que se preocupan só na medida en que ten un e non se ten o seguinte recurso. Supoña que ten un pequeno frigorífico dormitorio. E supoña que vostede ea súa compañeiro de cuarto, que comparten este frigorífico, son realmente lle gustaba de leite por exemplo. E este é, de feito, como o historia foi contada a min camiño de volta o día en que eu fixen un curso chamado CS 161 Sistemas Operativos, que semellante explota este tema. Entón tes este frigorífico. Está fóra de leite. E chegar a casa, o seu compañeiro de cuarto de aínda na clase ou calquera outra cousa, e decide vou saír e conseguir un pouco de leite. Entón pecha a neveira, bloqueo cuarto do dormitorio, atravesar a rúa a CVS ou onde queira, e obteña na cola para mercar un pouco de leite. Mentres tanto, o seu compañeiro de cuarto chega na casa de clase, queda en cuarto do dormitorio, abre a neveira, tamén entende ooph, estamos fóra de leite. El ou ela pecha a neveira e, a continuación, pasa para ir a outro CVS, que pasa a ser un Cityblock de distancia das outras CVS na praza, e entra na cola alí para obter un pouco de leite. Agora, por suposto, nalgúns minutos máis tarde, tanto volver, eo peor de todo é posible resultados que pasou. Ten tanto de leite. E realmente non como o leite que moito. Entón, un deles é só vai aceda nalgún punto. Entón agora ten unha cantidade excesiva de leite na neveira, pois todo por que? [Inaudível] DAVID Malan: Si, non fixo dalgún xeito comunicar uns cos outros que estaban a recibir leite. Así, no máis simple dos formas no mundo humano, como pode evitar esa bobada escenario ocorre tal que só acabar con un. Texto-los, si bo. Pero de que outra? Post-it. DAVID Malan: Un Post-it. Calquera forma de comunicación que di ao seu compañeiro de cuarto non ir á neveira para o leite. Eu estou indo a ir encher no meu propio. Entón tes que de algunha maneira para bloquear esta función. Así, podemos facer isso- pudermos tipo de arruinar a historia e converterse nunha historia de CS en que pensar niso como só como un variable, que é o almacenamento de algún valor. E agora, o valor do leite é cero, que non quere que o seu compañeiro de cuarto para inspeccionar esa variable e despois tomar unha decisión si mesmo con base no estado da variable se está no proceso de cambiar o estado desa variable. Polo tanto, unha das liñas de SQL que darlle en PSet especificación 7 é este aquí. E nós non gastar unha enorme cantidade de tempo a falar sobre iso. Pero acontece que, se estás para mercar algunhas accións en CS50 finanzas que xa ten algunhas partes de ti quere ser capaz de facer unha serie de cousas xuntos instantaneamente. Quere ser capaz de efectivamente, en un alto nivel, comprobar todo ben, se eu queira para mercar máis accións de balde, o que penny stock falar na especificación, Quero primeiro cheque cantas accións eu teño. E supoño que é de cinco anos. E supoña que quero compra máis 10, eu, en última instancia quere ter 15 partes de stock. Entón eu teño que facer dúas preguntas. Cal é o estado da variable? Cal é o estado da liña? Cantas accións teño actualmente? Entón quere ir adiante e actualiza-lo. Entón ese é o analóxico para o leite que verifique a liña, e entón quere actualiza-lo porque se quere mercar 10 accións, non quere cambiar a liña a 10, ten quere mudalo para 5 máis de 10 ou, por suposto, 15. Esta liña de código asegura que estas dúas ideas conceptuais pasar xuntos ou non en todos. Ninguén, incluíndo algún outro usuario quen está conectado o mesmo sitio, dalgún xeito pode deter a verificación da liña ea actualización da liña, a seleccionar e actualización se quere. E a sintaxe non é super obvia, pero esta liña, tempo é o que é, Asegura que as dúas operacións comprobar a variable ou comprobar a liña e actualizar a liña ocorrer atomicamente. Oh, aquí imos nós de novo. Mensaxe de texto no meu teléfono móbil. Entón, imos facer deste un pouco máis concreto. Supoña que non está implementación dunha neveira, e non está aplicando PSet 7, pero unha base real, ou un cadro electrónico, un cadro automático Machine, en que dalgún xeito quero ser capaz de capacitar que os usuarios transfiran diñeiro desde unha conta a outra. OK, agarde. Vou silenciar isto agora, grazas. Por iso, queremos mover diñeiro a partir dun número de conta nunha conta diferente número, especialmente de $ 100. Polo tanto, esta é unha especie de arbitrario exemplo, a través do cal, o ATM, Pode querer executar dous SQL consultas, restar dunha conta, e engadir a outra conta. Pero quere garantir que estes dúas liñas, tanto ocorrer ou non en todos. Non quere algo estar detido. Non facer algunha mala cara intelixente dalgún xeito, de pé no Bank of America con dous caixas electrónicos fronte del e dalgunha forma tipo de escritura en comandos á vez, espero intentando deducir 200 dólares, no canto de 100 dólares e ter só 100 dólares créditos. En suma, quere que isto comportan-se exactamente como espera. E o xeito de facer isto en SQL base de datos é vostede envolve-la en que é chamado dunha transacción. Literalmente en SQL, pode chamar de CS50 función de consulta co Cita inicio unquote transacción. Logo, pode realizar calquera número de consultas SQL posteriores, pero ningún deles ter efecto sobre a base de datos ata que chame consulta entre comiñas comprometerse novamente usando PHP. E, deste xeito, pode garantir que mesmo se ten 1.000 usuarios todos bater súa base de datos á vez, o SQL prometer que estes dúas consultas serán implantado un pouco despois do outro. Entón non acabar co exceso de leite ou a cantidade errónea, en última instancia, de diñeiro. Polo tanto, manter isto presente, non tanto para PSet 7 pero para proxectos finais se é realmente intentando mover os datos mediante táboas como pode aquí. Pero quizais aínda máis simple e máis obvia para entender cun exemplo é este aquí. E alguén ten falado sobre iso só o outro día cando viu algo semellante en liña. Entón, para o meu coñecemento, o sistema de Pino non é vulnerable a este ataque. E eu non teño idea se el mesmo os usos a base de datos SQL debaixo do capó. Pero imos usalo para a causa da discusión. Aquí é a pantalla que Persoas tenden Harvard a ver cando efectuar o login co seu Número Harvard ID eo seu PIN. E supoña que o sistema de pinos foron aplicado en PHP e cun MySQL base de datos, o código que alguén anos podería ter escrito atrás pode ter esta aparencia. En primeiro lugar, declare unha chamada variable usuario. E só comezar a partir de o superglobal POST. A continuación, obter outra variable chamado contrasinal e facer o mesmo. E despois é só realizar esta longa consulta aquí, selecciona estrela dos usuarios ONDE nome de usuario é igual a tal e tal eo contrasinal é igual a tal e tal. Teña en conta que o rizado claves usei aquí significa só para PHP, ir adiante e substituto o valor dos dous variables alí mesmo. Eles non son estrictamente necesarios, pero eles tenden a evitar erros de sintaxe sutís. Entón, iso parece completamente correcta a primeira vista. E é. Podería aplicar o sistema de patas deste xeito. Pero supoñamos que un super alumno intelixente e malicioso input este como o seu Pino. Entón eu elimina a bala sinais aquí no Mock-up, e realmente revelado o que el ou ela pode ser de dixitación. E é un pouco raro. Pero o que salta á vista na potencialmente preocupante sobre a entrada do usuario, mesmo se non ten idea do que un ataque de inxección SQL significa. Por que isto parece un pouco sospeitoso? ¿Que é iso? [Inaudível] DAVID Malan: A ou é algo sospeitoso. En realidade, iso é unha contrasinal de SQL. Entón, iso non augura nada bo. O feito de que hai todas esas comiñas simples há-- de feito, un dos máis fácil formas de romper algúns bancos de datos é escribindo un nome como O'Reilly que ten un apóstrofo nel porque se o ser humano que escribiu o código detrás das escenas non ten en conta que hai pode ser comiñas simples nun usuario de entrada, e el ou ela está a usar comiñas simples no seu código, cousas malas poden ocorrer. En realidade, peor aínda, considerar isto. Se esta foi unha vez máis o código que alguén o ano de Harvard atrás escribín á Pino sistema, teña en conta o que se a piques de ser substituído nome de usuario e contrasinal se o usuario inserir novo skroob como o seu nome de usuario e logo, un, dous, tres, catro, cinco, Cita ou entre comiñas un igual citar un. E teña en conta o que é fundamental aquí é o usuario non comezou o seu contrasinal ou Pino cunha cita. E non rematou cunha cita porque el ou ela é asumindo que o programador non era tan acentuada, van ter os comiñas simples no seu código. Entón, aquí está o código. E que a substitución agora pode ocorrer é iso. E eu teño subliñado que o usuario inseriu no. Entón, antes, despois. E teña en conta o que é lixeiramente preocupante agora sobre a metade dereita deste código SQL? É un pouco máis complexo, é certo, que as consultas que xa vimos. Pero iso non pode, posiblemente, ser bo se está dicindo seleccione estrela, que é seleccionar todo da mesa do usuario onde username é igual skroob e contrasinal é igual a un, dous, tres, catro, cinco ou un é igual a un. Cal é a implicación lóxica de que a última cláusula presuntamente? É só sempre é certo. E porque temos unha especie de adiviñar ou descubrir por intento e erro que o programador que escribiu este código non anticipar unha persoa humana ou malo escribindo entre comiñas simples, así como, podemos sintaticamente completar a consulta SQL con algo sen sentido pero algo que é sintaticamente incorrecto que sempre valora a verdade. Polo tanto, se este código está a ser usado para responder a cuestión verdadeira ou falsa debe este usuario permiso para pasar, o resposta é sempre ao parecer vai para ser verdade, porque iso sempre vai para seleccionar algo da base de datos porque un claro, sempre é igual a un. Entón, cal é a solución? Ben en PSet 7, nós realmente evitar todo isto xunto. Dámoslle unha función de consulta, e nós incentivos-lo a usar puntos de interrogación como marcadores de posición, semellante en espírito á de printf% s, pero o que é importante sobre os puntos de interrogación aquí é se realmente ler functions.php, onde a nosa función de consulta é aplicada, estes puntos de interrogación son escapou, en que nada potencialmente perigoso como unha única cita está conectado nunha única cita escapou. Entón, iso é o que é realmente está a suceder, se usar a función de consulta do CS50 ou calquera número de terceiros bibliotecas libres que facer o mesmo. Non importa, neste caso, en verde, se o usuario ten ingresaran nunha única cita porque a consulta función que escribimos é indo para engadir barras invertidas antes calquera cita tan perigosa. Polo tanto, este non é, de realidade, vai ser legal. Isto é como escribir un tolo buscando contrasinal que é, por suposto, non vai ser real contrasinal da skroob. Así, o takeaway para CS50 é un, absolutamente usar algo como función de consulta do CS50 ou a biblioteca subxacente, que pasa a ser chamado de PDO. Pero nunca, nunca, nunca facer un código coma este sen escapar ou esfregar como din os seus insumos. E ti, nalgún momento, probablemente, se atopou con algúns sitio coma este. De feito, parece ser o caso como en aeroportos e hoteis en lugares onde teñen acceso Wi-Fi acceso que ten que acceder para, estes sitios son sempre horriblemente aplicadas. E así, unha especie de desfrute na casa exercicio, non con fins maliciosos ou máis dun desfrute vial exercicio, é só escribir un apóstrofo, comiñas simples, nun formulario nalgún sitio e ver que pasa. E se o servidor traba ou dá vostede algún tipo de mensaxe de erro, pode moi ben ser que alguén non teña previsto iso. E entón ten que alertar o bo autoridades e ir adiante. Entón agora vostedes deben espero entender un pouco máis humor do geek aquí. [Risas] DAVID Malan: Vostede sabe que é un geek. Á seguinte varios anos, vai lembrar mesiñas que Bobby é por mor deste deseño animado aquí. Polo tanto, manter isto presente ao cambio de contexto unha última vez hoxe para JavaScript. Pasamos relativamente pouco tempo sobre a sintaxe do PHP porque é realmente Super semellante a C. E ben o suficiente, JavaScript tamén é super semellante á sintaxe do C así como veremos na só un momento e como nós imos vexa a finais desta semana, en particular. O que podes facer con esta linguaxe, con todo, é aínda máis poderosa, especialmente con APIs. Pero, primeiro, un rápido paseo. Entón, un, en JavaScript, non hai ningunha función principal, que é bo. Igual que PHP, pode só escribir código. Condicións coma este. E expresións booleanas pode coma este ou coma este. Existen interruptores, e pode ter esta aparencia. Catro voltas coma este. Mentres lazos coma este. Fai while coma este. E entón matrices parecido tanto, moi semellante ao PHP. Pero teña en conta, que en JavaScript ten declarar unha variable non cun dólar asinar, non cun tipo de datos, pero, literalmente, dicindo var á variable antes. Tamén é vagamente ingresaran na medida en que ten tipos, pero non declaralo los explicitamente. E entón unha corda, a exemplo, pode parecer así, esta cadea sendo chamado s neste caso. E logo un obxecto. E estes, imos ver máis en pouco tempo. E un obxecto é quizais un dos máis comunmente visto estruturas de datos baseada nun JavaScript programa porque permite asociar arbitraria pares de chaves de valor só como matrices asociativas de PHP e, así como a súa propia táboa hash ou tentar, Implementar unhas semanas atrás. Entón, imos ver o que realmente podemos facer con JavaScript. E, en particular, esta é un rol de características que os navegadores teñen que nos permiten conectar JavaScript nunha web do seguinte xeito. JavaScript é frecuentemente utilizado como un lado do cliente linguaxe de script. Non está feita. Tamén é interpretada. Pero a diferenza de PHP, que foi executado no servidor, o servidor web, ou no fondo do clientes, JavaScript é diferente na medida en que el xeralmente é executado no navegador. Así, calquera código JavaScript que comezar a escribir para PSet 8, ou o seu proxecto final, ou no mundo real vai xeralmente para ser gardado no servidor, absolutamente nun punto ou un punto de HTML JS ao arquivo JavaScript. Pero o navegador vai descargar que Javascript código a súa propia instancia de Chrome, ou IE, ou Firefox, ou o que quere. E o código é realmente comezará executado dentro do seu propio navegador. Só para facer isto máis real, imos ver iso de forma concreta. Nós non temos idea do que este código fai sen realmente ler a través dela. Pero déixeme ir Facebook.com sen iniciar sesión. Déixeme ir Inspect Element e ir, digamos, Rede e volva a páxina. E nós imos see-- déixeme cambiar Recargar o Páxina para obter todas as peticións para o novo. E o primeiro ficheiro que eu vexo é CSS, CSS. Aquí está a primeira JavaScript ficheiro, e eu teño ningunha idea do que isto significa, pero aquí é parte do código JavaScript que impulsa Facebook. Non o é certo que revelando para ampliar. El aínda é tan sen sentido. Pero vai ver, mesmo en baixo, hai aínda máis deses arquivos JavaScript. Whoops. Isto é un ping. Imos descender un pouco aínda máis, aínda máis, aínda máis. Hai un. Hai un. Hai un. Así, aínda que o Facebook, por tras da escenas, está escrito en parte en PHP e versión propia do mesmo de Facebook, hai unha enorme cantidade de JavaScript. En realidade, calquera dos falando que fai no Facebook, calquera das actualizacións en liña programa que ocorrer en tempo real, de que todos é conducido mediante JavaScript. Si? Audiencia: Non estou seguro se este é o Facebook, pero eu penso que Facebook desenvolveu súa propia lingua código in-house? DAVID Malan: Eles fixeron. Entón é por iso que eu digo unha variación de PHP chamado Hip Hop que realmente recursos adicionais para tal que cando Mark aplicado por primeira vez o Facebook, estaba escrito en PHP. E este tipo de tense mantido o tipo de linguaxe front-end que empregan para moito da súa codificación, pero iso non foi unha linguaxe que é escalas particularmente ben a millóns de persoas. E así eles foron engadidos á súa propia melloras nos bastidores. E empregan calquera número doutras linguas para varias pezas de súa infraestrutura. Entón, si, é unha variación de o que hoxe coñecemos como PHP. Entón, imos dar un ollo nun par de exemplos de como podemos usar JavaScript aquí. O código fonte de hoxe, temos un grupo de ficheiros, o primeiro dos cales, imos chamado DON cero. Entón DOM de cero ten a seguinte aparencia. Deixe-me ir a este directorio e abrir domzero.html, o cumio do cal ten un tipo de documento declaración, dicindo que aquí vén HTML 5. E agora aquí está unha etiqueta HTML. Aquí está a etiqueta cabeza. E aquí está o que hai de novo hoxe. Agora temos unha etiqueta script dentro da cabeza da páxina. E iso ao parecer fai moi pouco, pero aviso que teña definido un guión, un JavaScript. E como un aparte, xa que este É un equívoco común, JavaScript non ten absolutamente nada a ver con Java, a linguaxe que algúns de vostedes poden aprenderon na APCS. Era máis un marketing cousa que calquera cousa, montando os coattails de anos Java. Pero JavaScript, nada que ver co Java, só de forma semellante, e irritante, confusamente chamado. Entón aquí está como declarar unha función en JavaScript, literalmente función dicir, logo o nome da función, entón calquera argumentos que podería tomar, así como en PHP. Acontece que en JavaScript, un dos máis funcións irritantes que existen é de alerta. Esta é unha pequena fiestra que aparecerá e alerta-lo a algún anaco de información. É xeralmente desaprovado. Pero nós imos usalo como o noso primeiro exercicio aquí. Teña en conta algunhas características do JavaScript. As comiñas simples e comiñas dobres Realmente non importa máis. Aspas simples e dobres citas poden ser trocados, mentres que en C, tes que usar comiñas para cordas, e ten dúas de solteiro cita para chars. No mundo JavaScript, moitas persoas, a maioría da xente usar comiñas simples arredor de cordas só porque é unha cousa estilística. Pero o que é o operador máis aquí, que nós non vimos antes? Audiencia: concatenação. DAVID Malan: concatenação. Entón C non ten sequera iso. PHP ten o operador punto, que fai iso. JavaScript ten o operador de suma, que confusión é como Java. Agora, o que está pasando aquí? Entón, aquí é onde a base comprensión de que a imaxe xogamos un par días entra en xogo. Teña en conta que, cando tivemos unha simple versión dun HTML página-- el só dixo: Ola mundo. E, entón, deseñou unha árbore á dereita, o que tiña unha morea de rectángulos e liñas conectando os como unha árbore xenealóxica. Entón esta é a chamada DOM ou Document Object Model. E verifícase que podes acceder rectángulos en que árbore con sintaxe como a seguinte. Vostede literalmente dicir documento, que é unha variable global especial nun JavaScript programa que ten unha función asociado a el que pode acceder semellante a un struct, pero simplemente dicir punto e, a continuación, o nome da función, obter elemento de identificación. O elemento que quero chegar é aparentemente citar nome unquote. E entón eu quero comezar o seu valor. Agora estamos quedando por diante de nós mesmos. Eu nin estou seguro do que todo isto é sobre. Imos avanzar rapidamente para o HTML en da páxina, que é super sinxelo. Teña en conta que eu define Unha forma aquí debaixo. Repare que eu dei-lle un único ID, aínda que non usei este atributo antes. Pero iso existe en HTML. Pode identificar exclusivamente algún anaco HTML cun identificador coma este. Observe agora isto-- Acontece HTML apoia, por que rol hai pouco, un todo banda de manipuladores de eventos. E ese manipulador de eventos di en enviar. Sobre a presentación usuario deste formulario, chame o seguinte código. E o código que está pasando a chamarse ou executado é exactamente iso, o grego función seguido de retorno falso. Todo o resto debe ser moi familiar. Aquí é unha entrada do tipo texto, cuxa ID neste caso será nome. Nós non temos un certo atributo de nome este tempo-- e un botón de envío. Así, a páxina resultante se parece con isto. E o comportamento resultante, vai ver, si parece con isto. A páxina aloxa locais di, Ola David, dificilmente un esteticamente agradable forma de cumprimento dun usuario. Pero o que está realmente a suceder? Ben, considerada o que é iso. Este é un campo de texto. E segundo a HTML aquí, eu dei-lle un identificador único chamado Cita nome unquote. Mentres tanto, eu dixen cando o usuario envía o formulario por premer Intro ou facer clic no Subir botón, chamar a función chamada Greet e despois voltar False. Imos considerar aqueles en sentido inverso. Teña en conta que cando eu premer en Enviar, o URL da páxina non cambia. A icona do navegador non comezar a xirar. Non ir a calquera lugar, e iso é literalmente, porque eu dixen que volver False. Retorno curtocircuítos falsa ou paradas o comportamento estándar dun formulario. De xeito que, a continuación, déixanos con esta unha pregunta final. Que Greet facer? Ben, aparentemente Cumprimente chama unha función chamada Aviso, pasa nunha longo argumento de que é o resultado da concatenação xuntos un banda de substrings, Ola espazo coma, entón o que quere que isto volve. Entón documento é como un mundial variable para esta raíz desa árbore, chamar unha función especial, se non, agora coñecido como un método. Unha función que é dentro dunha variable é chamado un método no canto dunha función. Polo tanto, obter elemento por ID. Que elemento ten quero comezar polo seu ID? Citar nome unquote e logo especificamente valorar. Así, noutras palabras, que o código simplemente atopa o campo de texto cuxo ID é o nome e despois recibe o seu valor. Entón, se eu fose para cambiar esta e dicir Davin en lugar de David, e prema en Enviar, agora nós ten un saúdo para Davin. Todo ben, entón todo ben e bo. Pero imos ver se podemos facer esta un pouco máis limpo desde só código escrito, como este é xeralmente será desaprovada. Isto vai ollar máis asustado. Pero o que é o primeiro diferenza que nota aquí nesta versión, ademais do nomear cambiando para DON un? O que parece diferente estruturalmente sobre iso contra o outro? Si? Audiencia: É a forma de parte superior do guión agora? DAVID Malan: Si, o formulario está na parte superior do guión, por algún motivo curioso. Entón esta é a primeira cousa que salta para fóra de min, tamén. E, por sorte, polo menos, esta parte é idéntica. Entón, o único que parece para ser diferente é esta. Entón aquí está o que é puro sobre JavaScript 2. E iso fai que sexa difícil de entender a primeira vista, especialmente para proxectos finais, se está mirando para o código de exemplo en liña, pero todo se reduce a un características sintácticas básicas. Aquí, de novo, é de que documento variable global. Aquí, de novo, é que o método ou función que di obter o elemento por ID. Esta vez quero obter o ID de chamada de demostración. Onde queda iso? Isto é aparentemente seguro aquí, o propio formulario. E agora conta que, ao parecer, se eu recibir de volta ese nó da árbore que representa o xeito en si, non é un campo de texto, verifícase que forma, que nó ou rectángulo da árbore, ten o que chamaremos dunha propiedade, moi, moi, moi semellante en espírito a un struct en C. É só membro de datos dentro deste rectángulo. Entón eu teño o xeito aquí, e eu estou anexando, ou eu estou atribuíndo, a súa en Enviar manipulador ou mellor, en Enviar propiedade a seguinte función. E este é, de lonxe, o máis tolo cousa, ata agora, sintaticamente. Acontece en JavaScript e en PHP e, sinceramente, para que o asunto en C, aínda que non faga iso, pode engadir sen nome, anónimo, ou aka lambda funcións que non teñen un nome pero pode ser chamado aínda así. Entón o que eu estou facendo aquí é que eu estou atribuíndo Por esta Enviar propiedade, que É dentro deste nodo miña árbore DOM, un función, a función de punteiro se quere. Esta función non ten nome, pero que non fai importa, porque imos ver nun momento como chamalo. Cando esta función é chamada, este código é executado, entón false é retornado como antes. Pero teña en conta o que eu fixen. Neste punto o historia, eu teño un formulario. Ten unha identificación única chamada de demostración. Aquí abaixo, eu teño unha etiqueta script que executa o código a continuación. El atribúe a este nodo a árbore é en Enviar propiedade esta función aquí. E, así, por natureza, de como os navegadores funcionan, cando clic agora Enviar ou prema Intro, que a función será pagado. Ela non precisa dun nome, porque quen diaños lle importa o que se chama. A única vez que nunca vai chegar chamado é cando enviar o formulario. Non hai ningunha necesidade para min, o creador humana, realmente chamalo en calquera outro lugar. Agora só como unha provocación, como se iso non foron ocupar dobrar o suficiente, podemos incluso facelo mirar con máis enigmática unha biblioteca super popular chamado jQuery. De feito jQuery e JavaScript son moitas veces confundidos. E o que imos facer o mércores é inicio empregando esta linguaxe e esas bibliotecas para construír cada vez máis asíncrono e aplicacións dinámicas como mapa recibindo aplicacións, aplicacións que actualizar a páxina web en tempo real tempo, moi parecido ao Facebook ou Gchat facer, e non nos limitar a que bate Enviar por un get ou só post só. Entón eu vou te ver o mércores. [Música tocando]