当前位置: 首页 > 编程日记 > 正文

php开发面试题---攻击网站的常用手段有哪些,及如何预防(整理)

php开发面试题---攻击网站的常用手段有哪些,及如何预防(整理)

一、总结

一句话总结:

比较记忆:注意比较各种攻击的区别,比如csrf和xss,以及xss和sql,这样才能记住

1、Sql注入是什么?

执行sql操作的时候:用户的输入语句中包含sql或sql部分

依赖用户输入做sql查询的位置可能被用户输入sql语句:比如用户查询的关键字输入框

2、sql注入实例?

攻击者评论文章,评论里面是删除整个数据库的sql语句
在用户名框输入’or’=’or’或 ‘or 1=’1 然后sql如下:$sql =”select * from phpben where user_name=’ ‘or 1=’1′ and pwd =” “;
//正常语句  
$sql =select * from phpben where user_name=’admin’ and pwd =123′”;  
//在用户名框输入’or=or’或 ‘or 1=1 然后sql如下  
$sql =select * from phpben where user_name=’ ‘or=orand pwd =” “;  
$sql =select * from phpben where user_name=’ ‘or 1=1and pwd =” “;

3、Sql注入如何防范?

1、对存入数据可的字段进行转义:比如addslashes 和stripslashes
2、对用户的查询进行过滤或转义:过滤掉数据库查询语句,或者转义
攻击者评论文章,评论里面是删除整个数据库的sql语句
在用户名框输入’or=or’或 ‘or 1=1 然后sql如下:$sql =select * from phpben where user_name=’ ‘or 1=1and pwd =” “;

4、Xss攻击的中英文名叫什么?

cross site script:跨站脚本,为什么不叫css,为了不和div+css混淆。
跨站脚本

5、跨站脚本攻击实例?

攻击者评论某文章,评论的内容里面包含让用户跳转到某个网站的php代码,所有打开这篇文章的人都会跳转到这个网站

6、Sql注入和Xss攻击的区别是什么?

Xss攻击是脚本,就是会在页面执行的那种,比如php,js
sql注入攻击是将sql语句注入到数据库

7、Sql注入和Xss攻击的实例?

Sql注入:攻击者评论文章,评论里面是删除整个数据库的sql语句
Xss攻击:攻击者评论某文章,评论的内容里面包含让用户跳转到某个网站的php代码,所有打开这篇文章的人都会跳转到这个网站

8、xss攻击如何防范?

原理:防xss方法其实和防注入很相似,都是一些过滤、代替、实体化等方法
防php:过滤或移除特殊的Html标签:例如:< 、>、<,、> ‘、”、<script>、 <iframe> 、<,、>、”
防js:过滤触发JavaScript 事件的标签。例如 onload、onclick、onfocus、onblur、onmouseover等等。

9、CSRF攻击的英文名是什么?

cross site request forgery:跨站请求伪造

10、CSRF攻击和Xss攻击的区别是什么?

用脑子:看名字就知道了:CSRF攻击和Xss攻击,前面的cs=xs,区别就是在rf和s上
CSRF攻击:伪造请求:request forgery:cross site request forgery
Xss攻击:脚本:script:cross site script

11、CSRF攻击攻击实例?

淘宝没退出被利用:我登录淘宝并且没有退出,又登录了不良网站,不良网站用淘宝的session和cookie做买东西的操作

12、CSRF防范方法?

敏感操作本站请求才能做:比如修改密码
本站有外链的话做些必要操作:安全的外链网站可以不必处理:如当你点击QQ邮件里面的长外链时候,回跳转到一个页面提示“有风险”之类

敏感操作本站请求才能做:严密操控执行入口:执行一些敏感操作比如改密码这些操作前判断请求来源,只有本站服务器发的请求才可以执行。判断方法可以判断ip来源。非本站服务器ip不会执行。
本站有外链的话做些必要操作:安全的外链网站可以不必处理:如当你点击QQ邮件里面的长外链时候,回跳转到一个页面提示“有风险”之类,这样不仅可以减低跳出率,一些不懂的人看到这样的提示,若不是非必要而是处于好奇点击的连接一般不会继续点击访问;还有是QQ邮件正文里的图片在加载内容时是不加载图片的,要点击“显示图片”按钮才显示图片,这里一个原因之一就是避免攻击。

13、CC攻击是什么?

CC(ChallengeCollapsar)

攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。
CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。

14、cc攻击的原理是什么?

模拟多个用户:(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面)
动态资源需要访问数据库,消耗内存和cpu:如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间
本质:造成服务器较高的内存和cpu消耗:这样服务器就变慢了

一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。
CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。

15、如何防止盗链(代码)?

方法:在Apache htaccess添加相关代码:判断ip,只有本站服务器才能使用站点资源,否则不能使用。

盗链问题增加服务器的负担。盗链就是盗链网站盗取被盗链网站资源来实现一些功能。盗链方面主要是图片、视频、以及其他资源下载文件。
代码:
(1)在Apache htaccess添加

RewriteEngine on   
RewriteCond %{HTTP_REFERER} !^$ [NC]  
RewriteCond %{HTTP_REFERER} !phpben.com [NC]  
RewriteCond %{HTTP_REFERER} !google.com [NC]   
RewriteCond %{HTTP_REFERER} !baidu.com [NC]   
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]  
RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L]  
RewriteRule ^(.*)$ http:\/\/phpben.com\/image\/$1 [L]

这样,凡是不是phpben.com google.com baidu.com zhuaxia.com 域名请求的都返回replace.gif代替返回

二、PHP开发中常见的安全问题详解和解决方法

转自或参考:PHP开发中常见的安全问题详解和解决方法
https://www.cnblogs.com/walblog/articles/8331399.html

这篇文章主要介绍了PHP开发中常见的安全问题详解和解决方法,详细介绍了例如:Sql注入、CSRF、Xss、CC等攻击手段的背景知识以及解决方法,需要的朋友可以参考下。

浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF

前言:

首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记、细心总结文章,里面有些是我们phper不易发现或者说不重视的东西。所以笔者写下来方便以后查阅。在大公司肯定有专门的web安全测试员,安全方面不是phper考虑的范围。但是作为一个phper对于安全知识是:“知道有这么一回事,编程时自然有所注意”。

目录:

1、php一些安全配置
(1)关闭php提示错误功能
(2)关闭一些“坏功能”
(3)严格配置文件权限。
2、严格的数据验证,你的用户不全是“好”人
2.1为了确保程序的安全性,健壮性,数据验证应该包括内容。
2.2程序员容易漏掉point或者说需要注意的事项
3、防注入
   3.1简单判断是否有注入漏洞以及原理
   3.2常见的mysql注入语句
       (1)不用用户名和密码
       (2)在不输入密码的情况下,利用某用户
       (3)猜解某用户密码
       (4)插入数据时提权
       (5)更新提权和插入提权同理
       (6)恶意更新和删除
       (7)union、join等
       (8)通配符号%、_
       (9)还有很多猜测表信息的注入sql

33防注入的一些方法
       2.3.1 php可用于防注入的一些函数和注意事项。
       2.3.2防注入字符优先级。
2.3.3防注入代码
    (1)参数是数字直接用intval()函数
    (2)对于非文本参数的过滤
(3)文本数据防注入代码。
(4)当然还有其他与addslashes、mysql_escape_string结合的代码。
4、防止xss攻击
4.1Xss攻击过程
4.2常见xss攻击地方
4.3防XSS方法
5、CSRF
5.1简单说明CSRF原理
5.2防范方法
6、防盗链
7、防拒CC攻击

1、php一些安全配置
(1)关闭php提示错误功能

在php.ini 中把display_errors改成

1 display_errors = OFF

或在php文件前加入

1 error_reporting(0)

1) 使用error_reporting(0);失败的例子:

A文件代码:

1 <?  
2 error_reporting(0);  
3 echo 555  
4 echo 444;  
5 ?>

错误:

1 Parse error: parse error, expecting `’,” or `';” in E:\webphp\2.php on line 4

2)使用error_reporting(0);成功的例子:
a文件代码:

1 <?php  
2 error_reporting(0);  
3 include(“b.php”);  
4 ?>

b文件代码:

1 <?php  
2 echo 555  
3 echo 444;  
4 ?>

这是很多phper说用error_reporting(0)不起作用。第一个例子A.php里面有致命错误,导致不能执行,不能执行服务器则不知有这个功能,所以一样报错。

第二个例子中a.php成功执行,那么服务器知道有抑制错误功能,所以就算b.php有错误也抑制了。

ps:抑制不了mysql错误。

(2)关闭一些“坏功能”

1)关闭magic quotes功能

在php.ini 把magic_quotes_gpc = OFF
避免和addslashes等重复转义

2)关闭register_globals = Off

在php.ini 把register_globals = OFF

在register_globals = ON的情况下

地址栏目:http://www.jb51.net?bloger=benwin

1 <?php  
2 //$bloger = $_GET[‘bloger’]   //因为register_globals = ON 所以这步不用了直接可以用$bloger
3   echo $bloger;  
4 ?>

这种情况下会导致一些未初始化的变量很容易被修改,这也许是致命的。所以把register_globals = OFF关掉

(3)严格配置文件权限。

为相应文件夹分配权限,比如包含上传图片的文件不能有执行权限,只能读取

2、严格的数据验证,你的用户不全是“好”人。

记得笔者和一个朋友在讨论数据验证的时候,他说了一句话:你不要把你用户个个都想得那么坏!但笔者想说的这个问题不该出现在我们开发情景中,我们要做的是严格验证控制数据流,哪怕10000万用户中有一个是坏用户也足以致命,再说好的用户也有时在数据input框无意输入中文的时,他已经不经意变“坏”了。

2.1为了确保程序的安全性,健壮性,数据验证应该包括

(1)     关键数据是否存在。如删除数据id是否存在
(2)     数据类型是否正确。如删除数据id是否是整数
(3)     数据长度。如字段是char(10)类型则要strlen判断数据长度
(4)     数据是否有危险字符

数据验证有些人主张是把功能完成后再慢慢去写安全验证,也有些是边开发边写验证。笔者偏向后者,这两种笔者都试过,然后发现后者写的验证相对健壮些,主要原因是刚开发时想到的安全问题比较齐全,等开发完功能再写时有两个问题,一个phper急于完成指标草草完事,二是确实漏掉某些point。

2.2程序员容易漏掉point或者说需要注意的事项:

(1)     进库数据一定要安全验证,笔者在广州某家公司参与一个公司内部系统开发的时候,见过直接把$_POST数据传给类函数classFunctionName($_POST),理由竟然是公司内部使用的,不用那么严格。暂且不说逻辑操作与数据操控耦合高低问题,连判断都没判断的操作是致命的。安全验证必须,没任何理由推脱。
(2)     数据长度问题,如数据库建表字段char(25),大多phper考虑到是否为空、数据类型是否正确,却忽略字符长度,忽略还好更多是懒于再去判断长度。(这个更多出现在新手当中,笔者曾经也有这样的思想)
(3)     以为前端用js判断验证过了,后台不需要判断验证。这也是致命,要知道伪造一个表单就几分钟的事,js判断只是为了减少用户提交次数从而提高用户体验、减少http请求减少服务器压力,在安全情况下不能防“小人”,当然如果合法用户在js验证控制下是完美的,但作为phper我们不能只有js验证而抛弃再一次安全验证。
(4)     缺少对表单某些属性比如select、checkbox、radio、button等的验证,这些属性在web页面上开发者已经设置定其值和值域(白名单值),这些属性值在js验证方面一般不会验证,因为合法用户只有选择权没修改权,然后phper就在后端接受数据处理验证数据的时候不会验证这些数据,这是一个惯性思维,安全问题也就有了,小人一个伪表单。
(5)     表单相应元素name和数据表的字段名一致,如用户表用户名的字段是user_name,然后表单中的用户名输入框也是user_name,这和暴库没什么区别。
(6)     过滤危险字符方面如防注入下面会独立讲解。

3、防注入

3.1简单判断是否有注入漏洞以及原理。

网址:http://www.jb51.net/benwin.php?id=1 运行正常,sql语句如:select  *  from phpben where id = 1

(1) 网址:http://www.jb51.net/benwin.php?id=1′   sql语句如:select  *  from phpben where id = 1′  然后运行异常 这能说明benwin.php文件没有对id的值进行“’” 过滤和intval()整形转换,当然想知道有没有对其他字符如“%”,“/*”等都可以用类似的方法穷举测试(很多测试软件使用)
(2)网址:http://www.jb51.net/benwin.php?id=1 and 1=1  则sql语句可能是 select  *  from phpben where id = 1 and 1=1,运行正常且结果和http://www.jb51.net/benwin.php?id=1结果一样,则说明benwin.php可能没有对空格“ ”、和“and”过滤(这里是可能,所以要看下一点)
(3)网址:http://www.jb51.net/benwin.php?id=1 and 1=2则sql语句可能是 select  *  from phpben where id = 1 and 1=2 如果运行结果异常说明sql语句中“and 1=2”起作用,所以能3个条件都满足都则很确定的benwin.php存在注入漏洞。

ps:这里用get方法验证,post也可以,只要把值按上面的输入,可以一一验证。

3.2常见的mysql注入语句。

(1)不用用户名和密码

1 //正常语句  
2 $sql =”select * from phpben where user_name=’admin’ and pwd =’123′”;  
3 //在用户名框输入’or’=’or’或 ‘or 1=’1 然后sql如下  
4 $sql =”select * from phpben where user_name=’ ‘or’=’or” and pwd =” “;  
5 $sql =”select * from phpben where user_name=’ ‘or 1=’1′ and pwd =” “;

这样不用输入密码。话说笔者见到登录框都有尝试的冲动。

(2)在不输入密码的情况下,利用某用户。

1 //正常语句  
2 $sql =”select * from phpben where user_name=’$username’ and pwd =’$pwd'”;  
3 //利用的用户名是benwin 则用户名框输入benwin’#  密码有无都可,则$sql变成  
4 $sql =”select * from phpben where user_name=’ benwin’#’ and pwd =’$pwd'”;

这是因为mysql中其中的一个注悉是“#”,上面语句中#已经把后面的内容给注悉掉,所以密码可以不输入或任意输入。网上有些人介绍说用“/*”来注悉,笔者想提的是只有开始注悉没结束注悉“*/”时,mysql会报错,也不是说“/**/”不能注悉,而是这里很难添加上“*/”来结束注悉,还有“– ”也是可以注悉mysql 但要注意“–”后至少有一个空格也就是“– ”,当然防注入代码要把三种都考虑进来,值得一提的是很多防注入代码中没把“– ”考虑进防注入范围。

(3)猜解某用户密码

1 //正常语句  
2 $sql =”select * from phpben.com where user_name=’$username’ and pwd =’$pwd'”;  
3 //在密码输入框中输入“benwin’ and left(pwd,1)=’p’#”,则$sql是  
4 $sql =”select * from phpben.com where user_name=’ benwin’ and left(pwd,1)=’p’#’ and pwd =’$pwd'”;

如果运行正常则密码的密码第一个字符是p,同理猜解剩下字符。

(4)插入数据时提权

1 //正常语句,等级为1  
2 $sql = “insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin’,’iampwd’,1) “;  
3 //通过修改密码字符串把语句变成  
4 $sql = “insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin’,’iampwd’,5)#’,1) “;  
5 $sql = “insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin’,’iampwd’,5)–  ‘,1) “;这样就把一个权限为1的用户提权到等级5

(5)更新提权和插入提权同理

1 //正常语句  
2 $sql = “update phpben set  `user_name` =’benwin’, level=1″;  
3 //通过输入用户名值最终得到的$sql  
4 $sql = “update phpben set  `user_name` =’benwin’,level=5#’, level=1″;  
5 $sql = “update phpben set  `user_name` =’benwin’,level=5–  ‘, level=1″;

(6)恶意更新和删除

1 //正常语句  
2 $sql = “update phpben set `user_name` = ‘benwin’ where id =1″;  
3 //注入后,恶意代码是“1 or id>0”  
4 $sql = “update phpben set `user_name` = ‘benwin’ where id =1 or id>0″;  
5 //正常语句  
6 $sql = “update phpben set  `user_name` =’benwin’ where id=1″;  
7 //注入后  
8 $sql = “update phpben set  `user_name` =’benwin’ where id>0#’ where id=1″;  
9 $sql = “update phpben set  `user_name` =’benwin’ where id>0– ‘ where id=1″;

(7)union、join等

1 //正常语句  
2 $sql =”select * from phpben1 where `user_name`=’benwin’ “;  
3 //注入后  
4 $sql =”select * from phpben1 where`user_name`=’benwin’ uninon select * from phpben2#’ “;  
5 $sql =”select * from phpben1 where`user_name`=’benwin’ left join……#’ “;

(8)通配符号%、_

1 //正常语句  
2 $sql =”select * from phpben where `user_name`=’benwin’ “;  
3 //注入通配符号%匹配多个字符,而一个_匹配一个字符,如__则匹配两个字符  
4 $sql =”select * from phpben where `user_name` like ‘%b’ “;  
5 $sql =”select * from phpben where `user_name` like ‘_b_’ “;

这样只要有一个用户名字是b开头的都能正常运行,“ _b_”是匹配三个字符,且这三个字符中间一个字符时b。这也是为什么有关addslashes()函数介绍时提示注意没有转义%和_(其实这个是很多phper不知问什么要过滤%和_下划线,只是一味的跟着网上代码走)

(9)还有很多猜测表信息的注入sql

1 //正常语句  
2 $sql =”select * from phpben1 where`user_name`=’benwin'”;  
3 //猜表名,运行正常则说明存在phpben2表  
4 $sql =”select * from phpben1 where`user_name`=’benwin’ and (select count(*) from phpben2 )>0#’ “;  
5 //猜表字段,运行正常则说明phpben2表中有字段colum1  
6 $sql =”select * from phpben1 where`user_name`=’benwin’ and (select count(colum1) from phpben2 )>0#'”;  
7 //猜字段值  
8 $sql =”select * from phpben1 where`user_name`=’benwin’ and left(pwd,1)=’p’#””;

当然还有很多,笔者也没研究到专业人士那种水平,这里提出这些都是比较常见的,也是phper应该知道并掌握的,而不是一味的在网上复制粘贴一些防注入代码,知然而不解其然。

下面一些防注入方法回看可能更容易理解。

3.3防注入的一些方法

3.3.1 php可用于防注入的一些函数和注意事项。

(1)addslashes 和stripslashes。

Addslashes给这些 “’”、“””、“\”,“NULL” 添加斜杆“\’”、“\””、“\\”,“\NULL”, stripslashes则相反,这里要注意的是php.ini是否开启了magic_quotes_gpc=ON,开启若使用addslashes会出现重复。所以使用的时候要先get_magic_quotes_gpc()检查

一般代码类似:

1 if(!get_magic_quotes_gpc())  
2 {  
3          $abc = addslashes($abc);  
4 }

其实这个稍微学习php一下的人都知道了,只不过笔者想系统点介绍(前面都说不是专家级文章),所以也顺便写上了。addslashes

(2)mysql_escape_string()和mysql_ real _escape_string()

mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string

1 if (PHP_VERSION >= ‘4.3’)  
2 {  
3 $string  =  mysql_real_escape_string($string);  
4 }else  
5 {  
6 $string  =  mysql_escape_string($string );  
7 }

mysql_escape_string()和mysql_ real _escape_string()却别在于后者会判断当前数据库连接字符集,换句话说在没有连接数据库的前提下会出现类似错误:

1 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user ‘ODBC’@’localhost’ (using password: NO) in E:\webphp\test.php on line 11

(3)字符代替函数和匹配函数
str_replace() 、perg_replace()这些函数之所以也在这里提是因为这些函数可以用于过滤或替代一些敏感、致命的字符。

3.3.2防注入字符优先级。

防注入则要先知道有哪些注入字符或关键字,常见的mysql注入字符有字符界定符号如“’”、“””;逻辑关键字如“and”、“or”;mysql注悉字符如“#”,“– ”,“/**/”;mysql通配符“%”,“_”;mysql关键字“select|insert|update|delete|*|union|join|into|load_file|outfile”

(1)对于一些有规定格式的参数来说,防注入优先级最高的是空格” ”。

如一些银行卡号,身份证号,邮箱,电话号码,,生日,邮政编码等这些有自己规定的格式且格式规定不能有空格符号的参数,在过滤的时候一般最先过滤掉空格(包括一些空格“变种”),因为其他字符界定符号,逻辑关键字,mysql注悉,注意下图可以看出重要的是“’”,“ ”

ps:空格字符的变种有:“%20”,“\n”,“\r”,“\r\n”,“\n\r”,“chr(“32″)” 这也是为什么mysql_escape_string()和mysql_real_escape_string() 两个函数转义“\n”,“\r”。其实很多phper只知道转义\n,\r而不知原因,在mysql解析\n,\r时把它们当成空格处理,笔者测试验证过,这里就不贴代码了。

(2)“and”,“or”,“\”,“#”,“– ”

逻辑关键可以组合很多注入代码;mysql注悉则把固有sql代码后面的字符全部给注悉掉从而让注入后的sql语句能正常运行;“\”也是能组合很多注入字符\x00,\x1a。

ps:sql解析“#”,“– ”是大多数mysql防注入代码没有考虑到的,也是很多phper忽略。还有因为一些phper给参数赋值的时候会有用“-”来隔开,所以笔者建议不要这样写参数,当然也可以再过滤参数的时候“– ”(注意有空格的,没空格不解析为注悉)当一个整体过滤而不是过滤“-” ,这样就避免过多过滤参数。

(3)“null”,“%”,“_”

这几个不能独立,都不要在特定情况下,比如通配字符“%,_”都要在mysql like子句的前提下。所以“%”,“_”的过滤一般在搜索相关才过滤,不能把它们纳入通常过滤队列,因为有些如邮箱就可以有”_”字符

(4)关键字“select|insert|update|delete|*|union|join|into|load_file|outfile”

也许你会问怎么这些重要关键字却优先级这么低。笔者想说的是因为这些关键字在没有“’”,“””,“ ”,“and”,“or”等情况下购不成伤害。换句话说这些关键字不够“独立”,“依赖性”特别大。当然优先级低,不代表不要过滤。


3.3.3防注入代码。

(1)参数是数字直接用intval()函数

注意:现在很多网上流行的防注入代码都只是只是用addslashes()、mysql_escape_string()、mysql_real_escape_string()或三者任意组合过滤,但phper以为过滤了,一不小心一样有漏洞,那就是在参数为数字的时候:

1 $id = addslashes($_POST[‘id’]); //正确是$id = intval($_POST[‘id’]);  
2 $sql =” select * from phpben.com where id =$id”;  
3 $sql =” select * from phpben.com where id =1 or 1=1″;

对比容易发现,post过来的数据通过addslashes过滤后的确很多注入已经不起作用,但是$id并没有intval,导致漏洞的存在,这是个小细节,不小心则导致漏洞。

(2)对于非文本参数的过滤

文本参数是指标题、留言、内容等可能有“’”,“’”等内容,过滤时不可能全部转义或代替。

但非文本数据可以。

 1 function _str_replace($str )  
 2 {  
 3      $str = str_replace(” “,””,$str);  
 4      $str = str_replace(“\n”,””,$str);  
 5      $str = str_replace(“\r”,””,$str);  
 6      $str = str_replace(“‘”,””,$str);  
 7      $str = str_replace(‘”‘,””,$str);  
 8      $str = str_replace(“or”,””,$str);  
 9      $str = str_replace(“and”,””,$str);  
10      $str = str_replace(“#”,””,$str);  
11      $str = str_replace(“\\”,””,$str);  
12      $str = str_replace(“– “,””,$str);  
13      $str = str_replace(“null”,””,$str);  
14      $str = str_replace(“%”,””,$str);  
15      //$str = str_replace(“_”,””,$str);  
16      $str = str_replace(“>”,””,$str);  
17      $str = str_replace(“<“,””,$str);  
18      $str = str_replace(“=”,””,$str);  
19      $str = str_replace(“char”,””,$str);  
20      $str = str_replace(“declare”,””,$str);  
21      $str = str_replace(“select”,””,$str);  
22      $str = str_replace(“create”,””,$str);  
23      $str = str_replace(“delete”,””,$str);  
24      $str = str_replace(“insert”,””,$str);  
25      $str = str_replace(“execute”,””,$str);  
26      $str = str_replace(“update”,””,$str);  
27      $str = str_replace(“count”,””,$str);  
28      return $str;  
29 }

ps:还有一些从列表页操作过来的一般href是”phpben.php?action=delete&id=1”,这时候就注意啦,_str_replace($_GET[‘action’])会把参数过滤掉,笔者一般不用敏感关键作为参数,比如delete会写成del,update写成edite,只要不影响可读性即可;

还有上面代码过滤下划线的笔者注悉掉了,因为有些参数可以使用下划线,自己权衡怎么过滤;

有些代码把关键字当重点过滤对象,其实关键字的str_replace很容易“蒙过关”,str_replace(“ininsertsert”)过滤后的字符还是insert,所以关键的是其他字符而不是mysql关键字。

(3)文本数据防注入代码。

文本参数是指标题、留言、内容等这些数据不可能也用str_replace()过滤掉,这样就导致数据的完整性,这是很不可取的。

代码:

 1 function no_inject($str)  
 2  
 3 {  
 4          if(is_array($str))  
 5          {  
 6                    foreach($str as $key =>$val)  
 7                    {  
 8                            $str[$key]=no_inject($val);  
 9                    }  
10          }else  
11          {  
12                    $str = str_replace(” “,” “,$str);  
13                    $str = str_replace(“\\”,”\”,$str);  
14                    $str = str_replace(“‘”,”‘”,$str);  
15                    $str = str_replace(‘”‘,”””,$str);  
16                    $str = str_replace(“or”,”or”,$str);  
17                    $str = str_replace(“and”,”and”,$str);  
18                    $str = str_replace(“#”,”#”,$str);  
19                    $str = str_replace(“– “,”– “,$str);  
20                    $str = str_replace(“null”,”null”,$str);  
21                    $str = str_replace(“%”,”%”,$str);  
22                    //$str = str_replace(“_”,””,$str);  
23                    $str = str_replace(“>”,”>”,$str);  
24                    $str = str_replace(“<“,”<“,$str);  
25                    $str = str_replace(“=”,”=”,$str);  
26                    $str = str_replace(“char”,”char”,$str);    
27                    $str = str_replace(“declare”,”declare”,$str);  
28                    $str = str_replace(“select”,”select”,$str);  
29                   $str = str_replace(“create”,”create”,$str);  
30                   $str = str_replace(“delete”,”delete”,$str);  
31                   $str = str_replace(“insert”,”insert”,$str);  
32                  $str = str_replace(“execute”,”execute”,$str);  
33                  $str = str_replace(“update”,”update”,$str);  
34                  $str = str_replace(“count”,”count”,$str);  
35          }  
36     return $str;  
37 }

(4)当然还有其他与addslashes、mysql_escape_string结合的代码。

防注入的代码其实来来去去都是那些组合,然后根据自己程序代码变通,笔者这些代码也是没考虑全的,不如cookes、session、request都没全过滤。重要是知道其中原理,为什么过滤这些字符,字符有什么危害。

4、防止xss攻击

XSS:cross site script 跨站脚本,为什么不叫css,为了不和div+css混淆。

4.1Xss攻击过程:

(1)发现A站有xss漏洞。

(2)注入xss漏洞代码。可以js代码,木马,脚本文件等等,这里假如A站的benwin.php这个文件有漏洞。

(3)通过一些方法欺骗A站相关人员运行benwin.php,其中利用相关人员一些会员信息如cookies,权限等。

相关人员:

管理员(如贴吧版主),管理员一般有一定权限。目的是借用管理员的权限或进行提权,添或加管理员,或添加后门,或上传木马,或进一步渗透等相关操作。

A站会员:会员运行A站的benwin.php。目的一般是偷取会员在A站的信息资料。

方法:

1)       在A站发诱骗相关人到benwin.php的信息,比如网址,这种是本地诱骗

2)       在其他网站发诱骗信息或者发邮件等等信息。

一般通过伪装网址骗取A站相关人员点击进benwin.php

(4)第三步一般已经是一次xss攻击,如果要更进一步攻击,那不断重复执行(2)、(3)步以达到目的。

简单例说xss攻击

代码:benwin.php文件

 1 <html>  
 2 <head>  
 3 <title>简单xss攻击例子</title></head>  
 4 <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>  
 5 <dody>  
 6 <form action=”phpben.com?user_name=<?php echo $user_name; ?>”>  
 7 <input type=”submit” value=”提交” >  
 8 </form>  
 9 </body>  
10 </html>

当用户名$user_name的值是“benwin” onSubmit=”alert(‘这是xss攻击的例子’);” class= “”(这里)

1 <form action=”phpben.com?user_name=benwin” onSubmit=”alert(‘这是xss攻击的例子’);” class= “” >  
2 <input type=”submit” value=”提交” >  
3 </form>

当提交表单的时候就会弹出提示框。

(1)     很明显$user_name在保存进数据库的时候没有过滤xss字符(和防注入很像,这里举例说明)==>发现漏洞

(2)     构造xss代码:benwin” onSubmit=”alert(‘这是xss攻击的例子’);” class= “” 传入数据库

(3)     骗相关人员进来点击“提交”按钮

4.2常见xss攻击地方

(1)Js地方

1 <script language=”javascript”>  
2 var testname =” <?php echo $testname;?>”;  
3 </script>
4 $testname的值只要符合js闭合关系:“”;alert(“test xss “);”(以下同理)

(2)form表单里面

1 <input type=”text” name=”##” value=”<?php echo $val; ?>” />

(3)a标签

1 <a href=”benwin.php?id= <?php echo $id; ?>”>a标签可以隐藏xss攻击</a>

(4)用得很多的img标签

1 <img src=”<?php echo $picPath; ?>” />

甚至一些文本中插入整个img标签并且用width、 height、css等隐藏的很隐蔽

(5)地址栏

总之,有输出数据的地方,更准确的说是有输出用户提交的数据的地方,都有可能是XSS攻击的地方。

4.3防XSS方法

防xss方法其实和防注入很相似,都是一些过滤、代替、实体化等方法

(1)过滤或移除特殊的Html标签。

例如:< 、>、<,、> ‘、”、<script>、 <iframe> 、<,、>、”

(2)过滤触发JavaScript 事件的标签。例如 onload、onclick、onfocus、onblur、onmouseover等等。

(3)php一些相关函数,strip_tags()、htmlspecialchars()、htmlentities()等函数可以起作用

5、CSRF

CSRF跨站请求伪造cross site request forgery。

5.1简单说明CSRF原理

(1)A登录Site1(如现在网民常上的淘宝、微博、QQ等),产生一些信息,session、cookies等等,且一直保持没退出。

(2)A再登录Site2(如一些成人网等,至于怎么跑到Site2,多数是Site通过些手段,邮件欺骗等),打开site2的浏览器和打开site1的一样,否则无效

(3)Site2站中伪造了Site1的http请求(如修改密码,买东西,转账等),Site1的服务器误以为A在site1的正常操作(因为同浏览器且A还没登出),然后就运行了请求,那么csrf已成功操作。

csrf和xss很相似。xss也能伪造请求,csrf也能制造脚本。

伪造的请求可以很多方面,发邮件、改密码、返回用户信息、交易等等,所以相对与xss攻击来说csrf危害更严重。

5.2防范方法。

对于phper

(1)严密操控执行入口

执行一些敏感操作比如改密码这些操作前判断请求来源,只有本站服务器发的请求才可以执行。判断方法可以判断ip来源。非本站服务器ip不会执行。

(2)本站有外链的话做些必要操作

一般site2的hacker会在site1(比如论坛里)里发欺骗连接,因为在site1诱骗的相关人员一般都登录site1了,满足csrf气体条件之一。

如当你点击QQ邮件里面的长外链时候,回跳转到一个页面提示“有风险”之类,这样不仅可以减低跳出率,一些不懂的人看到这样的提示,若不是非必要而是处于好奇点击的连接一般不会继续点击访问;还有是QQ邮件正文里的图片在加载内容时是不加载图片的,要点击“显示图片”按钮才显示图片,这里一个原因之一就是避免攻击。

当然对于用户体验来说这是不可取的,可以优化的是判断到一些网址(如QQ本身网址)是安全直接可以显示(不用提示),而可疑的才提示或禁止。

(3)防止csrf也可以用防xss的方法。

6、防盗链

盗链问题增加服务器的负担。盗链就是盗链网站盗取被盗链网站资源来实现一些功能。盗链方面主要是图片、视频、以及其他资源下载文件。

方法:判断ip,只有本站服务器才能使用站点资源,否则不能使用。

代码:

(1)在Apache htaccess添加

1 RewriteEngine on   
2 RewriteCond %{HTTP_REFERER} !^$ [NC]  
3 RewriteCond %{HTTP_REFERER} !phpben.com [NC]  
4 RewriteCond %{HTTP_REFERER} !google.com [NC]   
5 RewriteCond %{HTTP_REFERER} !baidu.com [NC]   
6 RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]  
7 RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L]  
8 RewriteRule ^(.*)$ http:\/\/phpben.com\/image\/$1 [L]

这样,凡是不是phpben.com google.com baidu.com zhuaxia.com 域名请求的都返回replace.gif代替返回


7、防CC攻击

CC攻击:是利用不断对网站发送连接请求致使形成拒绝服务的目的。

详细百度百科:http://baike.baidu.com/view/662394.htm

代码:

 1 session_start();  
 2 $ll_nowtime = $timestamp ;  
 3 if (session_is_registered(‘ll_lasttime’)){  
 4 $ll_lasttime = $_SESSION[‘ll_lasttime’];  
 5 $ll_times = $_SESSION[‘ll_times’] + 1;  
 6 $_SESSION[‘ll_times’] = $ll_times;  
 7 }else{  
 8 $ll_lasttime = $ll_nowtime;  
 9 $ll_times = 1;  
10 $_SESSION[‘ll_times’] = $ll_times;  
11 $_SESSION[‘ll_lasttime’] = $ll_lasttime;  
12 }  
13 if (($ll_nowtime$ll_lasttime)<3){  
14 if ($ll_times>=5){  
15 header(sprintf(“Location: %s”,’http://127.0.0.1′));  
16 exit;  
17 }  
18 }else{  
19 $ll_times = 0;  
20 $_SESSION[‘ll_lasttime’] = $ll_nowtime;  
21 $_SESSION[‘ll_times’] = $ll_times;  
22 }

文章转自:http://blog.csdn.net/u011781769/article/details/48470773

转载于:https://www.cnblogs.com/Renyi-Fan/p/11003887.html

相关文章:

利用Event和MapFile进程共享信息

工作过程: 进程一, 建立映射文件,填写数据,并发出Event的信号; 进程二,打开映射文件,收到Event的信号时读取数据. #include <windows.h>#include <string.h>#include <iostream>usingnamespacestd; #defineFILE_SIZE 1024staticHANDLE hMapFile; staticLPVOI…

算法基础知识科普:8大搜索算法之二叉搜索树(中)

昨天图文介绍了二叉搜索树的基本概念&#xff0c;本篇图文介绍二叉搜索树的具体实现。既然二叉搜索树是二叉树的特殊应用&#xff0c;所以我们首先封装二叉树的结点&#xff0c;即数据-左子树-右子树&#xff0c;然后实现ISymbolTalbe接口中的方法&#xff0c;我们知道二叉搜索…

PropertiesFactoryBean PropertyPlaceholderConfigurer 区别

为什么80%的码农都做不了架构师&#xff1f;>>> 1.PropertiesFactoryBean is a FactoryBean implementation which reads a properties file and exposes that as an Properties object in the applicationcontext. 加载配置文件后&#xff0c;可以在代码中通过注…

MySQL索引背后的数据结构及算法原理【转】

http://blog.codinglabs.org/articles/theory-of-mysql-index.htmlMySQL索引背后的数据结构及算法原理【转】摘要本文以MySQL数据库为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明的是&#xff0c;MySQL支持诸多存储引擎&#xff0c;而各种存储引擎对索引…

各种播放器代码

各种播放器代码1.avi格式代码片断如下&#xff1a;<object id"video"width"400"height"200"border"0"classid"clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"><param name"ShowDisplay"value"0"…

算法基础知识科普:8大搜索算法之二叉搜索树(下)

由于微信发代码以及数学符号很吃力&#xff0c;所以我们做知识科普只能利用图片来做&#xff0c;本算法代码较多&#xff0c;所以分为三个部分来介绍。本篇把剩余的部分补齐。当然二叉搜索树也有自己的缺陷&#xff0c;即构造的二叉树跟数据的初始状态以及删除的方法有很大的关…

SpringMvc4中获取request、response对象的方法

springMVC4中获取request和response对象有以下两种简单易用的方法&#xff1a; 1、在control层获取 在control层中获取HttpServletRequest和HttpServletResponse对象有以下两种简单方式&#xff1a; 1&#xff09;通过方法参数直接在action类中获取 Controller class Action{ R…

JAVA增删改查XML文件

2019独角兽企业重金招聘Python工程师标准>>> 最近总是需要进行xml的相关操作。 不免的要进行xml的读取修改等&#xff0c;于是上网搜索&#xff0c;加上自己的小改动&#xff0c;整合了下xml的常用操作。 读取XML配置文件 首先我们需要通过DocumentBuilderFactory获…

测试一下,你能小学毕业吗?

昨天在群里大家讨论了上面那道小学六年级的五星题&#xff0c;不知道有没有同学能够不用三角函数&#xff0c;不用积分做出来的&#xff1f;先别往后看&#xff0c;测试一下吧&#xff01;看看是不是要跟小编一起重新背起小书包返回小学&#xff0c;重新学习了。 现在小学生的…

This is A PostXing Test

Test 一下下 试看看~~~ ABC试一下代码...1 public class PostApplicationExitActivationProcess2 {3 /// <summary>4 /// The main entry point for the application.5 /// </summary>6 [STAThread]7 static void Main( string[] args) 8 {9 if (…

缓存穿透、并发和失效的解决方案

我们在用缓存的时候&#xff0c;不管是Redis或者Memcached&#xff0c;基本上会通用遇到以下三个问题&#xff1a; 缓存穿透 缓存并发 缓存失效 缓存穿透 注&#xff1a;上面三个图会有什么问题呢&#xff1f; 我们在项目中使用缓存通常都是先检查缓存中是否存在&#xff0c;…

CentOS 7 命令

Centos 7 目录说明 / / 是根目录。 /bin 软连接到 /usr/bin。可以理解/bin 是 /usr/bin 的快捷方式。 /lib 软连接到 /usr/lib。 /lib64 软连接到 /usr/lib64。 /sbin 软连接到 /usr/sbin。 /usr软件安装位置 /usr/bin 为系统命令所在目录。 /usr/local 为安装程序所在目录。 /…

算法基础知识科普:8大搜索算法之AVL树(上)

前段时间介绍了二叉搜索树&#xff08;BST&#xff09;&#xff0c;我们知道这种搜索结构存在的弊端是对输入序列存在强依赖&#xff0c;若输入序列基本有序&#xff0c;则BST近似退化为链表。这样就会大大降低搜索的效率。AVL树以及Red-Black树就是为了解决这个问题&#xff0…

GARFIELD@04-09-2005

a technical facto 转载于:https://www.cnblogs.com/rexhost/archive/2005/04/09/134701.html

Vue.js学习系列(四十二)-- Vue.js组件

2019独角兽企业重金招聘Python工程师标准>>> 组件&#xff08;Component&#xff09;是Vue.js最强大的功能之一。组件可以扩展HTML元素&#xff0c;封装可重用的代码。组件系统让我们可以用独立可复用的小组件来构建大型应用&#xff0c;几乎任 意类型的应用的界面都…

java sqlite使用小记

2019独角兽企业重金招聘Python工程师标准>>> Sqlite教程&#xff1a; http://www.runoob.com/sqlite/sqlite-tutorial.html 加载sqlite jdbc驱动&#xff1a; static{ try { Class.forName("org.sqlite.JDBC"); } catch (ClassNotFoundException e) { e.p…

算法基础知识科普:8大搜索算法之AVL树(中)

昨天我们介绍了平衡二叉树的基本概念&#xff0c;通过平衡因子来控制左右子树的深度&#xff0c;使得整个二叉搜索树始终保持平衡状态。这个算法的核心在于当平衡因子超过范围&#xff0c;如何通过旋转的方式来使二叉搜索树保持平衡&#xff0c;以及平衡后对应结点平衡因子如何…

Linux登录那点事

跨平台系列汇总&#xff1a;http://www.cnblogs.com/dunitian/p/4822808.html#linux 我们登录linux的时候基本上不太关注上面的这个提示&#xff0c;其实这个还是有点文章的 简单解释一下&#xff1a; 上一次dnt用户登录的时间&#xff0c;以及终端是tty1 知识普及&#xff1a;…

解决了一个遗留的Portlet奇怪问题

在做Portlet的时候碰到一个奇怪的问题&#xff0c;使用Java应用程序来进行RFT传输好好的&#xff0c;但在Pluto下&#xff0c;同样的一段程序却不行&#xff0c;提示&#xff1a;No client transport named https found!  搜索GT官网的maillist&#xff0c;发现有人提到是AXI…

Python 程序如何高效地调试?

Python在debug方面的支持还是不错的&#xff0c;在明确代码意义的情况下&#xff0c;通过log、print和assert分析错误原因&#xff0c;配合单元测试可以很高效。然而&#xff0c;实际工作中大量代码很可能出自他人之手&#xff0c;这种情况下&#xff0c;使用debugger就显得更加…

selenium中javascript调试

之前写了使用js输入长文件的文章&#xff0c;有同事在使用时&#xff0c;发现竟然无法输入&#xff0c;也不知道是什么原因&#xff0c;且用的还是id方式。 在参考网文后&#xff0c;才发现是js写的有问题&#xff0c;现总结一下 javascript调试&#xff0c;在firefox中就自带有…

算法基础知识科普:8大搜索算法之AVL树(下)

昨天我们介绍了在进行结点插入时&#xff0c;若左子树深度超过右子树深度两层则进行右旋来保持平衡。今天继续介绍&#xff0c;若右子树深度超过左子树深度两层时的左旋操作&#xff0c;以及删除结点后平衡因子的变更问题。 这些都掌握后&#xff0c;基本上对AVL就有一个很全面…

《代码敲不队》第八次团队作业:Alpha冲刺 第二天

项目内容这个作业属于哪个课程任课教师博客主页链接这个作业的要求在哪里作业链接地址团队名称代码敲不队作业学习目标掌握软件编码实现的工程要求。团队项目github仓库地址链接 GitHub 第二天 日期&#xff1a;2019/6/16 今日完成任务情况以及遇到的问题 针对设计好的数据库&a…

我的.net程序为何不能执行?

今天早上习惯性的打开公司内部的网站。不料却发现我在输入地址后&#xff0c;系统竟会弹出一个对话框要求输入用户名和密码。想了想后&#xff0c;输入了AD的密码&#xff0c;就可以进入了网站。不经意间我又发现所有的asp.net的页面都不能打开&#xff0c;而asp的页面却一点问…

利用MySQL触发器实现check和assertion

MySQL虽然输入check语句不会报错&#xff0c;但是实际上并没有check的功能。但是MySQL 依然可以利用触发器来实现相应功能。 本文将根据两个例子简要阐述MySQL实现check和assertion的思路。 MySQL触发器 官方文档 MySQL Signal 官方文档 注意 signal异常处理功能在MySQL5.5版本…

算法基础知识科普:8大搜索算法之红黑树(上)

平衡二叉树&#xff08;AVL&#xff09;是一种特殊的二叉搜索树&#xff08;BST&#xff09;&#xff0c;即每个结点的值都大于其左子树且小于其右子树的值&#xff08;若存在&#xff09;&#xff0c;并通过引入平衡因子的概念来保持树的平衡。平衡二叉树算法的重点是在插入、…

Java Web学习总结(17)——JSP属性范围

2019独角兽企业重金招聘Python工程师标准>>> 所谓的属性范围就是一个属性设置之后&#xff0c;可以经过多少个其他页面后仍然可以访问的保存范围。 一、JSP属性范围 JSP中提供了四种属性范围&#xff0c;四种属性范围分别指以下四种&#xff1a; 当前页&#xff1a;…

为什么不提供离线Blog管理工具呢?

网络Blog现在是到处开花, 好像全世界的网民都开始写Blog了. 但因为Web的HTTP无状态协议, 网站本身都自己设置有session过期时间. 如果写的Blog文字多,时间一长用户登录状态就没了,当你提交你的文字时系统会出错,结果你回来时,你辛辛苦苦写的长长的文字都没了, 你是不是很气愤?…

javascript a 标签打开相对路径,绝对路径

<a>标签中的href中&#xff0c;如果你写一个路径默认是以相对路径打开的&#xff0c;加上"http://" 消息头那就可以打开绝对路径 html&#xff1a; <a hrefjavascript:void(0); target_blank onclickCommon.openUrl(" rowObject.baiduPanUrl ")…

算法基础知识科普:8大搜索算法之红黑树(中)

红黑树也是一种特殊形式的二叉搜索树&#xff0c;通过结点的颜色以及三条规则来保证二叉搜索树的平衡。规则1&#xff1a;根结点的颜色是黑色&#xff0c;规则2&#xff1a;叶子结点到根结点路径上遇到的黑色结点数目相同&#xff0c;规则3&#xff1a;叶子结点到根结点路径上无…