html占位符转码,4种web攻击方式,XSS攻击、CSRF攻击、SQL注入、文件上传漏洞

(3)反射型XSS攻击:链接参数里面有js脚本代码,当传递给后台服务器后,服务器又原封不动的把参数返回给浏览器,浏览器识别这段js脚本代码后运行了;

访问:127.0.0.1/basic/web/index.php?r=article/post&name=如果有弹出框出来,就完成了一次反射型xss(火狐浏览器会弹出来,360和chrome浏览器不会,因为这两个浏览器有XSS防护机制)

现代现浏览器(chrome)对于反射型XSS有一定防护

手动关闭xss防护:

\Yii::$app->response->headers->add('X-XSS-Protection', '0');

XSS防范措施:

1)YII框架第一种防范xss(转码防范):Html::encode($str);内部其实调用了PHP的htmlspecialchars函数,把预定义的字符串转换成HTML实体;

2)过滤防范lexer技术:

echo \yii\helpers\HtmlPurifier::process($script);//这个函数使用了lexer技术,可以识别HTML里的JS、HTML、CSS三种代码,并把js过滤掉;

二、CSRF攻击

跨站请求伪造(英语:Cross-site request forgery):跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

(1)get型的CSRF攻击:

1、该用户登录了某银行网站

2、构造了某银行转账URL:http://www.xxxbank.com/index.php?from=zhangsan&to=lisi&money=400

3、用户点击了这个链接,就会执行转账过程,完成一次CSRF攻击

(2)post型的CSRF攻击

伪造post请求

1、伪造form表单,要伪造相同表单控件,同样提交到原来的后台所处理页面

2、用户要先登录到原来form表单所在的系统

3、诱导用户来到我们的form表单,自动提交到目标服务器进行修改删除操作

yii中对csrf的验证:web表单提交数据会引发yii的csrf验证,form中添加隐藏表单name为_csrf,value为服务端生成的csrfToken的对应的变量名,服务端$csrfToken = \Yii::$app->request->csrfToken;

防范csrf:

1,验证码:比较有效,但降低用户体验;

2,referer头,需要考虑正常访问没有referer头的情况;值是这次请求的URL,是哪个页面的请求

3,token,响应请求时返回的防伪标志,服务器随机生成的token,浏览器接收到token,在请求时带上token,服务器对比,来检测有没有受到CSRF攻击;

yii中对csrf的验证:web表单提交数据会引发yii的csrf验证,form中添加隐藏表单name为_csrf,value为服务端生成的csrfToken的对应的变量名,服务端$csrfToken = \Yii::$app->request->csrfToken;

三、SQL注入的攻击方式

(1)例子一:

select * from users where name='zhangsan' and password='123456'

name = zhansan' --

那么查询语句就变成

select * from users where name='zhangsan' --' and password='123456'

在数据库中,--表示注释,则后面的会被忽略,如果这是管理员用户登录时的验证,则不需要密码就可以正常的登录到系统中

例子二:

select * from users where name='zhangsan' and password='123456'

name = '; drop table users; --

那么查询语句就变成

select * from users where name=' '; drop table users; --' and password='123456'

如果运行,会把users表删除

例子三:

在一个论坛查找积分在60以下且关键字是youyiku的帖子,会运行以下sql语句

select * from articles where score<60 and title like '%youyiku%';

如果查找关键字:' or 1=1 --

select * from articles where score<60 and title like '%' or 1=1 --%'

就突破了这个限制,会把所有帖子查找出来

mysql注释符有三种:

1、#...

2、"--  ..."//需要一个空格,应该是"-- ".

3、/*...*/

(2)yii通过PDO操作数据库的方式来防止sql注

public function actionTest1(){

$user = (new \yii\db\Query())

->select('*')

->from('users')

->where('name=:name',[':name'=>'zhangsan'])

->one();

print_r($user);

}

* 如果在数据库配置db.php中'emulatePrepare'=>false,则占位符转义是在数据库端

* 运行下面代码,sql语句会分成两部分:

* 向MySQL传递第一份数据:select * from users where name=?

* 向MySQL传递第二份数据:zhangsan,会在MySQL进行转义,就算传过来的是中文和单引号,也会把单引号转义之后再执行sql语句,就防止了sql注入

四、文件上传漏洞

如果后台对文件上传审查不严,导致php代码上传后被执行,可进行遍历文件等操作使源码泄露;

上传文件数据时,请求数据可以在出发前被(fiddler抓包工具)拦截并篡改,content-type可被修改,在文件名中加入:,可以通过后缀名验证,并使move_uploaded_file执行时丢弃:之后的部分,使上传文件变成可执行的php,若上传文件没被重命名或重命名后的名字被发现,则可使文件可被任意执行。

处理方式:严格检查文件,禁止出现":", 重命名文件,禁止目录列出文件,取消上传目录文件的执行权限。

if($_POST){

$ext = pathinfo($_FILES['photo']['name'],PATHINFO_EXTENSION);

if(in_array($ext,['png','jpg','gif'])){

echo '类型检测成功';

//将上传的临时文件移动到要保存的上传文件位置,一般为了安全,不用用户上传文件的名称,容易在中途被非法修改,从而变成.php这些可执行文件,造成损害

move_uploaded_file($_FILES['photo']['tmp_name'],'./$_FILES['photo']['name']');

}

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值