mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
Python: Model cassandra-driver PyPI package
This commit is contained in:
@@ -3,12 +3,13 @@
|
||||
*/
|
||||
|
||||
// If you add modeling of a new framework/library, remember to add it to the docs in
|
||||
// `docs/codeql/support/reusables/frameworks.rst`
|
||||
// `docs/codeql/reusables/supported-frameworks.rst`
|
||||
private import semmle.python.frameworks.Aioch
|
||||
private import semmle.python.frameworks.Aiohttp
|
||||
private import semmle.python.frameworks.Aiomysql
|
||||
private import semmle.python.frameworks.Aiopg
|
||||
private import semmle.python.frameworks.Asyncpg
|
||||
private import semmle.python.frameworks.CassandraDriver
|
||||
private import semmle.python.frameworks.ClickhouseDriver
|
||||
private import semmle.python.frameworks.Cryptodome
|
||||
private import semmle.python.frameworks.Cryptography
|
||||
|
||||
61
python/ql/lib/semmle/python/frameworks/CassandraDriver.qll
Normal file
61
python/ql/lib/semmle/python/frameworks/CassandraDriver.qll
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Provides classes modeling security-relevant aspects of the `cassandra-driver` PyPI package.
|
||||
* See https://pypi.org/project/cassandra-driver/
|
||||
*/
|
||||
|
||||
private import python
|
||||
private import semmle.python.dataflow.new.DataFlow
|
||||
private import semmle.python.dataflow.new.RemoteFlowSources
|
||||
private import semmle.python.Concepts
|
||||
private import semmle.python.ApiGraphs
|
||||
private import semmle.python.frameworks.PEP249
|
||||
|
||||
/**
|
||||
* Provides models for the `cassandra-driver` PyPI package.
|
||||
* See https://pypi.org/project/cassandra-driver/
|
||||
*/
|
||||
private module CassandraDriver {
|
||||
/**
|
||||
* A cassandra cluster session.
|
||||
*
|
||||
* see
|
||||
* - https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/cluster/#cassandra.cluster.Cluster.connect
|
||||
* - https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/cluster/#cassandra.cluster.Session
|
||||
*/
|
||||
API::Node session() {
|
||||
result =
|
||||
API::moduleImport("cassandra")
|
||||
.getMember("cluster")
|
||||
.getMember("Cluster")
|
||||
.getReturn()
|
||||
.getMember("connect")
|
||||
.getReturn()
|
||||
}
|
||||
|
||||
/**
|
||||
* see https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/cluster/#cassandra.cluster.Session.execute
|
||||
*/
|
||||
class CassandraSessionExecuteCall extends SqlExecution::Range, API::CallNode {
|
||||
CassandraSessionExecuteCall() { this = session().getMember("execute").getACall() }
|
||||
|
||||
override DataFlow::Node getSql() { result = this.getParameter(0, "query").asSink() }
|
||||
}
|
||||
|
||||
/**
|
||||
* see https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/cluster/#cassandra.cluster.Session.execute_async
|
||||
*/
|
||||
class CassandraSessionExecuteAsyncCall extends SqlConstruction::Range, API::CallNode {
|
||||
CassandraSessionExecuteAsyncCall() { this = session().getMember("execute_async").getACall() }
|
||||
|
||||
override DataFlow::Node getSql() { result = this.getParameter(0, "query").asSink() }
|
||||
}
|
||||
|
||||
/**
|
||||
* see https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/cluster/#cassandra.cluster.Session.prepare
|
||||
*/
|
||||
class CassandraSessionPrepareCall extends SqlConstruction::Range, API::CallNode {
|
||||
CassandraSessionPrepareCall() { this = session().getMember("prepare").getACall() }
|
||||
|
||||
override DataFlow::Node getSql() { result = this.getParameter(0, "query").asSink() }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
import python
|
||||
import experimental.meta.ConceptsTest
|
||||
@@ -0,0 +1,12 @@
|
||||
from cassandra.cluster import Cluster
|
||||
|
||||
cluster = Cluster(...)
|
||||
session = cluster.connect()
|
||||
|
||||
session.execute("sql") # $ getSql="sql"
|
||||
|
||||
future = session.execute_async("sql") # $ constructedSql="sql"
|
||||
future.result()
|
||||
|
||||
prepared = session.prepare("sql") # $ constructedSql="sql"
|
||||
session.execute(prepared) # $ SPURIOUS: getSql=prepared
|
||||
Reference in New Issue
Block a user