第三方登陆主要是基于author协议来实现,下面简单说下实现流程:

1、首先我们需要以开发者的身份向第三方登陆平台申请接入应用,

申请成功后,我们会获得一个appID和一个secrectID.

2、当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,

此时把之前申请的appID和secrectID带给登陆授权页面。

3、用户登陆成功后即得到授权,第三方会返回一个临时的code给我们的网站。

4、我们的网站接受到code后,再次向我们的第三方发起请求,

并携带接收的code,从第三方获取access_token.

5、第三方处理请求后,会返回一个access_token给我们的网站,

我们的网站获取到access_token后就可以调用第三方提供的接口了,比如获取用户信息等。

最后把该用户信息存入到我们站点的数据库,并把信息保存到session中,实现用户的第三方登陆。

1. token校验

登录后生成token,客户端中将token存储cookie中,服务器端将token存储与session中。后续的接口请求必须带上token,当和服务器一致则认为请求安全。

常用于客户端和服务器端的安全校验。

2. 服务器之间的sign签名校验

A服务器中用一个 key(私钥) + 时间戳 通过算法生成一个公钥,将时间戳和公钥传递给服务器B。服务器B通过同样的私钥和时间戳来生成一个公钥。如果两个公钥相同,则签名通过。

用于服务器和服务器之前的签名认证。比如支付宝,微信等接口签名下发。

3. 验证码

当部分接口可能涉及到大量的请求来攻击的时候。比如登录,注册等包含提交信息的。需要先验证验证码,当验证码通过后才会处理后续逻辑。

缺点是,每次都要输入验证码,影响用户体验。可以通过某段时间范围内,用户请求量是否超过某个阈值,当超过某个阈值后,才会出现输入验证码,否则不会出现验证码。

4. 接口请求频次限制

部分接口可能涉及到用户大量频繁的提交,但是当超过某个频次后,我们可能认为他是恶意攻击。比如聊天室,搜索接口,翻译等接口。

当某个ip或者token对接口在时间范围内有大量请求的时候,应该将该用户的ip限制,接口返回429。

5. 正确使用post,get请求方式。涉及有安全数据的,应该用post来提交。

6. 接口返回中应该将不需要的数据过滤。比如获取某个用户信息接口,如果只要用户名,就返回用户名。不要将该用户的用户名,密码,住址等私密信息返回,以便于造成泄露。

7. 使用https

8. 定时的分析接口请求日志或者nginx日志,确认是否有非法的访问,防患于未然。 你会经常发现,请求中包含各种路径,甚至包含sql语句的。根据这种请求分析自己的系统中是否存在漏洞



来源

表单输入或者url传参

常见攻击方式

  • 使用';--
SELECT * FROM  adv where title='zhangsan';DROP TABLE article--'

引号和分号是为了隔离前面的sql语句,后面的--代表注释。因为最后一个'可能会影响删表,所以使用注释不影响执行删表。注意:最后一个引号来自代码封装:原语句可能如下的写法:


$sql = "SELECT * FROM  adv where title='".$_GET['title']."'";
#这句php代码因为title本身是被引号的
  • 使用 ';' +or + --
SELECT * FROM  adv where title='zhangsan' or DROP TABLE article--'

注意:在PHP中的 mysql_query() 是不允许执行多个SQL语句的,但是还是可以通过or and 等语句来执行。

预防sql注入

  • 开启php魔术模式,magic_quotes_gpc=on;
  • 打开php.ini中的安全模式 safe_mode = on
  • 关闭危险函数,比如system,chmod等函数;
  • 错误信息控制 ,让非开发人员看到有关数据库错误信息是很危险的,这会泄露数据库,表,字段等名称信息以及其他不安全因素。
  • 使用php自带函数将一些特殊字符转义后再执行sql语句:
    • addslashes() 是强行加\;
    • mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
    • mysql_escape_string不考虑连接的当前字符集。


使用HTTP的POST方式,对固定参数+附加参数进行数字签名,使用的是md5加密。

比如:我想通过标题获取一个信息,在客户端使用 信息标题+日期+双方约定好的一个key通过md5加密生成一个签名(sign)。

然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的sign和我们通过算法算的值相同,证明是一个正常的接口请求,我们才会返回相应的接口数据。

  1. 接口ip请求频次限制
  2. 登录,注册再适当的时候提供注册验证码(比如请求高,或者被攻击,或者同一个客户端频繁请求)
  3. 前端的数据永远都认为是不靠谱的,加入数据库需要做转义处理,防止sql注入
  4. 非代码数据要做转义处理后方可展示。比如非法的一些script语句
  5. 代码逻辑要谨慎,自测避免出现过大漏洞
  6. 线上必须屏蔽具体错误,避免暴漏重要信息