AMcoder - javascript, python, java, html, php, sql

Սկաների անվտանգության ընթերցում Օգտատիրոջ մուտքագրում

Ես չկարողացա գտնել անվտանգության կամ դրա բացակայության լավ ամփոփում, երբ օգտագործում եմ Սկաներ հատկապես օգտատիրոջ մուտքագրում խնդրելիս (ի տարբերություն տեքստային ֆայլից կարդալու): Ես գիտեմ, որ C-ում շատ վտանգներ կան օգտատերերի մուտքագրումը կարդալիս, և մենք անընդհատ պետք է զգոն լինենք այնպիսի բաների դեմ, ինչպիսիք են Buffer Overflows-ը:

Մի անգամ ես խոսեցի մեկի հետ, ով ասաց, որ նրանք հեշտությամբ կարող են կոտրել իմ ծրագիրը, եթե ես օգտագործեի Scanner դասը: Այդ պահին ես նրան շատ չսեղմեցի դրա վրա, բայց դա ինձ ստիպեց մտածել. որքա՞ն պաշտպանություն պետք է ներդնեմ օգտատիրոջ մուտքագրումը կարդալիս (Տողեր, ներդիրներ և այլն):

Նա նկատի ուներ հարձակումների տեսակների մի քանի օրինակ. մուտքագրումը չափազանց երկար է, որպեսզի String-ը իրականում պահի (ավելի քան ~2 միլիարդ նիշ և առանց \n), այդպիսով բացառություն առաջացնելով: Թվային արժեքների մուտքագրում, եթե անուն եք խնդրում: Միգուցե նույնիսկ կոտրել սկաները և ստիպել նրան անորոշ վարքագծի ավելի բարդ ձևերով:

Ես մտածում էի սրանից պաշտպանվելու եղանակներից մեկը՝ փորձելով Scanner.nextLine()-ի շուրջը՝ պաշտպանվելու չափազանց երկար մուտքագրումից, կամ գուցե նույնիսկ կարդալով նիշ առ նիշ և համոզվել, որ այն համապատասխանում է ինձ անհրաժեշտին (չնայած ես պարզեցի: hasNext()-ը իրականում չի աշխատում օգտվողի մուտքագրման համար, միայն ֆայլի ընթերցում):

Այն, ինչ ես իսկապես հարցնում եմ, հետևյալն է. ո՞րն է պաշտպանվելու լավագույն միջոցը որևէ մեկից, որը նպատակաուղղված փորձում է կոտրել ձեր Սկաները և առաջացնել Բացառություն կամ «չսահմանված վարքագիծ»: Արդյո՞ք սկաները իսկապես լավագույն գործիքն է դրա համար: Կա՞ն արդյոք այլ դասեր, որոնք դուք նախընտրում եք չարամիտ մարդկանց հիշելիս:

24.07.2019

  • Դուք չեք կարող վերահսկել, թե ինչ է օգտատերը մտնում, բայց ինչո՞ւ եք կարծում, որ խնդիր կա Scanner դասի հետ: Խնդրում ենք խմբագրել ձեր հարցը, որպեսզի ներառի մուտքագրման օրինակ, որը խնդիր է Scanner դասի հետ: 27.07.2019
  • Իհարկե, Scanner-ը բացառություններ կանի, եթե հանդիպի անսպասելի մուտքագրման. էլ ի՞նչ պետք է անի, երբ զանգ կատարվի nextInt()-ին և օգտագործողը մուտքագրի «blah»: Ձեր պարտականությունն է համոզվել, որ դուք նրբագեղորեն վարվում եք այն սխալների հետ, որոնք ակնկալվում է, որ տեղի կունենան ձեր դիմումում (անվավեր մուտքագրում. «blah») կամ նրբորեն դուրս եկեք և տեղեկացնեք օգտվողին, երբ սխալն անսպասելի է: Ծրագրի խափանումը (սովորաբար) անվտանգության խնդիր չէ: Յուրաքանչյուր ծրագրակազմ ժամանակ առ ժամանակ խափանում է: 27.07.2019
  • Scanner-ը նույնքան անվտանգ է, որքան Java-ի ողջ էկոհամակարգը. այն հավանաբար դեռևս չբացահայտված անվտանգության խնդիրներ ունի, ինչպես տիեզերքի ցանկացած այլ ծրագրակազմ: Բայց դրա հետևում կան նաև հսկայական թվով մարդիկ, որոնք ուղղում են հաղորդված սխալները և կատարում անվտանգության թեստավորում: 27.07.2019
  • Մյուս կողմից, օգտագործողի տվյալների հետ աշխատելը բոլորովին այլ գազան է: Բայց ես վստահ չեմ, որ դուք հարցրել եք այդ մասին: 27.07.2019
  • Վերադառնալ անվտանգությանը. շատ քիչ հավանական է, որ ձեր գործընկերը Scanner-ի հետ չբացահայտված անվտանգության խնդիր է հայտնաբերել: Բայց եթե դա այդպես է, նա պետք է զեկուցի այդ մասին: 27.07.2019

Պատասխանները:


1

Կներեք իմ անգլերենի համար: Ես ուղղակի ուզում եմ օգնել :)

Կարծում եմ, try-catch-ը կլուծի ձեր բոլոր խնդիրները: Բոլորը փորձեք, կարծես ավելի քան 2 միլիարդ նիշերը կբռնվեն: Ոչ մի խնդիր. վայ

Բայց, կան այլ տարբերակներ. Դուք կարող եք օգտագործել FileReader կամ FileInputStream: Ահա օրինակ.

try{//Use FileReader 
    File file = new File("text.txt");
    FileReader file_reader = new FileReader(file);
    int cur = 0;
    while((cur = file_reader.read()) != -1){
        System.out.print((char)cur);
    }
    file_reader.close();
}catch (Exception e) {e.getStackTrace();}

Եվ

try {//Use FileInputStream
    String filePath = "text.txt";
    FileInputStream fileStream =  new FileInputStream( filePath );
    byte[ ] readBuffer = new byte[fileStream.available()];
    while (fileStream.read( readBuffer ) != -1){
        System.out.println(new String(readBuffer));
    }
    fileStream.close();
} catch (Exception e) {e.getStackTrace();}

Չգիտեմ, թե որ ճանապարհն է հիանալի պաշտպանության համար: Բայց ես գիտեմ, որ FileInputStream-ի օգտագործումը լավ է: դա ավելի արագ է:

Ցտեսություն։ Հուսով եմ, որ այս պատասխանը վատ չէ: :)

25.07.2019
  • Առաջին օրինակը պարունակում է տառասխալ: Երկրորդ օրինակը չի աշխատում: 25.07.2019
  • Բարև օգտվող207421: Շնորհակալություն մեկնաբանության համար: Ես նորից ստուգում եմ երկրորդը, և այն աշխատում է: վայ Ես չգիտեմ, թե ինչու այն չի աշխատում ձեր համակարգչում: ներողություն. և, խնդրում եմ, սովորեցրեք ինձ, թե որտեղ է տառասխալը: և կներեք սարսափելի անգլերենի համար :) 25.07.2019
  • Կներեք, պատասխանն օգտակար չէ: Ես մասնավորապես ասացի, որ հարցնում եմ օգտագործողի մուտքը վահանակում կարդալու մասին, այլ ոչ թե ֆայլից կարդալու մասին: Ես կողմ եմ քվեարկել ձեր պատասխանին, այնուամենայնիվ, հանել -1-ը: 27.07.2019
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..