作家
登录

让我们一起来消灭CSRF跨站请求伪造(下)

作者: 来源: 2017-11-02 16:51:15 阅读 我要评论

  1. String generateToken(int userId, int key) { 
  2. byte[16] data = random() 
  3. expires = time() + 3600 
  4. raw = hex(data) + "-" + userId + "-" + expires 
  5. signature = hmac(sha256, raw, key) 
  6. return raw + "-" + signature 

大年夜家可以大年夜膳绫擎这段代码中看到构成令牌的那四个部分。个中,HMAC是用于验证前三个元素有效性的令牌,并最终会添加到raw的结尾。

  1. bool validateToken(token, user) { 
  2. parts = token.split("-") 
  3. str = parts[0] + "-" + parts[1] + "-" + parts[2] 
  4. generated = hmac(sha256, str, key) 
  5. if !constantCompare(generated, parts[3]) { 
  6. return false 
  1. if parts[2] < time() { 
  2. return false 
  3. if parts[1] != user { 
  4. return false 
  5. return true 

膳绫擎这段示例代码演示的是验证和计算令牌有效性的常用办法。起首我们须要将令牌拆分成它的四个构成部分,然后第一步就是应用前三个部分生成并验证HMAC的有效性(与之前的HMAC进行比较)。比较时光必定要确保应用的是固准时光,如许可以避免基于时光的进击。如不雅验证成功,我们接下来就要确保令牌没有过时,最落后行用户匹配。但在真实场景中,最麻烦的工作就是让用户的浏览器在发送所有请求时主动提交令牌。

实际上在开辟应用的过程中,绝大年夜多半的现代框架都已经帮我们搞定则一切了。框架库可以处理XHR,并将令牌主动插入到请求信息(包含表单)中。然则如不雅框架没有帮我们实现的话,我们也可以本身实现这种功能。这一步重要可以分为两个部分,一个是处理表单提交,另一个是处理XHR。下面这段示例代码可以处理onclick事宜回调:

  1. var target = evt.target; 
  2. while (target !== null) { 
  3. if (target.nodeName === 'A' || target.nodeName === 
  4. 'INPUT' || target.nodeName === 'BUTTON') { 
  5. break; 
  6.    
  7. targettarget = target.parentNode; 
  8.    
  9. // We didn't find any of the delegates, bail out 
  10. if (target === null) { 
  11. return; 

我们可以将这段代码添加到文档中,而不是添加到零丁的表单或可点击的元素之中,因为很有可能表单或元素根本就不存在与页面DOM之中。我们所指的元素是用户可以点击的器械,因为DOM树的构造以及事宜处理体系的不合,所以我们要寻找的是那种可以提交表单的元素,例如input或button标签。


  推荐阅读

  从不用try-catch实现的async/await语法来说说错误处理

async function asyncTask(cb) { async function process() { const user = await UserModel.findById(1) .catch(err => Promise.reject(() => { // deal with error on lo>>>详细阅读


本文标题:让我们一起来消灭CSRF跨站请求伪造(下)

地址:http://www.17bianji.com/lsqh/38424.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)