>> ALTAVEU 1: Anem a escriure un programa que per crear una cadena de l'usuari sense
utilitzant el CS50 Biblioteca d' funcionar GetString.
Per a això, seguirem endavant i utilitzar scanf, la funció que el GetString
funció utilitza realment sota de la caputxa.
Però jo vaig a fer això deliberadament de manera buggy.
Jo faré d'una manera que crec seria correcte, però resulta que
la meva suposició que va a ser molt, molt deficient.
I, de fet, molt perillós.
A causa de errors com el que jo estic a punt de fer que pot ser explotada pels adversaris
de tal manera que la seva màquina o el seu programa pot assumir el control potencialment.
>> Anem a començar de la següent manera.
Primer anem a declarar la nostra cadena, d'una altra manera conegut ara com una estrella de char,
i trucar a que s.
Permet següent sol · licita a l'usuari una cadena, igual que amb "string si us plau." I
ara anem a obtenir la cadena de l'usuari usant scanf, entre cometes, "% s". En
És a dir, anem a informar scanf que no, de fet, esperen aconseguir una cadena
des de l'usuari.
>> Però ara hem de dir-li a scanf una cosa més -
on col · locar la cadena que l'usuari proporciona.
Bé, jo vaig a començar simplement amb comes s, especificant que m'agradaria
scanf per posar la cadena allà.
Estic al costat d'imprimir alguna cosa com "gràcies printf per al% s
barra invertida n coma. "I com sempre, estic passarà a la cadena, s.
Ara anem a guardar, compilar i executar aquest programa, i veure si no podem induir
el problema que va predir.
>> Fer scanf-1.
./scanf-1.
Cadena per favor.
Anem a proporcionar alguna cosa com, "hola." "Gràcies per la nul · la". Hmm, això no és
el que jo esperava.
Llavors, què està passant aquí?
>> Bé, resulta que ja vam declarar s com una estrella de caràcters però no ho vam fer
efectivament emmagatzemada en si la direcció d'un tros real de memòria, scanf no ho va fer
tenir en qualsevol lloc de posar la cadena que l'usuari va escriure polz
De fet, si l'usuari hagués de ara escrigui una cadena molt més llarga que "hola"
per exemple, diverses línies de text o diversos paràgrafs de text, és bastant
possible que puguem induir una anomenat error de segmentació.
>> A causa de scanf no sabrà que En realitat no he posat una adreça
interior de s.
Més aviat, es va a veure algun valor s, en un patró de bits que pot
molt bé ser un valor escombraries, no només per casualitat.
I scanf encara va a tractar d'escriure la cadena d'usuari a aquesta direcció,
fins i tot si és un valor d'escombraries, la qual de fet, podria induir un xoc.
>> Llavors, com anem a arreglar això?