XSS其实就是使用js脚本语言攻击。
XSS攻击场景
A请求提交表单信息,表单信息转发到另- -个页面展示。
有一些钓鱼网站,在提交参数的后面带上XSS攻击的js脚本
有一些钓鱼网站,在提交参数的时候后面带上XSS脚本攻击举例子
http:/ /pay.itmayiedu.com/ pay?userId=10&money= 500&userName= < script>window.location.href= "http:/ /www.itmayiedu.com';< /script>
明白钓鱼网站实现思路。
XSS攻击原理
XSS其实就是使用js脚本语言攻击,浏览器默认支持脚本语言执行,如果在提交脚本参数的时候,可能浏览器直接执行。
XSS攻击最大漏洞常见:论坛、评论XSS
防御XSS攻击
1、有些浏览器已经防御了XSS攻击,例如谷歌浏览器
2、程序中写一个过滤器,拦截所有的参数,将特殊字符转换。例如: >
转成>
,使用第三方html框架工具进行html字符转换。
SQL注入原理:如果程序代码中,dao层的sql语句如果使用拼接方式,那么可能会有SQL注入的问题,拼接语句,成立让SQL进行成立进行。
在写程序中,dao层的SQL语句不写拼接方式,最好使用预编译方式使用#
1、#
与$
符号区别
mybatis的时候,sql语句传递参数最好使用#
号,因为#
会预编译SQL语句,可以有效的防止SQL语句攻击,$
需要SQL语句拼接,可能会受到SQL语句攻击。
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
相当于限制资源,只能在某个域名(限制某个服务器)来源上进行访问。
判断http请求头Referer域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片,可能被其他服务器盗用。
互联网本质通讯底层socket技术,socket技术里面是二进制文件传输。
实现原理: 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。 换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。
使用过滤器实现防盗链
nginx实现防盗链
避免盗链(绕开referer方式)
采用身份认证、定期修改资源路径等方式
location ~* \.(gif|jpg|png|swf|flv|bmp)$ {
valid_referers none blocked *.php100.com php100.com;
if ($invalid_referer) {
#rewrite ^/ http://www.php100.com/403.html;
return 403;
}
}
//这种方法是在server或者location段中加入:valid_referers none blocked,其中none表示空的来路,也就是直接访问,比如直接在浏览器打开一个文件,blocked表示被防火墙标记过的来路,*.php100.com表示所有子域名。
nginx针对文件目录的防盗链配置方法:
location /img/ {
root /data/img/;
valid_referers none blocked *.php100.com php100.com;
if ($invalid_referer) {
rewrite ^/ http://www.php100.com/error.gif;
#return 403;
}
}
1、互联网API接口幂等设计(包含防止模拟请求)
什么是幂等:保证数据唯一性,不允许有重复防止表单重复提交
互联网API幂等设计有哪些解决方案?
1、MVCC方案
多版本并发控制,该策略主要使用update with condition (更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。在系统设计的过程中,合理的使用乐观锁,通过version或者updateTime ( timestamp)等其他条件,来做乐观锁的判断条件,这样保证更新操作即使在并发的情况下,也不会有太大的问题。例如。
select * from tablename where condition=#condition# //取出要更新的对象,带有版本versoin
update tableName set name=#name#,version=version+1 where version=#version#
在更新的过程中利用version 来防止,其他操作对对象的并发更新,导致更新丢失。为了避免失败,通常需要一定的重试机制。
2、去重表
在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。
3、悲观锁
select for update
,整个执行过程中锁定该订单对应的记录。注意:这种在DB读大于写的情况下尽量少用。
业务要求: 页面的数据只能被点击提交一次。
发生原因: 由于重复点击或者网络重发,或者nginx 重发等情况会导致数据被重复提交
解决办法:
集群环境:采用token 加redis (redis 单线程的,处理需要排队)
单JVM环境:采用token加redis或token加jvm内存。
处理流程:
数据提交前要向服务的申请token, token 放到redis 或jvm内存,token 有效时间。提交后后台校验token, 同时删除token, 生成新的token返回。
怎么防止网络延迟重复提交?
使用Token防止重复提交
使用场景:在调用API的时候,需要传递令牌,该API获取到令牌之后,执行当前逻辑代码,然后把当前的令牌删除。
代码逻辑步骤:
怎么防止模拟请求?
如何防止机器模拟请求(使用程序语言发送请求)
解决:
1、使用图形验证码防止机器模拟请求(不能百分之百的完全识别)
2、nginx实现限流
3、配置黑名单和白名单
如何防止伪造token请求?
如何防止黑客使用抓包分析到令牌,黑客技术使用令牌伪造请求支付、下单等核心业务。
绑定ip不适合。
在互联网上没有绝对防止不能抓包分析到令牌
但是可以使用在调用接口时候,确认是本人在操作。
使用发送短信验证码方式或者图像识别方式。 I
在核心接口上,一定要确认是本人在操作,比如修改密码、支付下单、转账等核心业务。
什么是特殊字符处理?为什么需要?
rpc远程通讯实现加密(例如: + ?这些符号)正好和http特殊字符相同,导致转成空格。
什么是URL转码?
不管是以何种方式传递url时,如果要传递的url中包含特殊字符,例如想要传递一个+
,但是这个+
会被url会被编码成空格,想要传递&
,被urI处理成分隔符。
尤其是当传递的urI是经过Base64加密或者RSA加密后的,存在特殊字符时,这里的特殊字符一旦被url处理,就不是原先你加密的结果了。
转码工具类: Java jdk有提供、lang工具包中含有
加密和解密都是使用同一个秘钥。
优点:对称加密速度快
缺点:同一个秘钥,不安全
使用场景:加密速度快,服务器和服务器端之间进行通讯(后台和后台通讯),构建网站与机构网站进行合作的情况可以使用对称加密(同一个网段里面 抓包分析抓不到包)
常见的对称式加密技术
不能采用对称加密,反编译apk可以获取秘钥。然后通过抓包分析数据。
使用HTTPS传输、使用令牌、使用非对称加密(RSA)。
私钥和公钥(公钥加密, 私钥解密)目前最安全的加密手段,缺点:效率低
应用场景:第三方支付对接、核心金融机构。
实现步骤:
1、生成公钥和私钥对(使用工具或者代码生成)
2、使用公钥加密
3、使用私钥解密
常用算法:
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
如何防止抓包篡改数据
基于令牌的方式实现参数安全传输:
A (主站) B(支付)
参考博客:https://www.cnblogs.com/toov5/p/10321364.html