There’s actually been a debateover how I should enunciate this. I call it sequel insertion. The acronym is SQL. Whichever way you call it, it’s a way to criticize websites, that really shouldn’t work any more, but still does. Sequel or SQL is a language inwhich you talk to databases, and it’s fairly … it’s fairly like English actually.You can actually say things like, “Select from this table.” It’s not a complicated conversation. There are no great amounts of curly bracketsand semi-colons and things like that. It can be. But evenly you can pretty much typecommands in near English into it, and you’ll get results back from your database. And this has existed for years and years and times. And that was all fine until the Web came along, and now beings “re looking at” websites and are thinking, “These, these need to be hooked up to databases.” Because way back, when Tim Berners-Leeinvented the World wide web, it was pretty much “I’m gonna request a document and you’re gonna send that document back to me.” Eventually parties worked out that what do you really wantedto do was send a document and have different things comeback depending on what you sent.Maybe you could type in a inquiry entreaty, and that would go to a databaseand pull back something. That’s great, that’s brilliant, that’s a wonderful ability. And unfortunately, some programminglanguages dealt with this in a sensible practice, and some did not. And one of the most notable onesthat didn’t is a language called PHP. I’m a PHP coder. It’s a veryeasy communication to write in.It’s a friendly conversation. I still haven’t met anyother usage that lets me develop code at the velocity that I is in a position to. It’s very fault-tolerant, within reason. It doesn’t ever give you the bestresults where reference is does, but, you are well aware, it’s friendly, it’s easy to pick up and crucially you can just write it into a text file, uploadit to a web server( in most of the world ), and it will simply succeed. You can type in PHP code and have it really run. So the barrier to entry is actually, truly low-pitched. Which in one way is brilliant. It makes webprogramming much more accessible. Facebook was originally written in PHP. Innumerable things have originally beenwritten in PHP and consignments of things still are. WordPress still is. The tribulation is, that if you’re not careful, there’s a lot of ways to go wrong. And this isn’t just PHP, but I’ll use it as a example.You talk to a database byissuing a authority like this. SELECT* FROM consumers WHERE username equals “tom” Great! And the database will send back all thedetails it knows about the user announced “tom”. Brilliant! But the catch is those quotation marks. Because if I’m not careful about what I cast, then we can cause some problems.Let’s say, for example, that I have a webform that lets me login and I type in tom, and it casts that and accompanies back “tom”. OK? Now lets say I type in tom with a quote mark in it, and if you are not careful, what will happenis the language will send something like this. SELECT* FROM consumers WHERE username equals “tom” and then I introduced a quote markin, and then it frames a quote mark in. It neglects because the quote stigmatizes don’t match up. And the whole thing crashesand it merely transports back an error. That’s mildly irking, and a big problem, of course, is puttingin any textbook that has quote marks.The catch is you can doa lot of damage that style. Because that languagedoesn’t merely have SELECT. It has INSERT to add brand-new trash. It has UPDATE to change stuff. And it has DELETE to remove stuff. So if I was to send, say, a username that was’ tom” ;’, and then positioned anothercommand in there, like,’ delete everything ‘. Its not a literal bidding, but something like that. It would work. So we have a look how “whos working”. We’ve got the normal require, “SELECT* FROM consumers WHERE username[ sighs]’ tom'”” Long command there.But when you put in’ tom ‘, I’m gonna communicate that, and then I’m gonna send this: DROP ALL DATABASES; Hit enter, it will get convertedinto a plain English command, in SQL language, it will get transported, and database will go “Well that’s exactly what I should do.” It’s gonna understand that there’s a new word atthe semi-colon and that it should delete everything. The prime style around it is escaping. When there is dangerouscharacter, like a quote mark, you introduced a gash before it. And by’ you’ I means that you, theprogrammer writing this. You “re going through”, and youuse a function that says, “Everywhere there is a quotemark, situated this reduce before it. And before you transport it tothe database, you do that.” Input comes in from the user, supplemented some lashes to it to make it safe, cast it out to the database.And the database looks atthose lashes and goes, “Right, every time there’s one ofthose, this thing that’s coming next? Just treat it as a regular excerpt commemorate. Don’t treat it anything special, it’sin the text, only treat it as that.” And if you wanna send an actualslash, you send two lashes: the first one to say “Treat the nextone as a real character”, and then…It tasks, but it’s clunky. And for a while, this kind of “Sendthe command in plateau English” was the best way to acquire thingswork in a couple of languages, including PHP, the most commonly usedweb programming language in the world. To make this worse, the dictation to addthose trounces was the wonderfully awkward: mySQL( it’s the name of the database .) _real _escape _string. And then youput whatever text you require there. “escape_string” being whatever it is you want it to do, “mySQL” being the name of the database, and “real”, because the first one didn’t work and they couldn’t change itbecause of backwards compatibility.So, anyone who’d consumed the original cord, which is, like, more than 10 years ago now, but anyone who’d usedthe original shape of this: completely insecure. Very than spot that, theyjust contributed the word “real”. Anyone who forgot to add that, or hadn’tread through all the documentation? Yep. Anyone can come along andeffectively delete your database. Or do more insidious things, like modernize other people’saccounts or predict other people’s passwords. Because once you’ve got access to thedatabase, if you work out how it toils, there’s really not much you can’t do. And the thing is, it is soeasy to get this wrong.If you get this wrong justonce, anywhere in your code, and there are lots of truly insidious spaces thatI’m not gonna get into to get this wrong, it’s not just a case offorgetting to escape quotes. There are lots of reallysubtle ways to get it wrong. If you do that, then your network app is vunerable. And when a person is figuresout that there’s a way in there, because they try and create ausername with a quote mark in it, then good luck! Say goodbyeto everyone’s passwords.The method it should be done issomething called organized proclamations, and if you are programminganything to do with a database, you should be using preparedstatements right now. The course they work is … It’s a spoof. It’s a hack on top of a hack, because, let’s be honest, transporting that kind of plain English SQLcommand from a programming language, that’s a hack, and then we’ve had to gave more on top ofthat, and more on top of that, and more on top of that.But trained statementsat least excludes it safe. With organized statements, you send the query. You mail “SELECT* FROM users WHERE username= ” and then you just say ‘?’. And that question mark, you then latersay “Right, this is the data I’m putting in. This is not a dominate. Don’t do anything to this, no matter what it looks like. This is unsafe. Just take it, receiving treatment very gingerly, store it in thedatabase and don’t look at it beyond that.” It’s a little more complicated than that, I am simplifyingmassively for, you are well aware, talking to a camera. And if you are web programming, you should look up the recent securityguidelines of what you should do, etc, etc, etc. But, this is what you should be using.Because right now, if you’re not utilize readied evidences, it takesone blunder, anywhere in your work, one thing where you’veforgotten to gave a quote mark in, or shambled it up in some subtle waythat it implements Unicode references, or something wonderfully complicated, peculiarly if you’re using a Microsoft database. That’s from person that uses Windows. If you’re not apply preparedstatements, you are vulnerable, and you need to fix that. But in the mean time, as hacksgo, there are worse ones ..