00:00
好,下面呢,咱们讲解一下这个问题啊,这个叫做SQ注入,这个是什么问题呢?看这里边写的这个代码哈,和我刚才写的基本上是一致的。好了。Sla它只不过换成星了哈,咱们是那个名啊,没什么区别啊,然后呢,Name拼上,然后密码呢拼上对吧,然后判断是否有数据,如果有的话登录成功。哎,跟咱写的没啥区别吧。哎,如果输入正常的账号密码,它这块显示的是。怎么?如果输入错误的登录失败,这很正常,对吧?然而接下来我输入这样的一个密码。我输入这么一个密码,这个格式呢,你就按照它这个里写,它呢,仍然会显示登录成功,这是为什么呢?咱们试一下啊,这个关了啊好的来咱们先捋一遍啊,嗯,错误的话,错误的话没毛病,正确的话。
01:10
今年是多少来着?好像是这个。没问题是吧,好,现在错误和正确是不是都可以啊,然后呢,这里边儿我有点需要改一下程序,改什么呢?因为我这个密码需要输入空格,看到了吗。所以呢,我这块接收密码的时候,这个N应该叫做line上面的也改成line呗,这块保持一致了行吧。好嘞,我再次运行啊,还是错误的没问题。正确的。也没问题,好,接下来我输入一个,你甭管我是啥账号。我的密码。我的密码。喜欢啥呢?嗯,就跟那刚才这个PPT上这个格式一模一样哈,啊,比如说我就写个随便吧。
02:06
一样的啊。好,然后拼个单引号,或者后边写上。等于一。你先甭管这个啥意思,一会儿就知道了。一回车。哎,也就是说这个密码,只要你是这个密码的话,甭管啥账号。都行吧。是不是都出来了,哎,都出来了,好,这个就是一个万能的密码,哎,只要是这个密码,他都能登录过上来。OK,然后呢,这个密码,他为什么这个密码它就会能把咱们这个登录上来呢。这么看,四核语句是不是在这儿呢?来这呢?看了啊,现在我的账号,我这个账号,我刚才怎么输入的就啥都行啊,OK,咱们也就是说我可以账号我可以写成这个没问题吧。
03:03
哎,我想简单点哈,假设我输了一个X,这不就相当于在这,然后你看我的密码啊,关键了,我的密码现在是这个玩意儿,我把它复制一份,然后放在我的密码的后边。这个是不是就密码呢?我要粘了啊,我要粘了,一粘好再读一遍这个词口语句,你就发现知道啥意思了,你看啊,条件为它等于xa没有这个匹配啊,并且密码等于随便有这样的账号密码的匹配吗?没有吧,但是。或者一等于一。一等于一是个什么叫永真条件吧?永远为真啊。你看这块是个啥或者吧,只要有一个为真的话,那整个表达式你这块就没用了吧,都。是不是整个表达后边这个条件就为真啊,为真的话,这样的语句就能查询出结果来,没问题吧?
04:06
就查出结果来了。就是不管你的账号是啥,我都能查出结果。好,这个过程啊,这个过程咱们是通过什么方式查询出来结果啊。是不是通过拼SQ语句的方式啊,啊,就是说我可以想点别的招,让你原本上你看我把这个代码这个这个吧。正常来说是不是这么写的,我可以把你的这个代码,这个参数换成另一种,就是拼写一种特殊的格式,让你的整个思考语句变了一层意思。OK。通过。通过拼拼装circle语句,让原本的语义语义。
05:01
改变了。这个过程就叫。就叫circle输入,也就说你在页面上输入一个参数,这个参数是不是注入到咱们的circleq语句里了,然后让这个circleq语句是不是就变成了,语义是不是变化了。好,那个他就成功了,假设这是咱们做的一个什么什么,呃,一个项目登录,你就这么写的,那人家搞这么个密码,是不是就完全把你的项目登录进来了。哎,你的项目就废了是吧,那肯定不行了,好,现在知道这个为什么这个账号密码能够成为万能密码了吧,他就是把你的SQ句是不是改变意思了。哎,改变了一层意思啊。那咱们知道有这个问题哈,嗯,以前呢,任何一个项目在结束的时候,最后阶段都要通篇的测磁口注入的问题。啊,就是各种SQ的拼接啊,都给你去往里边去搞一搞,测一测,有问题赶紧及时改掉。
06:05
好,那咱们这个数据库的厂商啊,其实一个人用五个人用,100个人用数据库的厂商是不是就。知道有这个问题的出现了,他们就想到了一个解决办法。这个解决办法。换这个单词了,这个单词后边认识吗。Statement刚才那个吧,是不是就可以这个STEM刚才怎么理解第一个程序,我把它理解为是装命令的那个车吧。对吧,第二个程序我把它理解为是不是背着炸药包那个小兵啊。反正不管是这两个哪个,它到底是什么呢?它就是命令的承载器。谁能执行这个命令,谁能到点执行咱们的SQ语句就靠它呢,就靠它呢,好吧。好,那现在呢,这个单词前面就加了一个前缀。
07:00
不是statement了,它叫prepared statement,那这个玩意儿怎么理解呢?其实理解起来也好理解,之前这个statement不是像小兵吗?这小兵背着炸药包去炸碉堡去是吧?现在这个prepare statement你就可以理解为他是一个特种兵。超级特种兵。之前小普通小兵,他只能炸一个碉堡是吧?现在这个特种兵一出现,哥们背个炸药包就能把你国家给你炸没了是吧?哎,它的威力更加庞大了是吧?哎,他更有威力啊。好,然后呢,这是我给大家做一个比喻啊,做一个比喻,我刚才做了一个比喻的意思只有一个就是啥。Prepared statement这个长的这个家伙比statement好。OK。长的这个家伙比STEM要好,它使用起来更加灵活,更有效率,OK。
08:01
好,这篇你就记住这个就行,这个东西比这个东西要好。肯定嘛,这么长嘛,是吧,特种兵比肯定比小兵厉害是吧啊。好,那这个玩意儿到底怎么写,怎么怎么用的呢?我先给大家用一下,然后回头再给,就把这个下边这个显示一下好吧,现在呢,我这边代码啊,我不删,我给大家留下好吧,然后我复制一份。刚才不是这个吗?太log in吗?CTRLCCTRL为完全复制代码,叫LOG2 OK,哎,别的二了,后边加一个下划线。特种兵。刚才不是statement吗?现在叫了,为啥是呢?马上就知道了。改成这个了啊,现在我对这个登录呢,进行一个更改,看看我怎么改的,现在我要给它改成特种兵了啊,首先SQ语句。
09:02
不能用这个玩意儿拼接的方式了。之前不说了吗?为什么会导致circle注入的这个这个问题啊,就是因为。什么?拼装circle啊好,所以这块呢,我不会再让这样的拼装了,那咋办呢,我通过。占位符的方式。占位符的方式,问号这块我用问号把这个变量的这个位置啊,先占下来,就比如说咱这图书馆,我拿书包往凳子上一扔,我这个书包是不是把这个位置占下来了。这个问号就相当于那书包,OK,我先这个位置占一个变量,后边这个密码呢,也占一个变量。OK,我是不是占了两个坑啊,啊,占了两个地儿啊,好了,然后获得连接,这都不变,这个已经变成了特种兵了。所以把这句代码注释特种兵咋来的?con.prepared prepared statement。
10:16
看一下啊。添加参数让你你先别着急,我看这单词我写没写对啊,看来他让我添加参数,说明这个方法我写对了啊,好,之前你看con点创建statement是吧,现在是con.prepare就是方法变了一下。然而,这里边需要把词口语句放进来。把so就放下来,然后你看之前返回的是不是这个玩意儿啊,现在返回的是啥呢。长的吧。所以把这个单词写拐过来,叫prepared statement。然后取大写字母,好,这回知道我这个类的后缀为啥叫了吧?
11:01
哎,就是他,就是他。啊,然后呢,把它引一下包一下包。在哪?的是吧。好了,特种兵搞上来了。特种兵搞上来了。算了,删了吧,到时候两边代码你对照就知道咋回事了是吧。好,特种兵已经出现了,那接下来干嘛了?是不是特种兵?要执行了。点当然这个代码是一样的,Query返回RS。Rains s。好吧。然后呢,大家来看,在整个代码的过程中,我仍然不知道你这个问号站上有什么用。所以记住了,你现在如果这样去执行的话,等你报错,他说索引中丢失印号的这个参数一啥意思?你这两个问号已经占上了,你是不是得真正的来人坐下呀?
12:08
也就是说我应该把账号给他,密码给他,对吧,什么时候给记住了执行,你看这不叫吗,这不是执行查询吗?在执行之前。怎么做呢?我如何把这个问号给上这个内这个no的变量,通过超级兵点,你看第一个问号啊,第一个问号这个值是什么类型啊。字符串吧,所以这块写着点set尺寸类型啊。第一个问号为no。看我这个一啥意思了不,这叫第一个问号,那这个问号这几个。第二个OK,下一个就是点设置第二个问号为密码。
13:05
看到吗?哎,这样的话呢,这个一表示第一个问号,这个二表示第二个问号。第一个问号改成啥了,这个相当于是不是就no拼那了,然后这个第二个改密码了,相当于密码拼在这了,好了,来测一下一一。失败了,成功的S11010011231231没问题是吧,来一个万能的。站过来。说不行了。吃了。超级特种兵把你这个问题帮你规避掉了。所以上一个程序的那个什么statement那个玩意儿,忘了他吧。哎,我还没记住呢是吧?哎,那就记这个吧,超级特种兵哈,这个比那个要好使得多。
14:03
Prepared statement好,写点注释哈,这句话干嘛呢?是哦。特种兵吧。特种兵替代了原来的小。好,特种兵叫小兵,叫做ST,简称吧,别的了,别加简称,写全称吧,Prepared statement,小兵,Statement。OK,哎,这是第这句话啊,这句话,然后这两句话干嘛的。该。占位符赋值。占位符赋值。比如说什么是占位符啊,给占位符问号赋值。对吧,第一个问号啥啊,第二个问号啥,如果后边还有别的问号,那就是第三个,第四个,第五个,以此类推。
15:03
好吧,然后呢,接下来这句话是不是还是直行啊,这个句话变了吗。以下代码是不是都没变过呀?OK,变的呢,其实就这点儿东西。
我来说两句