00:00
来,咱们接着来啊,上节课咱们给大家呢,这个埋下的一个一个伏笔啊,是什么呢?是就是咱们这个司空注入。就这个SQL注入的一个最根本的原因呢,我觉得有必要再说一下,他其实并不是说因为我们用户提供的信息当中啊,还有这个SQL语句的关键字,它它含有S狗语关键字,它最关键的这个问题啊,是在于它编译了。如果说他提供的信息里边含有S口语的关键字,如果他没有参加这个编译,没有参与这个编译的话,我觉得。啊,这是肯定不会注入的。我们就往这方面去想。那你看这个程序的执行过程是第四步,执行SQL语句的时候,先进行SQL语句的拼接,你正好把这个SQL语关键字给他拼进去,然后正好到第68行,到这个地方的时候,你看他就编译,他就把这个S后语句发送给谁啊,这个DBMS叫数据库管理系统,然后呢去编,正好就。
01:09
上当了。原因扭曲了,你表面写的这个词后句是这个意思,但是呢,他这个一拼进去就妥了,跟以前所表示的含义就不一样了啊。那么接下来我怎么怎么去?解决SQL注入问题呢?就怎么解决这个搜录,我们就只单独就是解决这个问题,来一块来看看怎么解决啊。在这呢,我们去新建一个类啊叫JD bc class啊JD bc test07。来。咱们在这儿呢,呃,代码复制吧。
02:00
行吧,我就不再写了啊,再写浪费时间了,确实是这样,那咱们复制哪一块呢?问方法删掉算了,那从这直接从问方法开始复制呗,从这呗啊往下走往下走往下走往下走再走到这呗,哎,咱复制一份啊。第六版本的这个呀,咱们是存在词不注入问题的,咱们这个版本就来解决一下。行吧,哎,我们在这里呢,主主要做的一件事就是第一件事啊,我们主要解决什么呀,Circle注入问题。怎么解决?清兵兵。哎,大家注意听了啊,改动的地方比较多。
03:02
改动的地方比较多,你注意听啊,要不然你就又听不懂了啊。这个呢,还是刚才那个程序,我目前来说还没有改动,那我要改哪呢?首先啊,我们这三个接口当中,这个接口。我们要换成别的接口。Statement。Seven。他呢?有很多什么?字类或者子接口吧。是吧,哎,这不他吗,Statement吗?它下边的有一个什么呢,叫做。Prepared statement。Prepared statement。继承了statement,所以它还是一个什么statement,它能够执行词后语句,他也能够执行词后语句,但它是一个接口。
04:07
我们需要用这个接口,这个接口呢,它叫什么呢?叫做预编译的数据库操作对象,这个叫什么呀?叫数据库什么操作对象,这个前面加了几个字,叫什么预编译的数据库扫对象,注意这个单词啊,叫。这里带个D啊各位。以这个ED结尾的。Prepared。叫预编译的数据库操作对象,我们需要用这个才能解决。我先把这个结论先给大家写到这,怎么解决词汇注入问题,只要啊用户提供的信息,不参与什么。
05:00
SQL语句的编译过程问题就解决了。啊,只要用户提供的信息不参与SQL语句的编译过程,即使用户提供的信息中含有SQL语句的什么关键字,但是没有参与编译呀。不起作用。不起作用。所以在这里我要说的是。要想。啊,先。要想用户信息不参与circle语句的编译,那么必须使用谁加点?下的statement。
06:12
是属于编译的数据库操作对象。的原理是什么呢?Prepared statement的原理是预先对L语句框架进行编译,然后再给SQL语句,怎么着传只能传什么值啊?它采用的是这种方式。
07:05
注意了,那么我们来看这个怎么改呢?我们需要给改成的,我一般啊会把后边给它改成什么呀。P。S,看见了吧,把这个拿过来放哪啊,放这啊诶。对吧,诶就这改了一下啊,各位改了一下,然后呢,这个该导入的呢,我就导进来啊soq星不用管了是不是,那咱们再往下看,各位我改了了个啊编译的啊,预编译的数据库操作对象,大家注意听啊注意听这一块也就要变了。
08:08
并且你的SQL语句也不能写到这儿了,注意听SQL语句,你需要提前在第三步的时候。写上。大家注意看啊,获取什么欲。编译数据操作对象对吧。注意没有D没有D啊。没有地是动词。方法是动词。
09:01
名字,这是一个形容词。叫预编译的数据库操作对象。要想获取预编译的数据对象,你需要调用的一个方法叫把circle语句传进来。circle语句不能写到这了,你得提到第三步这个位置,并且将单引号里边放的这个值变成问号,把后面的这个单引号里边放的这个值也变成问号。这两个问号我们称为占位符。记住这两个问号,将来往这里只能填充什么值?所以您一定要注意,千万别写单引号里边放问号,这样的话,他就会认为你这个语句的占位符只有一个,哪个这个他会认你这个只是一个普通的什么字符串,听懂了吗?
10:15
这个内容是也就是搞了半天,这个才是我们以后常用的啊,因为它可以防止什么circle注入啊你。听懂了吧,所以说您应该重点学的是这个内容。句什么?框子可以这么说啊,框子。So后框框架。其中一个问号代表一个什么占位符?
11:02
其中一个问号表示一个占位符,一个问号将来接收一个什么值?注意占位符不能使用单引号括起来。注意这个事啊,那第四步执行circle也变了,各位。SQL语句不用往这传了。调这个对象的execute query返回结果集。第一步还是什么注册驱动?第二步什么获取连接,第三步是获取预编译的数据框的对象,第四步是执行三口语句,第五步是处理结果机,第六步是释放资源,也就是JDBC编程,还是这六步吧。
12:02
能理解吧,这C编程还是这六步,我强调一下啊,还是这六步,步骤不变,只不过第三步的时候,我们要把sol语句的框子干什么先写到这。接下来不是那个不是那个了啊,叫这个位置把SQL语句的框架传进去,记住了同学,也就是程序执行到哪,执行到此处。会发送什么SQL语句什么。会发送这个SQL语句什么。框子给谁DBMS,然后DBMS进行SQL语句的预先什么编译?
13:02
明白吧,接下来执行各位,这个地方能不能再写个色。记住了啊,如果您这个SQL语句写到这儿的话,他还会把这个SQL语句再编译一次,听清楚了吗?你上面已经把SQL语句传给了,它是有这个SQL语句的,所以你直接调的IQ的query就可以,括号里边不需要传这个SQ语句了,你在这已经传进去了,好,大家想这JDBC变成六步里边现在缺乏的是谁?缺乏的是不是没有给占位符传值,所以你在哪?在这个地方一旦把思考L语句的框子编译完成之后,再往下继续写代码的话,您就需要给占位符问号干什么传值了?各位啊,传值怎么传值,记住了。第一个问号下标是一。
14:04
第二个问号下标是2JDBC中所有下标从一开始记住了吗?之前我是不是说过啊,接下来我们在这边上调注意啊,你现在是不是把思后L语句已经给了了,那是不是现在知道这个地方有个站略符,也知道这个位置有个战略符吧?接下来掉S方法给第一个问号传值叫set,能看懂吧?那你set一个什么值?因为用户名和密码都是字符串,所以set的类型是什么?String set string这个位置写什么?第一个参数写写占位符的下标写一一就代表第一个问号听懂了吗?第一个问号传什么值?用户的登录名,接下来继续。
15:05
调用site string给第二个问号传值,第二个问号传值是登录的密码传过来,我再说一下,这个时候如果您的登录名和登录密码当中含有L语句的关键字,但这些关键字并没有参加SQL语句的编译,自然不会影响到你这个SQL语句的原意,他SQL语句在这里早就编译了,只编译一次,你在这儿使劲传,诶这个用户名密码即使有关键字,对不起,但您这些关键字不参加编译就不起作用。听懂了吧,那么大家要注意一个问题啊,这个问号他将来给第一个问号传值,登录这个这个用户名传个张三过来之后,这个分号自动会加个单引号,里边放上张三,大家知道为什么它会自动在外面加个单引号,然后传个张三吗?因为你这里调的方法是什么?
16:04
明白吧,如果掉的是set in,你第二个参数是不是只能传一个数字啊?好,那你传数字的话,假如说这个位置是一个占位符问号的话,自动它会把问号去掉,变成100,它不会在100的外边加什么单引号,原因是你掉的set in的方法了吧。如果你调的set string,就意味着这个参数是不是一个字符串呀,你既然是字符串给这个问号传值的话,那你这个问号它自动就会加一个单引号张三。它很智能的啊,很智能的这样。詹伟福吗?行了,那给他传上值之后OK了,这个事就解决了。解决之后呢,执行,诶,我们一起来看看这一次的一个执行结果,来我们执行一下,执行首先在这里输入一个用户名,我们先看张三123到底能不能登录成功,可以吧,然后接下来我们再去执行我们的程序,然后用户名我们填上JACK123也能登录成功,然后我们再来执行我们这块输入张三密码,我输进去333登录失败,然后这里呢,我再去执行这个程序,我现在这样输,我进行circle口注入二一等于一,好,当时是不是就是这么写的,然后回车之后我们来看是不是登录失败啊,所以这个呢,就。
17:42
不会再出问题了。注意啊,这个测试的一个测试结果是这样的一个结果,用户名输这个密码输这个登录失败。
18:07
解决SQ注入的关键是什么?是什么是用户提供的信息中即使含有SQL语句的关键字,但是这些关键字并没有参与编译,不起作用。不起作用,不起作用。好,大家看这个步骤是不是比我们今天上午讲的那个步骤要稍微复杂一点,稍微复杂一些啊,但你这个没办法,这个你你是吧,你以后要经常用那个,你要注意这个单词带着D这个单词啊,是一个动词啊,没有D。你就这么记就行了。
19:01
啊,SQ语句比以前是不是传的早一些。以前的时候在第四步的执行词后L语句的时候,再再写词口L语句,现在是在第三步就得把词后语句写好,写好词后L语句之后写几个站位符,然后接下来给这个传,给这个站位符传值就行了。啊,你你你记下这个规律啊,记下规律记一下。规定登记一下啊。
我来说两句