«If» сөзі қаншалықты қауіпсіз?

Тілге қарамастан, мен if арқылы қауіпсіздік тұжырымдамасын әрдайым таң қалдырып жүрмін. Мен жазатын барлық код if операторымен бір жолдың сәттілігіне сүйенеді:

user = getUserName();
password = getPassword();

if (match(user, password)) {
    print secret information;
}

Себебі бұл тек бір сызық, мен саботаж сияқты қарапайым болуы мүмкін. Мен нәрселерді қарап шықтым ба, әлде бір if бұны істеудің ең жақсы жолы?

2
@Mikhail ok мен итеремін.
қосылды автор rook, көзі
Мен секьюрликтің негіздерін түсінемін деп ойламаймын. Шындығында, бұл шын мәнінде қиындықтар емес, балшық пен раковиналардың проблемасы.
қосылды автор rook, көзі
@Rook, сізге айта көп айтатын сияқты ... нақты жауап беру керек пе?
қосылды автор Mikhail, көзі
@svick, бұл жағдайда сіз менің сұрағым дұрыс екендігіне келісесіз.
қосылды автор Mikhail, көзі
GolezTrol-тың атап өткеніндей, кодпен пайдаланылатын деректерді кодтың өзіне кірмей-ақ басқаруға болады. Веб-мысалдарға SQL инжекциясы немесе жаһандық айнымалылар кіреді
қосылды автор Mikhail, көзі
@svick, сіз өзіңіздің жинақ шотыңыздың if операторымен бір жолмен қорғалған деп ойлайсыз ба?
қосылды автор Mikhail, көзі
Жоқ, мен сыртынан шабуыл туралы сұраймын.
қосылды автор Mikhail, көзі
@ Михаил, менің жинақ шотым бір жолмен қорғалмайды, бірақ қауіпсіздікті жақсы түсінетін және тиісті кодты қарайтын адамдар тобы.
қосылды автор svick, көзі
@GolezTrol, сіздің компьютеріңіздегі кез-келген қосымшаны іске қосқаныңыздан басқа сізде коды бар. Бұл тілде жазылған емес, бірақ жинақ (немесе CIL, Java байт код, ...) код болып табылады.
қосылды автор svick, көзі
Және шабуылдаушы сіздің кодынызға қол жеткізбестен қалай шабуыл жасай алады?
қосылды автор svick, көзі
@svick Бұл үшін сізге код қажет емес. Тіркеу кілтінсіз орнатуға болатын жарылған бағдарламалық жасақтама туралы естіген шығарсыз? Міне осылай жасалды. Ешкімде осы бағдарламалық жасақтаманың нақты коды болмады.
қосылды автор GolezTrol, көзі
Менің ойымша, сіз өзіңіздің сұрағыңызда нақты болуы керек. Егер шабуылдаушы бастапқы кодты немесе құрастырылған кодқа қол жеткізе алмаса, онда бұл мәлімдеме «қауіпсіз» болып табылады. Шабуылдаушы жасырын ақпаратқа қол жеткізе алатын жағдайлар үшін (мысалы, құпия ақпаратты қамтитын құрастырылған өтініш болса), онда, әрине, егер қауіпсіздік ережесі қауіпсіз болмаса. Ол жай ғана if операторын айналып өту үшін құрастырылған қолданбаны басқара алады. Мұндай жағдайда сіз ақпаратты шифрлауды қаласаңыз болады.
қосылды автор Anders Forsgren, көзі
Мен @svick сияқты бірдей үмітке ие бола аламын, бірақ, ақыр соңында, SSL және шифрлаудан кейін, мен зақымданған шабуылдаушыларға шабуылдау үшін шабу мен хешинг пен тұзды құртып, құрбандыққа шалдығудан кейін мен де таң қалмаймын, if сөзі арқылы берілген немесе қолданылмайды және бұл сарапшылар барлық нәрсені қауіпсіз деп санайды. if - сіз gotta </​​i> тармағының қандай да бір түрде анықтамасы бойынша арнайы ештеңе жоқ деп ойлаймын, код>, полиморфизм, тіпті ақылды жанама секіріс. Шешімнің өзі (шарты) манипуляциялануы мүмкін бе?
қосылды автор delnan, көзі
«Саботаж»? Егер шабуылдаушы бастапқы кодқа жазуға рұқсат берсе, сіз кез-келген жағдайда бұрылып қойғансыз. Сонымен қатар, балама қандай болады? Бүкіл логиканы шабуылдаушы және ұстаушы оны біле алмайтындығы соншалықты мұқият болды. Сонда да кез-келген елеулі шабуылдаушы кез-келген қиындықтар мен күрделі қауіпсіздік схемалары арқылы жұмыс істейді - тек музыка, фильмдер, бейне ойындар және т.б. қарақшылықты қараңыз.
қосылды автор delnan, көзі

7 жауаптар

Сіз дұрыс, if сияқты бұл оңай бұзылған. Егер осы бағдарламаны кері жобалаушы болса, егер өткізіп жіберу үшін бірнеше нұсқауларды оңай өзгертуге болады.

Әр түрлі нұсқалар бар, мысалы, орындалатындарды мұқият қарастыру немесе күрделі тексерулерді қосу және оларды қолданбаңыздағы түрлі орындарға қосу. Бірақ сіз не істесеңіз де, сіздің қолданыңыз әрқашан бұзылуы мүмкін.

Ең жақсы нәрсе - бұл туралы алаңдамау. Сіздің өтінішіңіз соншалықты жақсы және кең және кең қолданылып, адамдар оны бұзу үшін күш жұмсамақ болған кезде сіз оны жақсы қорғау үшін жеткілікті қаражат табасыз. Сол уақытқа дейін бұл туралы ойлануға уақыт кетеді.

4
қосылды
Жуықтаушы жауап. +1 және арқадағы пат
қосылды автор Mikhail, көзі

Идеяға қатысты бір нәрсе бар, ол жиі назардан тыс қалады. Бұл уақытты шабуыл деп аталады. Сізде ДБ-да сақталатын парольмен тікелей сәйкестендіруге негізделген салыстыруды жасайтын веб-қосымшасы бар деп ойлайсыз (иә, менің ойымша, ешкім ДБ-да құпия сөздерді сақтамайды, бірақ Cheshire Cat ретінде, біз Мұнда»). Сосын салыстыру рәсімі құпия сөздердің бірінші таңбаға, екіншісіне немесе соңғы нұсқаға сәйкес келмейтініне байланысты әр түрлі уақытты алады. Уақыт айырмашылығы кішкене болып көрінсе де, шабуылдаушы жергілікті талдауды емес, тіпті интернет арқылы парольді табуға тырысады. Уақыттық шабуыл мен сипатталғаннан гөрі әлдеқайда күрделі, бірақ тұтастай ИФ салыстыру 100% қауіпсіз емес, кем дегенде барлық жағдайда болмайды.

2
қосылды
@ Михаил кідірісі кездейсоқ болуы керек. Тұрақты кешіктіру мұндай шабуылдарға қарсы тұру үшін қауіпсіздікті қамтамасыз етпейді. Уақыттың X орнына X + 4000 ғана ие боласыз.
қосылды автор Eugene Mayevski 'Allied Bi, көзі
@Mikhail Мен ойлағаннан гөрі, ол қолдануға болатын деп қорқамын. И. бұл теориялық ғана емес.
қосылды автор Eugene Mayevski 'Allied Bi, көзі
Мен түсінемін :) Мен бүгін оны қолдануға болатын жағдайларды елестетіп көрдім. Серверде пайдаланушы/өтетін сәйкес келмейтін болса, мен 4 секундтық кідірісті шығарамын
қосылды автор Mikhail, көзі
Ешқашан ойланбадыңыз :) Шындығында ешқандай жерде қолданылмаймын, бірақ мен қалтада болуы мүмкін керемет амал
қосылды автор Mikhail, көзі

Егер сөзбе-сөз мүлдем қауіпсіз болса және ешқашан осалдықтың себебі бола алмайды. Зиянды кодтар сіздің кодыңыздағы барлық нәрселерден туындайды.

Сіз пайдаланып отырған салыстыру операторы дұрыс емес болуы мүмкін. Мысалы, == операторы ықтимал мәндердің диапазоны қабылданады. Бұл құпиялылық үшін жақсы болмауы мүмкін, бірақ оның үлгісі жақсы болуы мүмкін, бұл құпия сөз үшін маңызды емес. Қарапайым $ password == $ _ GET ['password'] дұрыс жұмыс істеуі керек.

Егер сіздің мәлімдемеңіз, мысалы, қате қалыпты өрнектің негізінде болуы мүмкін

if(preg_match('/(.+)\\.js/'.$_GET['file'])){
    readfile($_GET['file']);
}

Бұл жағдайда regex жолда кез келген жерде .js іздейді, оны соңында орындамайды.

?file=../../.js/../../../../../../../etc/passwd

(Және бұл осалдығы Mozilla қате бағдарламасы бағдарламасы бойынша маған 3000 доллар жеңіп алды;)

2
қосылды
Мен осы түрді еске аламын. Мен хэштерді пайдаланып оларды айналып өтемін немесе php-тың нақты жол . Дегенмен де рахмет
қосылды автор Mikhail, көзі

Егер нақты жағдайда «жасырын ақпаратты басып шығару» арқылы жасырын ақпаратты шығаруды рұқсатсыз адамдардан қорқатын болсаңыз сіз «құпия ақпаратты» құпия сөзбен шифрласаңыз болады. Бұл дұрыс құпия сөзді бере алатын адамның тек құпия ақпаратты көре алатынына кепілдік береді.

2
қосылды
+1 болса, ол if күшіне қатысты менің нақты алаңдаушылықты анықтады
қосылды автор Mikhail, көзі

Егер бұл сервер коды болса - бұл сіздің серверіңіздің қауіпсіздігін сақтаған жағдайда бұл мәселе емес.

Егер бұл клиент коды болса - сіз дұрыссыз. Біреу сіздің кодын басқара алады - екілік файлды немесе жадты бейнені (жүктелгеннен кейін). Дегенмен, бұл кез-келген клиенттік қосымшаға қатысты. Сіз оны қиындатуға болады ( PECompact сияқты құралдарды пайдалану арқылы Мысалға қарсы плагині ), бірақ сіз өте күшті қауіпсіздікке қол жеткізе алмайсыз.

1
қосылды
Бұл құралдар туралы естімесіз. Рахмет
қосылды автор Mikhail, көзі

if ішіндегі бір жолға қауіпті ештеңе жоқ.

Егер сіздің серверіңізде код жұмыс істеп тұрса, онда бұл сервердің қаншалықты қауіпсіз екендігі маңызды. Егер хакердің оған кіру мүмкіндігі болса, сіздің кодының қиындығы маңызды емес, ол оны айналып өтуі мүмкін.

Сол сияқты, сіздің кодыңыз ықтимал шабуылдаушы компьютерде жұмыс істейтін болса (қорғайтын компьютер ойындары сияқты), шабуылдаушыны тоқтату үшін ештеңе жасай алмайсыз. Сіз оның жұмысын біршама қиындата аласыз, бірақ бұл бәрі.

Сіз бір сызықтың қауіпсіздігі туралы емес, жалпы жүйе туралы алаңдамаңыз. Егер сіз кодты күрделі етіп жасасаңыз, сіз жасаған барлық қателерді әлдеқайда көп енгізе аласыз. Неғұрлым күрделі кодты пайдалану - бұл жұмыс істемейтін, жасырындық арқылы қауіпсіздікке әрекет ету.

Егер қарапайым егер дұрыс орындалу үшін компьютеріңізге сене алмасаңыз, оны мүлде сенуге болмайды.

0
қосылды

Мен сіздің сұрағыңызды түсінетініне сенімді емеспін.

Бағдарламалық қамтамасыз етудің қауіпсіздігін қамтамасыз ету әдістері жетілмеген және AFAIK олар компиляторда бірнеше қателерді алдын ала болжайды және «керемет» аппараттық құрал (яғни, процессор машина кодын дұрыс түсіндіреді).

Жетілдірілмеген жабдықтарға қатысты әдістермен таныстым (бірақ мүдделі емеспін) (аппараттық қателіктерді анықтау үшін, мысалы, ECC, артықшылықты немесе басқа әдістерді қолдану арқылы курс).

0
қосылды