问题描述
这是一个例子:
var express = require('express');
var http = require('http');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json({ type: 'application/json',limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb',extended: true,parameterLimit:50000}));
var server = http.createServer(app);
我想提取从 require('express')
到 app.use
的路径,我该如何设计 codeql 查询,DataFlow::Node.getASuccessor()
函数似乎无法从 {{1} 检索数据流}} 到 express()
,以及之后 app
的用法。
这是我的尝试,我只得到了 app
的路径。
app
结果如下:
import javascript
predicate isImportAssign(DataFlow::Node n,DataFlow::ModuleImportNode m){
exists(Variable a| a.getADefinition().getSource() = m.asExpr() and n.asExpr() = a.getADefinition().getTarget())
}
predicate isTarget(DataFlow::ModuleImportNode a,DataFlow::Node b){
(b.(DataFlow::PropRef).getBase() = a.getASuccessor*()
or
b = a.getASuccessor*())
and
a != b
}
predicate isAssignedByCall(DataFlow::Node m,DataFlow::Node n){
exists(Assignment a | a.getLhs() = n.asExpr() and a.getRhs() = m.getEnclosingExpr().getParentExpr())
or
exists(DeclStmt v | v.getAChild().getChild(0).(Expr) = n.asExpr() and v.getAChild().getChild(1).(Expr) = m.getEnclosingExpr().getParentExpr())
}
predicate hasDataFlow(DataFlow::Node source,DataFlow::Node sink){
exists(TaintTracking::Configuration cfg | cfg.hasFlow(DataFlow::valueNode(source.getEnclosingExpr().getParentExpr()),sink))
}
predicate transitive(DataFlow::Node a,DataFlow::Node b){
isAssignedByCall(a,b) or hasDataFlow(a,b) or exists(DataFlow::Node c | transitive(a,c) and transitive(c,b))
}
from DataFlow::ModuleImportNode a,DataFlow::Node b,DataFlow::Node c,DataFlow::Node d
where isTarget(a,b)
and transitive(b,c)
select a,b,c
任何人都可以帮助改进此查询以在这种情况下也检索 # a b c
1 require('express') express app
?
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)