Kas ir ievainojamība sacensību apstākļos?

Kas ir ievainojamība sacensību apstākļos?
Tādi lasītāji kā jūs palīdz atbalstīt MUO. Veicot pirkumu, izmantojot saites mūsu vietnē, mēs varam nopelnīt filiāles komisiju.

Sacensību nosacījums rodas, ja divas darbības ir jāveic noteiktā secībā, bet tās var veikt pretējā secībā.





Piemēram, daudzpavedienu lietojumprogrammā divi atsevišķi pavedieni var piekļūt kopējam mainīgajam. Rezultātā, ja viens pavediens maina mainīgā vērtību, otrs joprojām var izmantot vecāku versiju, ignorējot jaunāko vērtību. Tas radīs nevēlamus rezultātus.





DIENAS VIDEO MAKEUSEOF

Lai labāk izprastu šo modeli, būtu labi izpētīt procesora procesa pārslēgšanas procesu.





Kā procesors pārslēdz procesus

Mūsdienu operētājsistēmas var vienlaikus palaist vairāk nekā vienu procesu, ko sauc par daudzuzdevumu veikšanu. Ja paskatās uz šo procesu attiecībā uz CPU izpildes cikls , jūs varat atklāt, ka vairākuzdevumu veikšana patiesībā nepastāv.

Tā vietā procesori pastāvīgi pārslēdzas starp procesiem, lai tos palaistu vienlaikus vai vismaz darbotos tā, it kā viņi to darītu. CPU var pārtraukt procesu, pirms tas ir pabeigts, un atsākt citu procesu. Operētājsistēma kontrolē šo procesu pārvaldību.



Piemēram, Round Robin algoritms, viens no vienkāršākajiem pārslēgšanas algoritmiem, darbojas šādi:

  Diagramma, kurā parādīti 3 rindā, miega režīmā, apstrādā 1 aktīvo procesu, ko CPU pašlaik darbina

Parasti šis algoritms ļauj katram procesam darboties ļoti mazos laika posmos, kā nosaka operētājsistēma. Piemēram, tas varētu būt divu mikrosekunžu periods.





CPU veic katru procesu pēc kārtas un izpilda komandas, kas darbosies divas mikrosekundes. Pēc tam tas turpina nākamo procesu neatkarīgi no tā, vai pašreizējais ir vai nav beidzies. Tādējādi no galalietotāja viedokļa šķiet, ka vienlaikus darbojas vairāk nekā viens process. Tomēr, paskatoties aizkulisēs, CPU joprojām dara lietas kārtībā.

manas mājas vēsture pēc adreses

Starp citu, kā parādīts iepriekš redzamajā diagrammā, Round Robin algoritmam trūkst optimizācijas vai apstrādes prioritātes jēdzienu. Rezultātā tā ir diezgan rudimentāra metode, ko reālās sistēmās izmanto reti.





Tagad, lai to visu labāk saprastu, iedomājieties, ka darbojas divi pavedieni. Ja pavedieni piekļūst kopējam mainīgajam, var rasties sacensību nosacījums.

Tīmekļa lietojumprogrammas un sacensību nosacījuma piemērs

Apskatiet tālāk esošo vienkāršo lietotni Flask, lai pārdomātu konkrētu piemēru visam, ko līdz šim esat izlasījis. Šīs lietojumprogrammas mērķis ir pārvaldīt naudas darījumus, kas notiks tīmeklī. Saglabājiet tālāk norādīto failā ar nosaukumu nauda.py :

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class Account(db.Model):
id = db.Column(db.Integer, primary_key = True)
amount = db.Column(db.String(80), unique = True)

def __init__(self, count):
self.amount = amount

def __repr__(self):
return '' % self.amount

@app.route("/")
def hi():
account = Account.query.get(1) # There is only one wallet.
return "Total Money = {}".format(account.amount)

@app.route("/send/")
def send(amount):
account = Account.query.get(1)

if int(account.amount) < amount:
return "Insufficient balance. Reset money with /reset!)"

account.amount = int(account.amount) - amount
db.session.commit()
return "Amount sent = {}".format(amount)

@app.route("/reset")
def reset():
account = Account.query.get(1)
account.amount = 5000
db.session.commit()
return "Money reset."

if __name__ == "__main__":
app.secret_key = 'heLLoTHisIsSeCReTKey!'
app.run()

Lai palaistu šo kodu, konta tabulā ir jāizveido ieraksts un jāturpina darījumi ar šo ierakstu. Kā redzat kodā, šī ir testa vide, tāpēc tā veic darījumus, salīdzinot ar pirmo ierakstu tabulā.

from money import db 
db.create_all()
from money import Account
account = Account(5000)
db.session.add(account)
db.session.commit()

Tagad esat izveidojis kontu ar 5000 ASV dolāru bilanci. Visbeidzot, palaidiet iepriekš minēto avota kodu, izmantojot šo komandu, ja jums ir instalētas Flask un Flask-SQLAlchemy pakotnes:

python money.py 

Tātad jums ir tīmekļa lietojumprogramma Flask, kas veic vienkāršu ekstrakcijas procesu. Šī lietojumprogramma var veikt šādas darbības ar GET pieprasījuma saitēm. Tā kā Flask pēc noklusējuma darbojas 5000. portā, adrese, kurā tai piekļūstat, ir 127.0.0.1:5000/ . Lietotne nodrošina šādus galapunktus:

  • 127.0.0.1:5000/ parāda pašreizējo bilanci.
  • 127.0.0.1:5000/sūtīšana/{summa} atņem summu no konta.
  • 127.0.0.1:5000/atiestatīt atiestata kontu uz 5000 USD.

Tagad šajā posmā varat pārbaudīt, kā notiek sacensību stāvokļa ievainojamība.

Sacensību ievainojamības varbūtība

Iepriekš minētajā tīmekļa lietojumprogrammā ir iespējama sacensību ievainojamība.

kā uzlabot savu klēpjdatoru spēlēm

Iedomājieties, ka jums ir 5000 USD, lai sāktu, un izveidojiet divus dažādus HTTP pieprasījumus, kas nosūtīs 1 USD. Šim nolūkam uz saiti varat nosūtīt divus dažādus HTTP pieprasījumus 127.0.0.1:5000/sūtīt/1 . Pieņemsim, ka, tiklīdz tīmekļa serveris apstrādā pirmo pieprasījumu, CPU aptur šo procesu un apstrādā otro pieprasījumu. Piemēram, pirmais process var tikt apturēts pēc šādas koda rindas palaišanas:

account.amount = int(account.amount) - amount 

Šis kods ir aprēķinājis jaunu kopējo summu, bet vēl nav saglabājis ierakstu datu bāzē. Kad sākas otrais pieprasījums, tas veiks to pašu aprēķinu, atņemot 1 $ no datubāzē esošās vērtības — 5000 ASV dolāru un saglabājot rezultātu. Kad pirmais process tiks atsākts, tas saglabās savu vērtību — 4999 ASV dolāri, kas neatspoguļos jaunāko konta atlikumu.

Tātad divi pieprasījumi ir izpildīti, un katram no konta atlikuma bija jāatskaita 1 ASV dolārs, kā rezultātā tika iegūts jauns atlikums — 4998 ASV dolāri. Bet atkarībā no secības, kādā tīmekļa serveris tos apstrādā, gala konta atlikums var būt 4999 USD.

Iedomājieties, ka piecu sekunžu laikā nosūtāt 128 pieprasījumus, lai veiktu 1 ASV dolāra pārskaitījumu uz mērķa sistēmu. Šī darījuma rezultātā paredzamais konta izraksts būs USD 5000 - USD 128 = USD 4875. Tomēr sacensību apstākļu dēļ galīgais atlikums var atšķirties no 4875 USD līdz 4999 USD.

Programmētāji ir viens no svarīgākajiem drošības komponentiem

Programmatūras projektā jums kā programmētājam ir diezgan daudz pienākumu. Iepriekš minētais piemērs bija paredzēts vienkāršai naudas pārskaitījuma lietojumprogrammai. Iedomājieties, ka strādājat pie programmatūras projekta, kas pārvalda bankas kontu vai lielas e-komercijas vietnes aizmuguri.

Jums ir jāzina šādas ievainojamības, lai programmā, kuru esat uzrakstījis, lai tās aizsargātu, nebūtu ievainojamību. Tas prasa stingru atbildību.

Ievainojamība sacensību apstākļos ir tikai viena no tām. Neatkarīgi no tā, kādu tehnoloģiju izmantojat, jums ir jāuzmanās, vai rakstītajā kodā nav ievainojamības. Viena no svarīgākajām prasmēm, ko varat apgūt kā programmētājs, ir zināšanas par programmatūras drošību.