fortify

Explanation:

Node.js 允许开发人员将回调分配给 IO 阻止的事件。这样可提高性能,因为回调可异步运行,从而使主应用程序不会被 IO 阻止。但是,如果回调外部的某些内容依赖于先运行的回调内的代码,这反过来会造成争用条件。 

示例 1:以下代码可基于数据库对用户进行身份验证。

 
...
var authenticated = true; 
...
database_connect.query('SELECT * FROM users WHERE name == ? AND password = ? LIMIT 1', userNameFromUser, passwordFromUser, function(err, results){
  if (!err && results.length > 0){
    authenticated = true;
  }else{
    authenticated = false;
  }
});

if (authenticated){
  //do something privileged stuff
  authenticatedActions();
}else{
  sendUnathenticatedMessage();
}


在此示例中,我们应当调用到后端数据库,以确定用户用于登录的凭据,确认有效后,将变量设置为 true,否则设置为 false。令人遗憾的是,由于回调被 IO 阻止,它将异步运行且可能在检查 if (authenticated) 之后运行,由于默认值为 true,它将进入 if-statement,确认用户实际上是否已经过身份验证。

更多推荐

fortify中Race Condition会设置可能导致争用条件的回调。