仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 715|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计SQL概述及在收集平安中的使用

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:34:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果互联网服务提供商,支撑数据的云服务,或它们之间任一点网络被堵塞或中断,他们就会遇到与数据延迟或应用程序故障有关的问题。如果问题发生在企业内部,解决方案提供商可以排除故障找出原因。平安|收集1.收集使用和SQL打针  1.1概述
  有些收集数据库没有过滤客户供应的数据中大概无害的字符,SQL打针就是使用拔出无害字符举行打击的手艺。只管十分简单提防,但因特网上仍旧有惊人数目的存储体系简单遭到这类打击。这篇文章的目标是引导专业平安构造懂得这类手艺,并告知他们准确的,用来提防SQL打针的举措,和处置各类罕见的,因为不法输出引发的成绩.
  1.2背景
  在读这篇文章之前,你应当对数据库怎样事情,和SQL怎样被用来会见数据库有一些基本的懂得。我倡议您浏览eXtropia.com的文章“IntroductiontoDatabasesforWebDevelopers”。
  (网址:http://www.extropia.com/tutorials/sql/toc.html)
  1.3字符编码
  在年夜多半的收集扫瞄器中,标点标记和很多别的标记在用于一个收集哀求前必要把URL编码,以便被得当地编译(interpret)。在本文中的例子和截图中我利用了流动的ASCII字符以包管最年夜的可读性。但是,在实践使用中,你必要在HTTP哀求顶用%25来取代百分号(%),用%2B来取代加号(+)等等。
  1.收集使用和SQL打针
  1.1概述
  有些收集数据库没有过滤客户供应的数据中大概无害的字符,SQL打针就是使用拔出无害字符举行打击的手艺。只管十分简单提防,但因特网上仍旧有惊人数目的存储体系简单遭到这类打击。这篇文章的目标是引导专业平安构造懂得这类手艺,并告知他们准确的,用来提防SQL打针的举措,和处置各类罕见的,因为不法输出引发的成绩.
  1.2背景
  在读这篇文章之前,你应当对数据库怎样事情,和SQL怎样被用来会见数据库有一些基本的懂得。我倡议您浏览eXtropia.com的文章“IntroductiontoDatabasesforWebDevelopers”。
  (网址:http://www.extropia.com/tutorials/sql/toc.html)
  1.3字符编码
  在年夜多半的收集扫瞄器中,标点标记和很多别的标记在用于一个收集哀求前必要把URL编码,以便被得当地编译(interpret)。在本文中的例子和截图中我利用了流动的ASCII字符以包管最年夜的可读性。但是,在实践使用中,你必要在HTTP哀求顶用%25来取代百分号(%),用%2B来取代加号(+)等等。。。
  1.收集使用和SQL打针
  1.1概述
  有些收集数据库没有过滤客户供应的数据中大概无害的字符,SQL打针就是使用拔出无害字符举行打击的手艺。只管十分简单提防,但因特网上仍旧有惊人数目的存储体系简单遭到这类打击。这篇文章的目标是引导专业平安构造懂得这类手艺,并告知他们准确的,用来提防SQL打针的举措,和处置各类罕见的,因为不法输出引发的成绩.
  1.2背景
  在读这篇文章之前,你应当对数据库怎样事情,和SQL怎样被用来会见数据库有一些基本的懂得。我倡议您浏览eXtropia.com的文章“IntroductiontoDatabasesforWebDevelopers”。
  (网址:http://www.extropia.com/tutorials/sql/toc.html)
  1.3字符编码
  在年夜多半的收集扫瞄器中,标点标记和很多别的标记在用于一个收集哀求前必要把URL编码,以便被得当地编译(interpret)。在本文中的例子和截图中我利用了流动的ASCII字符以包管最年夜的可读性。但是,在实践使用中,你必要在HTTP哀求顶用%25来取代百分号(%),用%2B来取代加号(+)等等。。。
  3.2.5LIKE语句查询
  另外一个年夜的劫难是堕入一个LIKE子句的圈套.(SeeingtheLIKEkeywordorpercentsignscitedinanerrormessageareindicationsofthissituation.)年夜多半的web搜刮程序利用LIKE子句来查询数据库,好比上面这个:
  SQLString="SELECTFirstName,LastName,TitleFROMEmployeesWHERELastNameLIKE%"&strLastNameSearch&"%"
  这内里的%是通配符,在这个例子里,WHERE子句会前往TRUE,只需LASTNAME里有字符串含有strLastNameSearch.为了制止SQLSERVER前往估计中的纪录,你机关的SQL语句里必需含有LASTNAME里没有的字符串.web搜刮程序搜刮的字符串来自于用户的输出.一般有一个和一个%在输出的字符串之前,因而我们机关字符串时,必要在WHERE子句中婚配它们.假如你提交了NULL作为搜刮字符串,那末LIKE的参数会酿成"%%",这是一个全婚配,会前往一切的纪录.

  3.2.6“逝世胡同”
  年夜部分的时分sqlinjection都要陪伴着大批失利的理论,假如你发明你不管怎样都不克不及拔出相干的语句,而且不管你怎样做都不合错误,这个时分你就要判别本人是不是失落进了一个逝世胡同,良多时分碰到这类情形你极可能是在一个多重嵌套的WHERE和SELECT子句的语句中,大概一些加倍庞大的多重嵌套,连利用“;--”都没有效,以是本人要当心和制止在这类中央停止。
3.2.7列的数量不婚配成绩
  如图所示,我们能够从几回毛病中失掉良多有效的信息,而且加以调剂本人的哀求语句,这类信息多了,那就意味着我们离乐成不远了。在猜列名时,如图所示,我们提交语句后会碰着以下毛病“在UNION语句中的一切查询都必需在方针列表中具有不异数量的表达式”,这就是说你必要找出大概说是探测出在正当的哀求中有几个列。
  这里我注释一下,UNION语句是用来将两个分歧的查询了局集相加失掉一个了局集,UNION利用的独一请求是两个查询的信息(你的查询语句)必需有不异的列数和不异的数据范例
  我举个例子,web程序中有以下语句:
  SQLstring="SELECTFirstName,LastName,EmployeeIDFROMEmployeesWHERECity="&strCity""
  正当的SELECT语句和我们注进的UNIONSELECT语句在WHERE子句中都要有不异的列。就下面的语句来讲,假如我要到场UNION语句的话,前后二者都要有3个列。而且他们列的数据范例也要互相婚配才能够。假如FirstName这个值是字符串范例的,那末在你注进的语句中所对应的值也应当是字符串范例的。一些数据库,如ORACLE,是对范例反省十分严厉的。其他的数据库绝对要好一些,同意你输出任何数据范例而且它会主动的把你输出毛病的数据范例转换成准确的。好比SQL数据库中,你在varchar范例的中央输出数值范例的数据(如int)是不会报错的,由于在这里数值范例会被主动转为字符串范例。可是假如在smallint列处输出text范例则被以为长短法的,由于text范例不克不及被转换成int范例。把数值范例的数据转换成字符串型是被同意的,而反之则不可,以是默许都是利用数值范例的数据。
 
  要想晓得我们要注进的方针语句中有几个列,你就要探索性的往UNIONSELECT子句中增加响应的值,直到它不报“在UNION语句中的一切查询都必需在方针列表中具有不异数量的表达式”如许的错为止。如图所示,假如你碰到的是数据范例不婚配的毛病,那末你要往改动列的数据范例。假如前往动静只是一个转换数据范例失利的毛病,那就申明你已猜对了列的数量,只是个中有一般的列的数据范例不合错误。那末接上去要做的就是判别是哪一个列的数据范例的不准确招致的毛病。然后将他悔改来就能够了。
  假如统统顺遂,那末庆祝你,你会失掉一个和下面格局相似的并且是正当的页面;)不管静态页面在那里呈现,你都能够机关本人的语句应对自若。
  
  3.2.8.WHERE关头字
  报错为“有效的列名EmployeeID”,这个成绩多是由我们注进的语句开头的WHERE关头字引发的,举例申明:
  SQLString="SELECTFirstName,LastName,TitleFROMEmployeesWHERECity="&strcity&"ANDCountry=USA"
  假如我们注进的语句是UNIONALLSELECTOtherFieldFROMOtherTableWHERE1=1那末会失掉以下的提交语句:
  SELECTFirstName,LastName,TitleFROMEmployeesWHERECity=NoSuchCityUNIONALLSELECTOtherFieldFROMOtherTableWHERE1=1ANDCountry=USA
  如许就会报错:[Microsoft][ODBCSQLServerDriver][SQLServer]有效的列名Country。
  实在成绩就是由于你注进的语句后,体系没有在从数据库的表中找到一个叫Country的列名。我们这里能够复杂的用“;--”正文标记将其正文失落(假如我们是SQLServer)。大概爽性持续猜其他的列名,然后机关正当哀求就如我们上一节讲到的一样。
  表名的列举
  我们已入手下手把握怎样来利用注进举行打击,可是我们还要断定要从哪一个表失掉信息,换句话说就是我们要的到关头的表名才干取得我们想要的有效信息。怎样取得表名呢?在SQLServer中,你能够很简单得从数据库中失掉全体的表名和列名。可是在Oracle和Access中,你就纷歧定能云云容易的失掉了,这要看WEB程序对数据库的会见权限了。关头在因而否能失掉体系创建时主动天生的表中包括的表名和列名。如在SQLServer中,它们分离为sysobjects和syscolumns,(在本文最初我们将给出其他数据库体系自建表和响应的列名)我们用以下的句子能够在这些表中列出数据库的一切列名和表名,(依据情形自行修正):
  SELECTnameFROMsysobjectsWHERExtype=U
  这句话会前往数据库顶用户界说的一切表,假如我们看到我们感乐趣的大概是想要看的表,那末我们就把他翻开,这里以Orders为例机关语句:SELECTnameFROMsyscolumnsWHEREid=(SELECTidFROMsysobjectsWHEREname=Orders)失掉了局如图。
  3.2.10.单一记录
  下面我们机关的语句前往了大批的信息,假如你只想显现一条数据记录也是能够的。你完整能够机关你的注进语句来失掉你想要的独一的信息。我们只需在WHERE子句中增加关头字来制止某些行的关头字被选中就能够了。我来举个列子:UNIONALLSELECTname,FieldTwo,FieldThreeFROMTableOneWHERE=
  我们如许就能够失掉FieldOne,FieldTwo和FieldThree的第一个值,假定我们的到的分离是"Alpha","Beta"和"Delta"。注重,更成心思的来了,我们要失掉第2行的值,怎样机关上面的语句呢?如许来:UNIONALLSELECTFieldOne,FieldTwo,FieldThreeFROMTableOneWHEREFieldOneNOTIN(Alpha)ANDFieldTwoNOTIN(Beta)ANDFieldThreeNOTIN(Delta)AND=
  这里有一个子句“NOTINVALUES”,它的感化是不再前往我们已失掉的信息,即不是alpha,不是beta,不是delta.既然都不是,数据库就会傻乎乎的告知我们第二行的值。我们再假定我们失掉第二行的值为"AlphaAlpha","BetaBeta"和"DeltaDelta"。
  我们来取得第三行的值,机关语句以下:UNIONALLSELECTFieldOne,FieldTwo,FieldThreeFROMTableOneWHEREFieldOneNOTIN(Alpha,AlphaAlpha)ANDFieldTwoNOTIN(Beta,BetaBeta)ANDFieldThreeNOTIN(Delta,DeltaDelta)AND=
  如许就制止了失掉第一次和第二次我们已失掉的值,我们就如许试下往会失掉数据库中一切的值。这看起来仿佛的确对照贫苦,但在这里倒是最无效的,不是么?
 
  3.3拔出
  3.3.1拔出基本
  关头字INSERT被用于向数据库增加信息,一般利用INSERT次要在包含用户注册,论坛,增加商品到购物车,等等。反省INSERT利用的缺点和反省WHERE一样。你大概不想利用INSERT,怎样制止被使用缺点是一个主要的思索成绩。INSERT注进实验经常会让数据库以行情势前往了局招致众多的独自的援用和SQL关健字的意义大概改动.取决于办理员的注重和信息对数据库的操纵,这个是要引发注重的,方才说过的那些,INSERT注进和SELECT注进的分歧。我们在一个同意用户举行各类注册,这就供应了一个你输出你的名字,地点,德律风等等的表单。在你提交了这个表单以后,为了失掉进一步的INSERT的缺点,你必需可以看到你提交的信息。它在那边没关系。大概当你上岸依据在数据库里存储的名字的赐与你权力的时分,大概在发送你的spam邮件的。。,谁晓得,寻觅一个路子最少能够看到你输出的信息。
  3.3.2
  一个拔出的哀求看起来象如许:INSERTINTOTableNameVALUES(VauleOne,ValueTwo,ValueThree)你想大概使用一个在参数VALUES中的子句来看到其他的数据。我们可使用这类举措,sql的代码象如许:SQLString="INSERTINTOTableNameVALUES("&strValueOne&","&strValueTwo&","&strValueThree&")"我们象如许填写表单:Name:+(SELECTTOP1FieldNameFROMTableName)+Email:blah@blah.comPhone:333-333-3333使SQL的声明象如许:INSERTINTOTableNameVALUES(+(SELECTTOP1FieldNameFROMTableName)+,blah@blah.com,333-333-3333)当你到了团体设置页面检察你的利用信息,你将看到的第一个字段这个一般是用户名r假如你使不在你的subselect中利用TOP1,你将失掉一个毛病信息说你的subselect前往了太多纪录,你能检察表中一切的行,利用NOTIN()一样的办法你能够失掉独自的纪录。
  3.4.SQL服务器存储历程使用
  3.4.1存储历程基本
  4.一个完全安装的MSSQL服务器有上千的存储历程。假如你能在一个背景利用mssql的网页使用程序失掉SQL注进,你能利用这些存储历程完成一些不凡的功效。我将会商很少的特别的历程。取决于网页程序利用数据库的用户,只要一些能够事情,并非一切的用户都能够使用。第一件事你应当晓得存储历程注进不克不及经由过程存储历程的前往值来断定你的注进是不是乐成.取决于你想完成甚么,你大概不必要失掉数据。你能够找到前往给你的数据的其他意义。存储历程注进比一样平常的查询注进要简单些,存储历程的注进的缺点使用看起来象如许。
  simplequoted.asp?city=seattle;EXECmaster.dbo.xp_cmdshellcmd.exedirc:
  注重,
  Noticehowavalidargumentissuppliedatthebeginningandfollowedbyaquoteandthefinalargumenttothestoredprocedurehasnoclosingquote.Thiswillsatisfythesyntaxrequirementsinherentinmostquotedvulnerabilities.Youmayalsohavetodealwithparentheses,additionalWHEREstatements,etc.可是在这今后将不必要忧虑列和数据的范例的婚配。这个大概缺点的输入象程序没法前往毛病信息一样。我最喜好存储历程。
  5.3.4.2.xp_cmdshell
  xp_cmdshell{command_string}[,no_output]
  master.dbo.xp_cmdshell是存储历程的圣杯,它带来了一个成绩,可以挪用命令行的数据库用户的和他的运转权限,这个其实不可用除非这个网页程序利用的数据库用户是SA.运转级别为6
  sp_makewebtask[@outputfile=]outputfile,[@query=]query
  6.别的一个好的挪用工具是master.dbo.sp_makewebtask,象你所看的,它是一个当地的输入文件和一个SQLstatement。sp_makewebtask能够查询并创建一个包括输入的网页。注重你能够象利用一个UNC路径名一样利用一个当地输入。这个意义就是这个输入文件能够放有在任何一台连在Internet而且有个可写的SMB共享(SMB哀求不必要任何的身份考证)。假如有一个防火墙限定了服务器对Internet,试着把输入文件放在网页目次下(你要晓得大概推测网页的目次)。一样值得注重的是援用查询多是包含实行其他的存储历程。Making"EXECxp_cmdshelldirc:"这个查询将在网页中给出"dirc:"的输入。当你举行嵌套援用的时分,记得独自的援用和双引号.
  4.1数据处置
  一切的客户端数据能够被歹意的提交的字符或字符串扫除。这些大概在一切的使用程序做到,不单单是利用SQL查询的。Strippingquotesorputtingbackslashesinfrontofthemisnowherenearenough.最好的过滤数据的体例是不必划定规矩的表达体例,使它只包含你所想要的字符范例。举个例子,下边的regxp将只能前往字母和数字,尽量的过滤象s/[^0-9a-zA-Z]//g如许的特别字符。大概的时分只管利用数字,在这今后只利用数字和字母。假如你必要包含林林总总的标记或标点。确信完整的把它们转换成html标志,像“"e;"or">”。比方,一个用户提交了一个email地点只同意利用数字和字母另有"@","_","."和"-"。仅仅只要这些字符能够转换成html标志。
  4.2.编写平安的web程序
  这里一样有很少的特别的sql注进划定规矩。First,prependandappendaquotetoalluserinput。
  只管数据使数字。其次,限定网页使用程序的数据库用户在数据库里的权限。不要给这个用户会见一切的存储历程的权力假如这个用户只必要会见一些预界说的。
  这部分包含了一切在sql注进中有效的体系表,你能够在google上搜刮到每个的表的列的界说
  5.1.MSSQLServer
  Sysobjects
  syscolumns
  5.2.MSAccessServer
  MSysACEs
  MSysObjects
  MSysQueries
  MSysRelationships
  5.3.Oracle
  SYS.USER_OBJECTS
  SYS.TABSYS.USER_TABLES
  SYS.USER_VIEWSSYS.ALL_TABLE
  SSYS.USER_TAB_COLUMNS
  SYS.USER_CONSTRAINTSSYS.USER_TRIGGERS
  SYS.USER_CATALOG
“通过有能力的DBA的一个简单计划,MySQL可以达到令人难以想像的运行速度,”一位资深DBA如此表示。MySQL中没有多余的功能来拖累CPU或占用内存。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-19 16:55:01 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
小妖女 该用户已被删除
板凳
发表于 2015-1-25 12:28:07 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-2 22:04:53 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-8 10:53:47 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
谁可相欹 该用户已被删除
6#
发表于 2015-2-25 09:19:34 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-7 19:24:06 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
老尸 该用户已被删除
8#
发表于 2015-3-15 12:12:56 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
蒙在股里 该用户已被删除
9#
发表于 2015-3-22 01:09:01 | 只看该作者
如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-11 07:52

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表