PHP中SQL注入与跨站攻击的防范说课讲解_第1页
PHP中SQL注入与跨站攻击的防范说课讲解_第2页
PHP中SQL注入与跨站攻击的防范说课讲解_第3页
PHP中SQL注入与跨站攻击的防范说课讲解_第4页
PHP中SQL注入与跨站攻击的防范说课讲解_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。PHP中SQL注入与跨站攻击的防范-HYPERLINK/blog/722458PHP中SQL注入与跨站攻击的防范SQLinjection即SQL注入是我们每个WEB程序员都需要面对的问题,一个WEB应用假如没有起码的安全性,那么其它的一切就可以免谈了。注入问题在ASP上可谓是闹得沸沸扬扬,当然还有不少PHP程序“遇难”。至于SQLinjection的详情,网上的文章很多,在此就不作赘述。追其罪恶之源,就是我们误以为用户提交的数据是可靠的。无论你是否有足够的PHP安全开发经验,本文的目的就是用来帮助你构建

2、更为安全的在线应用程序。针对不同的情况,我们可以使用下面的一种或几种方法来对SQL注入的风险进行预防。1、在书写SQL语句时不要省略单引号,即使是整型字段也应该加上单引号。首先,从技术上讲,引号对于数字值来说是不需要使用的。但是,假如你不使用引号把例如书籍数量这样的一个值括起来,并且假如你的用户把一个空值输入到你的表单中,那么,你将会看到一个类似下面的查询:SELECT*FROMbooksWHEREnum=当然,这个查询从语法上讲是无效的;但是,下面的语法却是有效的:SELECT*FROMbooksWHEREnum=第二个查询虽然也不会返回任何结果,但是至少它不会返回一个错误消息。其次,单引号

3、可以增加注入者的难度,第二句由于把变量放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第一句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。2、检查用户提交的值的类型,对接收到的整型参数使用intval()强制转换成整形。我们知道SQL注入的主要来源往往出在一个意料之外的表单提交或URL参数中,所以当你接受一个由用户提交的参数时,你应该有相当的权利来确定你想取得什么样的输入内容。在以前的学习中我们已经讨论过很多这样或那样的校验问题。因

4、此我们只要简单的总结当时我们讨论的要点即可比较轻易的检查用户提交数据的有效性。假如你期望得到的是一个数值,那么你可以使用下面这些技术之一来确保你得到的参数的安全性。使用is_int()函数(或is_integer()或is_long()。使用gettype()函数。使用intval()函数。使用settype()函数。我们通常把传送过来的整型参数使用intval()函数强制转换成整形,因为假如不这样做,接收到的查询子句很可能会附带着其它一些我们并不愿看到的语句,比如原本应该是“nid=17”可能会成为“nid=17or1=1”,这会使我们预计的SQL语句变成这样:SELECT*FROMnews

5、WHEREnid=17or1=1这对于一个新闻表中的信息可能不会造成什么大的危害,但假如是在显示某个用户的信息时呢?此外,为了检查用户输入内容的长度,你可以使用strlen()函数。为了检查一个期望的时间或日期是否有效,你可以使用strtotime()函数。它似乎一定能够确保一位用户的提交参数中没有包含分号字符(除非标点符号可以被合法地包括在内)。你可以借助于strpos()函数轻易地实现这一点,如下所示:if(strpos($variety,;)exit($varietyisaninvalidvalueforvariety!);正如我们在前面所提到的,只要你仔细分析你的用户输入期望,那么,你

6、应该能够很轻易地检查出其中存在的许多问题。3、使用mysql_real_escape_string()函数从查询字符串中过滤掉危险字符尽管有很多文章已经讨论过如何过滤掉危险字符的问题,但是在本文中还是让我们再次简单的强调并归纳一下这个问题:不要使用magic_quotes_gpc指令或它的搭挡addslashes()函数,此函数在程序开发中应该是被限制使用的,在PHP的下一个版本PHP6中已经取消了对此函数的支持,并且此函数还要求使用额外的步骤stripslashes()函数。相比之下,mysql_real_escape_string()函数更为适合,受此函数影响的字符包括:x00,n,r,x

7、1a。这二个函数的功能类似,但addslashes()函数无法转换以十六进制形式提交的字符,另外需要注重的是,mysqli_real_escape_string()函数需要先建立数据库连接,因为需要考虑到连接的当前字符集,通常防止数据库被攻击的使用方法如下:4、对用户输入的字符进行HTML编码以防止跨站攻击(这个一般在服务器端进行过滤)对于数据库防止SQL注入的问题,通过前面三点所述综合的运用我们似乎全部解决,但假如用户提交的内容中有一些不良的HTML标签则可能会导致页面变形,严重的还可能会出现跨站攻击之类的安全问题,所以对带有HTML的内容增加过滤检查是很有必要的。例如一段接收用户的输入并显

8、示的功能代码,一但恶意用户输入:location.href=;这样的一条数据,网页在显示该条数据时,用户的浏览器将会跳转到恶意代码指定的地址,这就是最简单的跨站攻击,我们试想一下,假如跳转的地址是一个伪造原网站来骗取用户密码或银行信息的页面,那么会是什么样的后果?对于这类攻击行为,就需要我们在接收用户提交的数据时在服务器端进行过滤,我们可以编写一个过滤函数用来查询提交数据中有害字符并将之替换掉,还有一种较简便的方式就把用户所提交的内容中“”,“&”等符号转换成正确的HTML编码,而函数htmlspecialchars()正是干这个活的。htmlspecialchars()功能:将“&”五个字符

9、转换成HTML字符串。语法:stringhtmlspecialchars(string,quotestyle,character-set);参数:ENT_NOQUOTES,不对任何引号进行格式化;ENT_QUOTES,对单引号及双引号进行格式化;默认为ENT_COMPAT,仅编码双引号。返回值:字符串因此,用户提交的数据经过格式化后为:location.href=;这样代码就失去了原有的攻击功能,可以基本预防脚本攻击的潜在危险,假如不明白这之间的区别,可以测试下面这段代码:?php$str=PHP3C技术分享社区;echo$str;echo;echohtmlspecialchars($str);?另外,转换非凡字符为HTML字符串还可以使用函数htmlentities(),使用方法相同,它与htmlspecialchars在格式化带有英文字符的html代码的时候没有什么区别,但是htmlentities对中文字符也不放过,所以同样的调用方法得出来的结果是由于没有指定字符集而默认由ISO-8859-1代替,中文字符部分变为一堆乱码,因此我们在使用的时候,需要指定参数character-set为我们页面使用的字符集,例如UTF-8或GB2312。SQL注入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论