All language subtitles for 018 Security Best Practices_Downloadly.ir_en

af Afrikaans
ak Akan
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bem Bemba
bn Bengali
bh Bihari
bs Bosnian
br Breton
bg Bulgarian
km Cambodian
ca Catalan
ceb Cebuano
chr Cherokee
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
ee Ewe
fo Faroese
tl Filipino
fi Finnish
fr French
fy Frisian
gaa Ga
gl Galician
ka Georgian
de German
el Greek
gn Guarani
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ia Interlingua
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
rw Kinyarwanda
rn Kirundi
kg Kongo
ko Korean
kri Krio (Sierra Leone)
ku Kurdish
ckb Kurdish (Soranî)
ky Kyrgyz
lo Laothian
la Latin
lv Latvian
ln Lingala
lt Lithuanian
loz Lozi
lg Luganda
ach Luo
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mfe Mauritian Creole
mo Moldavian
mn Mongolian
my Myanmar (Burmese)
sr-ME Montenegrin
ne Nepali
pcm Nigerian Pidgin
nso Northern Sotho
no Norwegian
nn Norwegian (Nynorsk)
oc Occitan
or Oriya
om Oromo
ps Pashto
fa Persian Download
pl Polish
pt-BR Portuguese (Brazil)
pt Portuguese (Portugal)
pa Punjabi
qu Quechua
ro Romanian
rm Romansh
nyn Runyakitara
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
sh Serbo-Croatian
st Sesotho
tn Setswana
crs Seychellois Creole
sn Shona
sd Sindhi
si Sinhalese
sk Slovak
sl Slovenian
so Somali
es Spanish
es-419 Spanish (Latin American)
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
tt Tatar
te Telugu
th Thai
ti Tigrinya
to Tonga
lua Tshiluba
tum Tumbuka
tr Turkish
tk Turkmen
tw Twi
ug Uighur
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
wo Wolof
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:01,300 --> 00:00:04,156 So, everything that we did in this section so far 2 00:00:04,156 --> 00:00:06,514 was to secure all application 3 00:00:06,514 --> 00:00:10,320 and our users' data as good as possible. 4 00:00:10,320 --> 00:00:12,290 And I talked about a lot of things 5 00:00:12,290 --> 00:00:14,170 we can do to achieve that. 6 00:00:14,170 --> 00:00:16,430 But all of this information was kind of 7 00:00:16,430 --> 00:00:18,860 spread out all over these lectures. 8 00:00:18,860 --> 00:00:21,311 So I decided to create this quick summary 9 00:00:21,311 --> 00:00:24,717 with many best practices that we already implemented 10 00:00:24,717 --> 00:00:26,960 and that we're still gonna implement 11 00:00:26,960 --> 00:00:28,860 in the rest of this section. 12 00:00:28,860 --> 00:00:32,100 Because security is so extremely important, 13 00:00:32,100 --> 00:00:36,010 but unfortunately, many courses don't address it enough. 14 00:00:36,010 --> 00:00:37,490 Now, I'm also not turning this 15 00:00:37,490 --> 00:00:40,660 Node.js course into a security course. 16 00:00:40,660 --> 00:00:44,170 There are better courses and experts for that. 17 00:00:44,170 --> 00:00:46,490 But I will show you a couple of things that 18 00:00:46,490 --> 00:00:51,490 you can do to properly secure your applications and data. 19 00:00:51,650 --> 00:00:54,200 And I'm gonna look at a couple of common attacks 20 00:00:54,200 --> 00:00:57,010 and give some suggestions to prevent them. 21 00:00:57,010 --> 00:01:00,780 And first up, we have the event of a compromised database, 22 00:01:00,780 --> 00:01:04,980 meaning that an attacker gained access to our database. 23 00:01:04,980 --> 00:01:07,970 Of course, this is an extremely severe problem, 24 00:01:07,970 --> 00:01:10,430 but to prevent even bigger problems, 25 00:01:10,430 --> 00:01:14,550 we must always encrypt passwords and password reset tokens 26 00:01:14,550 --> 00:01:17,660 just like we did in the videos in this section. 27 00:01:17,660 --> 00:01:19,800 This way, the attacker can't at least 28 00:01:19,800 --> 00:01:24,320 steal our users' passwords and also can't reset them. 29 00:01:24,320 --> 00:01:26,720 Now, about actually preventing attacks, 30 00:01:26,720 --> 00:01:29,110 let's talk about the brute force attack 31 00:01:29,110 --> 00:01:32,290 where the attacker basically tries to guess a password 32 00:01:32,290 --> 00:01:35,660 by trying millions and millions of random passwords 33 00:01:35,660 --> 00:01:37,850 until they find the right one. 34 00:01:37,850 --> 00:01:42,160 And what we can do is to make the login request really slow. 35 00:01:42,160 --> 00:01:44,586 And the bcrypt package that we're using 36 00:01:44,586 --> 00:01:47,020 actually does just that. 37 00:01:47,020 --> 00:01:50,180 Another strategy is to implement rate limiting, 38 00:01:50,180 --> 00:01:52,340 which limits the number of requests 39 00:01:52,340 --> 00:01:54,640 coming from one single IP. 40 00:01:54,640 --> 00:01:56,330 And this one we're gonna implement 41 00:01:56,330 --> 00:01:58,460 in one of the next videos. 42 00:01:58,460 --> 00:02:01,690 Also, a nice strategy is to actually implement 43 00:02:01,690 --> 00:02:05,470 a maximum number of login attempts for each user. 44 00:02:05,470 --> 00:02:07,660 For example, we could make it so that 45 00:02:07,660 --> 00:02:10,539 after 10 failed attempts, user would have to 46 00:02:10,539 --> 00:02:14,020 wait one hour until he can try again. 47 00:02:14,020 --> 00:02:16,360 Now, I'm not going to implement this functionality 48 00:02:16,360 --> 00:02:18,760 in this section, but please feel free 49 00:02:18,760 --> 00:02:21,340 to experiment with it on your own. 50 00:02:21,340 --> 00:02:24,350 It's probably a really cool learning experience 51 00:02:24,350 --> 00:02:26,120 to code this up by yourself, 52 00:02:26,120 --> 00:02:27,890 and it's actually not that hard. 53 00:02:27,890 --> 00:02:29,210 All right. 54 00:02:29,210 --> 00:02:32,580 Next up, there is the cross-site scripting attack, 55 00:02:32,580 --> 00:02:34,020 where the attacker tries to 56 00:02:34,020 --> 00:02:38,430 inject scripts into our page to run his malicious code. 57 00:02:38,430 --> 00:02:41,280 On the clients' side, this is especially dangerous 58 00:02:41,280 --> 00:02:44,810 because it allows the attacker to read the local storage, 59 00:02:44,810 --> 00:02:46,500 which is the reason why we should 60 00:02:46,500 --> 00:02:50,360 never ever store the JSON web token in local storage. 61 00:02:50,360 --> 00:02:54,110 Instead, it should be stored in an HTTP-only cookie 62 00:02:54,110 --> 00:02:55,950 that makes it so that the browser can 63 00:02:55,950 --> 00:02:58,110 only receive and send the cookie 64 00:02:58,110 --> 00:03:01,400 but cannot access or modify it in any way. 65 00:03:01,400 --> 00:03:04,360 And so, that then makes it impossible for any attacker 66 00:03:04,360 --> 00:03:08,460 to steal the JSON web token that is stored in the cookie. 67 00:03:08,460 --> 00:03:11,590 Again, we're implementing this in a second. 68 00:03:11,590 --> 00:03:15,780 Now, on the backend side, in order to prevent XSS attacks, 69 00:03:15,780 --> 00:03:18,170 we should sanitize user input data 70 00:03:18,170 --> 00:03:20,660 and set some special HTTP headers 71 00:03:20,660 --> 00:03:24,470 which make these attacks a bit more difficult to happen. 72 00:03:24,470 --> 00:03:27,040 And Express doesn't come with these best practices 73 00:03:27,040 --> 00:03:29,560 out of the box, so we're gonna use middleware 74 00:03:29,560 --> 00:03:31,713 to set all of these special headers. 75 00:03:32,710 --> 00:03:35,620 Next, we have denial-of-service attacks. 76 00:03:35,620 --> 00:03:37,510 And maybe you have heard of these. 77 00:03:37,510 --> 00:03:39,330 It happens when the attacker sends 78 00:03:39,330 --> 00:03:42,600 so many requests to a server that it breaks down 79 00:03:42,600 --> 00:03:45,450 and the application becomes unavailable. 80 00:03:45,450 --> 00:03:47,470 Again, implementing rate limiting 81 00:03:47,470 --> 00:03:49,530 is a good solution for this. 82 00:03:49,530 --> 00:03:51,970 Also, we should limit the amount of data 83 00:03:51,970 --> 00:03:55,810 that can be sent in a body in a post or a patch request. 84 00:03:55,810 --> 00:03:57,950 And also, we should avoid using 85 00:03:57,950 --> 00:04:01,110 so-called evil regular expressions to be in our code. 86 00:04:01,110 --> 00:04:03,590 And these are just regular expressions that take 87 00:04:03,590 --> 00:04:07,550 an exponential time to run for non-matching inputs and 88 00:04:07,550 --> 00:04:11,680 they can be exploited to bring our entire application down. 89 00:04:11,680 --> 00:04:15,960 Okay, next up, we have the NoSQL query injection attack. 90 00:04:15,960 --> 00:04:18,510 And query injection happens when an attacker, 91 00:04:18,510 --> 00:04:22,240 instead of inputting valid data, injects some query 92 00:04:22,240 --> 00:04:24,330 in order to create query expressions 93 00:04:24,330 --> 00:04:26,600 that are gonna translate to true. 94 00:04:26,600 --> 00:04:28,920 For example, to be logged in even without 95 00:04:28,920 --> 00:04:32,120 providing a valid username or password. 96 00:04:32,120 --> 00:04:33,380 It's a bit complex 97 00:04:33,380 --> 00:04:36,330 and you should definitely Google it to learn more. 98 00:04:36,330 --> 00:04:38,940 But what you need to know is that using Mongoose 99 00:04:38,940 --> 00:04:40,810 is actually a pretty good strategy 100 00:04:40,810 --> 00:04:43,300 for preventing these kind of attacks 101 00:04:43,300 --> 00:04:46,110 because a good schema forces each value 102 00:04:46,110 --> 00:04:48,410 to have a well-defined data tab. 103 00:04:48,410 --> 00:04:50,190 Which then effectively makes 104 00:04:50,190 --> 00:04:53,640 this type of attack very difficult to execute. 105 00:04:53,640 --> 00:04:56,000 However, it's always a good idea 106 00:04:56,000 --> 00:04:59,280 to still sanitize input data, just to be sure. 107 00:04:59,280 --> 00:05:02,300 And we will take care of that a bit later. 108 00:05:02,300 --> 00:05:04,360 All right, and now to finish, 109 00:05:04,360 --> 00:05:07,822 I just have a couple of best practices and suggestions 110 00:05:07,822 --> 00:05:10,150 on how to improve the authentication 111 00:05:10,150 --> 00:05:14,009 and authorization mechanisms that we implemented. 112 00:05:14,009 --> 00:05:16,350 So, the first thing I need to repeat 113 00:05:16,350 --> 00:05:18,760 over and over and over again 114 00:05:18,760 --> 00:05:21,370 is that in a production application, 115 00:05:21,370 --> 00:05:24,310 all communication between server and client 116 00:05:24,310 --> 00:05:26,980 needs to happen over HTTPS. 117 00:05:26,980 --> 00:05:30,010 Otherwise, anyone can listen into the conversation 118 00:05:30,010 --> 00:05:32,520 and steal our JSON web token. 119 00:05:32,520 --> 00:05:35,540 Next, always create random password tokens. 120 00:05:35,540 --> 00:05:38,660 Not generated from dates or something like that. 121 00:05:38,660 --> 00:05:40,920 Because they are effectively passwords 122 00:05:40,920 --> 00:05:43,470 and so, they should be treated as such. 123 00:05:43,470 --> 00:05:45,860 Plus, always give them expiry dates, 124 00:05:45,860 --> 00:05:47,750 just like we implemented it. 125 00:05:47,750 --> 00:05:48,910 All right? 126 00:05:48,910 --> 00:05:52,340 And we also implemented that a certain JSON web token 127 00:05:52,340 --> 00:05:56,480 is no longer valid after the user has changed his password. 128 00:05:56,480 --> 00:05:58,660 So, we basically revoke the token 129 00:05:58,660 --> 00:06:01,410 as soon as the user changes the password. 130 00:06:01,410 --> 00:06:04,070 Which makes a lot of sense, but again, 131 00:06:04,070 --> 00:06:07,650 many tutorials out there simply do not do that. 132 00:06:07,650 --> 00:06:10,470 Another big thing is to never ever commit 133 00:06:10,470 --> 00:06:14,060 a configuration file, like for environment variables, 134 00:06:14,060 --> 00:06:16,460 to a version control like Git. 135 00:06:16,460 --> 00:06:19,020 In fact, do not upload it anywhere 136 00:06:19,020 --> 00:06:20,500 because this file contains 137 00:06:20,500 --> 00:06:23,780 the most sensitive data of the entire application. 138 00:06:23,780 --> 00:06:26,340 For example, if someone gets access to 139 00:06:26,340 --> 00:06:28,260 your JSON web token secret, 140 00:06:28,260 --> 00:06:32,083 then your entire authentication process is compromised. 141 00:06:32,083 --> 00:06:35,950 Okay, and now just a small detail is to 142 00:06:35,950 --> 00:06:37,560 whenever there is an error, 143 00:06:37,560 --> 00:06:40,560 do not send the entire error to the client. 144 00:06:40,560 --> 00:06:44,010 So, stuff like the stack trace could give the attacker 145 00:06:44,010 --> 00:06:46,920 some valuable insights into your system, 146 00:06:46,920 --> 00:06:49,650 and so, of course, we don't want that. 147 00:06:49,650 --> 00:06:52,480 Next up, we can use the csurf package 148 00:06:52,480 --> 00:06:57,200 to fight a type of attack called Cross-Site Request Forgery, 149 00:06:57,200 --> 00:06:59,750 which is an attack that forces a user 150 00:06:59,750 --> 00:07:03,530 to execute unwanted actions on a web application 151 00:07:03,530 --> 00:07:05,330 in which they are currently logged in. 152 00:07:05,330 --> 00:07:07,600 We're not gonna do that in this section, though. 153 00:07:07,600 --> 00:07:10,140 But I still wanted to mention it here. 154 00:07:10,140 --> 00:07:12,280 Next, we could require the user to 155 00:07:12,280 --> 00:07:16,180 re-authenticate before performing a high-value action. 156 00:07:16,180 --> 00:07:19,730 For example, making a payment or deleting something. 157 00:07:19,730 --> 00:07:22,070 Again, this is just a suggestion 158 00:07:22,070 --> 00:07:23,810 that you can try out for yourself. 159 00:07:23,810 --> 00:07:26,630 Another cool feature that you can implement 160 00:07:26,630 --> 00:07:29,460 is a blacklist of untrusted tokens. 161 00:07:29,460 --> 00:07:31,660 So, we already know that there is not really 162 00:07:31,660 --> 00:07:34,910 a way to log users out of the application 163 00:07:34,910 --> 00:07:37,220 if they show some malicious activity. 164 00:07:37,220 --> 00:07:41,260 But what we can do is to create a list of untrusted tokens 165 00:07:41,260 --> 00:07:44,370 that are then validated on each request. 166 00:07:44,370 --> 00:07:47,920 And next up, a feature that we could have implemented is to 167 00:07:47,920 --> 00:07:51,810 confirm the email address after an account is first created. 168 00:07:51,810 --> 00:07:54,665 So, basically by sending a link to the user's email, 169 00:07:54,665 --> 00:07:57,520 like many real apps actually do. 170 00:07:57,520 --> 00:08:00,190 But I wanted to just keep things simple here, 171 00:08:00,190 --> 00:08:02,600 which is why I didn't do this here. 172 00:08:02,600 --> 00:08:05,400 But please feel free to just implement this yourself 173 00:08:05,400 --> 00:08:07,360 if you feel like it. 174 00:08:07,360 --> 00:08:09,900 Now, a big feature that many apps have 175 00:08:09,900 --> 00:08:12,580 is the concept of refresh tokens. 176 00:08:12,580 --> 00:08:15,050 Which are basically to remember users. 177 00:08:15,050 --> 00:08:17,150 So, to keep them logged in forever 178 00:08:17,150 --> 00:08:19,720 or until they choose to log out. 179 00:08:19,720 --> 00:08:22,170 Our current implementation makes it so that 180 00:08:22,170 --> 00:08:25,020 the user has to basically log in again 181 00:08:25,020 --> 00:08:27,480 after the JSON web token expires. 182 00:08:27,480 --> 00:08:30,720 But, with refresh tokens, that's no longer necessary. 183 00:08:30,720 --> 00:08:33,490 And it's a bit complex to implement and so, 184 00:08:33,490 --> 00:08:35,342 it's a feature for another time. 185 00:08:36,270 --> 00:08:37,950 And finally, the last one 186 00:08:37,950 --> 00:08:41,530 that we could have implemented is two-factor authentication, 187 00:08:41,530 --> 00:08:43,770 which I'm sure you're familiar with. 188 00:08:43,770 --> 00:08:46,079 Basically, with two-factor authentication, 189 00:08:46,079 --> 00:08:48,750 after logging into the application, 190 00:08:48,750 --> 00:08:50,050 the user needs to perform 191 00:08:50,050 --> 00:08:53,110 a second action to really get authenticated. 192 00:08:53,110 --> 00:08:55,750 And typically, that is to insert a code 193 00:08:55,750 --> 00:08:58,980 sent via text message to a mobile phone. 194 00:08:58,980 --> 00:09:01,420 So, these are a lot of functionalities 195 00:09:01,420 --> 00:09:03,580 our authentication could have. 196 00:09:03,580 --> 00:09:05,730 And if you want me to implement any of them, 197 00:09:05,730 --> 00:09:08,160 please let me know so in the Q&A section. 198 00:09:08,160 --> 00:09:10,640 And, if there is a lot of demand for one of them, 199 00:09:10,640 --> 00:09:12,740 then I will show you how it works. 200 00:09:12,740 --> 00:09:15,210 Okay, but again, I didn't want to 201 00:09:15,210 --> 00:09:17,270 turn this Node.js course into 202 00:09:17,270 --> 00:09:20,760 a whole security and authentication course. 203 00:09:20,760 --> 00:09:24,230 And just to finish, something that we will implement 204 00:09:24,230 --> 00:09:26,200 in the rest of the section is 205 00:09:26,200 --> 00:09:28,320 to prevent parameter pollution. 206 00:09:28,320 --> 00:09:32,450 For example, try to just insert two field parameters 207 00:09:32,450 --> 00:09:36,030 into the query string that searches for all tours. 208 00:09:36,030 --> 00:09:38,290 And if you do that, you will find that 209 00:09:38,290 --> 00:09:39,770 there will be an error because 210 00:09:39,770 --> 00:09:42,150 our application is not prepared for that. 211 00:09:42,150 --> 00:09:45,790 And so, attackers try to use these kinds of weaknesses 212 00:09:45,790 --> 00:09:49,330 to crash applications, which is, of course, not good. 213 00:09:49,330 --> 00:09:51,530 And so, we need to fix that. 214 00:09:51,530 --> 00:09:56,286 Okay, so this turned out to be a lot longer than I expected. 215 00:09:56,286 --> 00:09:59,231 And there are entire courses about security 216 00:09:59,231 --> 00:10:01,560 if you're really into security. 217 00:10:01,560 --> 00:10:04,074 All right, but I am leaving it at this, 218 00:10:04,074 --> 00:10:07,283 and so, let's now move on right to the next one. 17546

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.