架构 安全性
XSS(Cross Site Script)跨站脚本攻击
持久型:黑客提交含有恶意脚本的请求,保存在被攻击的web站点的数据库中,
用户浏览网页时,恶意脚本被包含在正常页面中,被浏览器执行。
例如在博客里写一段js代码,把cookie发给黑客,里面可能含有sessionID
用户访问该博客,黑客就能登录用户的账号了
反射型:诱使用户点击一个嵌入恶意脚本的链接,该脚本被浏览器解析后,
向服务器提交非用户意愿的请求
例如一个正常网站url为a.com?b=1234
黑客在博客里构造一个链接,指向a.com?b=1234<script>....</script>
如果a.com会在页面里显示b的值,那么js代码就会被执行
a如果是一个转账表单,js就可以填写收款人并点击转账按钮
1、转义:<转义成<等,可以;防止大部分攻击。
echo \yii\helpers\Html::encode($str);
2、对cookie添加HttpOnly属性,可防止cookie被窃取。
CSRF(Cross Site Request Forgery)跨站点请求伪造
通过跨站请求,利用cookie或session,盗用用户身份,以合法用户的身份进行非法操作
get方式:黑客的新浪微博里有个超链接或图片的src属性,指向银行转账的url,
用户最近登录过银行页面,session未失效,银行会认为用户在请求转账。
post方式:用户访问黑客的网站,网站发出post请求
1、表单添加随机token,正常页面的请求会包含该token,伪造的请求无法获得该值
$csrfToken = \Yii::$app->request->csrfToken; yii框架将加密后的csrf存在cookie里,
表单提交后,对cookie里的csrf解密,然后和表单里的csrf进行比对
2、验证码,和token有些类似,用户体验差
3、Referer,记录了请求来源
sql注入
攻击者获取表结构的方法:使用开源软件、开启错误回显、根据页面变化猜测数据库表结构
1、加强对变量的验证,例如期望变量是数字或邮箱,就验证变量到底是不是数字或邮箱。
2、转义特殊字符,引号分号等,$str=addslashes($str),mysqli_real_escape_string()
3、过滤可疑的语句:drop table等
4、预编译,绑定参数,先把 “where id = ?”传给mysql,mysql预先处理这句sql,然后再传参数
可以一次编译,多次执行,提高执行效率。
其他:
错误回显、HTML注释、上传文件被执行、url+相对路径访问未开放的目录
加密
单向散列加密:md5等,对不同长度的信息进行加密,得到固定长度的输出
对称加密:加密和解密使用同一个密钥或可以相互推算
非对称加密:公钥对外公开,用公钥加密的信息,只有用私钥才能解密,公钥推不出私钥
1、传输信息:A用B的公钥加密后通过非安全传输通道,将密文发给B,B用私钥解密。
2、数字签名:A用自己的私钥加密发给B,B用A的公钥解密,由于私钥只有A有,
所以该信息不可抵赖,具有签名的性质。