1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> ALTAVOZ 1: Vamos a escribir un programa que para crear una cadena del usuario sin 3 00:00:02,920 --> 00:00:05,700 utilizando el CS50 Biblioteca de funcionar GetString. 4 00:00:05,700 --> 00:00:08,720 Para ello, vamos a seguir adelante y utilizar scanf, la función que el GetString 5 00:00:08,720 --> 00:00:10,950 función utiliza realmente debajo de la capucha. 6 00:00:10,950 --> 00:00:13,780 Pero yo voy a hacer esto deliberadamente de manera buggy. 7 00:00:13,780 --> 00:00:17,230 Yo voy a hacer de una manera que creo sería correcto, pero resulta que 8 00:00:17,230 --> 00:00:19,380 mi suposición de que va a ser muy, muy deficiente. 9 00:00:19,380 --> 00:00:20,800 Y, de hecho, muy peligroso. 10 00:00:20,800 --> 00:00:24,750 Debido a errores como el que yo estoy a punto de hacer que puede ser explotada por los adversarios 11 00:00:24,750 --> 00:00:28,870 de tal manera que su máquina o su programa puede asumir el control potencialmente. 12 00:00:28,870 --> 00:00:30,200 >> Vamos a comenzar de la siguiente manera. 13 00:00:30,200 --> 00:00:33,540 Primero vamos a declarar nuestra cadena, de otro modo conocido ahora como una estrella de char, 14 00:00:33,540 --> 00:00:34,750 y llamar a que s. 15 00:00:34,750 --> 00:00:39,400 Permite siguiente solicita al usuario una cadena, al igual que con "string por favor." Y 16 00:00:39,400 --> 00:00:44,250 ahora vamos a obtener la cadena del usuario usando scanf, entre comillas, "% s". En 17 00:00:44,250 --> 00:00:47,760 Es decir, vamos a informar a scanf que no, de hecho, esperan conseguir una cadena 18 00:00:47,760 --> 00:00:48,630 desde el usuario. 19 00:00:48,630 --> 00:00:50,810 >> Pero ahora tenemos que decirle a scanf una cosa más - 20 00:00:50,810 --> 00:00:53,350 dónde colocar la cadena que el usuario proporciona. 21 00:00:53,350 --> 00:00:57,840 Bueno, yo voy a empezar simplemente con comas s, especificando que me gustaría 22 00:00:57,840 --> 00:00:59,320 scanf para poner la cadena allí. 23 00:00:59,320 --> 00:01:04,818 Estoy al lado va a imprimir algo como "gracias printf para el% s 24 00:01:04,818 --> 00:01:10,670 barra invertida n coma. "Y como siempre, estoy va a pasar en la cadena, s. 25 00:01:10,670 --> 00:01:14,920 Ahora vamos a guardar, compilar y ejecutar este programa, y ​​ver si no podemos inducir 26 00:01:14,920 --> 00:01:16,590 el problema que predijo. 27 00:01:16,590 --> 00:01:18,650 >> Hacer scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Cadena por favor. 30 00:01:21,830 --> 00:01:25,540 Vamos a proporcionar algo como, "hola." "Gracias por la nula". Hmm, eso no es 31 00:01:25,540 --> 00:01:26,750 lo que yo esperaba. 32 00:01:26,750 --> 00:01:28,240 Entonces, ¿qué está pasando aquí? 33 00:01:28,240 --> 00:01:32,040 >> Bueno, resulta que ya declaramos s como una estrella de caracteres pero no lo hicimos 34 00:01:32,040 --> 00:01:36,120 efectivamente almacenada en s la dirección de un pedazo real de memoria, scanf no lo hizo 35 00:01:36,120 --> 00:01:38,940 tener en cualquier lugar de poner la cadena que el usuario escribió pulg 36 00:01:38,940 --> 00:01:42,510 De hecho, si el usuario tuviera que ahora escriba una cadena mucho más larga que "hola" 37 00:01:42,510 --> 00:01:46,780 por ejemplo, varias líneas de texto o varios párrafos de texto, es bastante 38 00:01:46,780 --> 00:01:50,280 posible que podamos inducir una llamado fallo de segmentación. 39 00:01:50,280 --> 00:01:53,570 >> Debido a scanf no va a saber que En realidad no he puesto una dirección 40 00:01:53,570 --> 00:01:54,610 interior de s. 41 00:01:54,610 --> 00:01:58,000 Más bien, se va a ver algún valor s, en un patrón de bits que puede 42 00:01:58,000 --> 00:02:00,910 muy bien ser un valor basura, no sólo por casualidad. 43 00:02:00,910 --> 00:02:04,600 Y scanf todavía va a tratar de escribir la cadena de usuario a esa dirección, 44 00:02:04,600 --> 00:02:08,789 incluso si es un valor de basura, la cual de hecho, podría inducir un choque. 45 00:02:08,789 --> 00:02:10,130 >> Entonces, ¿cómo vamos a arreglar esto? 46 00:02:10,130 --> 00:02:12,523