Apache Spark JDBC SQL 注入 (pyspark)
Posted
技术标签:
【中文标题】Apache Spark JDBC SQL 注入 (pyspark)【英文标题】:Apache Spark JDBC SQL Injection (pyspark) 【发布时间】:2017-12-08 20:08:14 【问题描述】:我正在尝试向 jdbc 提交 sql 查询,同时受到 sql 注入攻击的保护。我有一些代码,例如
from pyspark import SparkContext
from pyspark.sql import DataFrameReader, SQLContext
from pyspark.sql.functions import col
url = 'jdbc:mysql://.../....'
properties = 'user': '', 'driver': 'com.mysql.jdbc.Driver', 'password': ''
sc = SparkContext("local[*]", "name")
sqlContext = SQLContext(sc)
from pyspark.sql.functions import desc
pushdown_query = """(
select * from my_table
where timestamp >
) AS tmp""".format(my_date)
df = sqlContext.read.jdbc(url=url, properties=properties, table=pushdown_query)
我可以以某种方式使用绑定参数吗?
任何阻止 SQL 注入的解决方案都可以。
如果有帮助,我也会使用 SQLAlchemy。
【问题讨论】:
【参考方案1】:如果你使用 SQLAlchemy,你可以试试:
from sqlalchemy.dialects import mysql
from sqlalchemy import text
pushdown_query = str(
text("""(select * from my_table where timestamp > :my_date ) AS tmp""")
.bindparams(my_date=my_date)
.compile(dialect=mysql.dialect(), compile_kwargs="literal_binds": True))
df = sqlContext.read.jdbc(url=url, properties=properties, table=pushdown_query)
但是在一个简单的情况下,比如这个,不需要子查询。你可以:
df = (sqlContext.read
.jdbc(url=url, properties=properties, table=my_table)
.where(col("timestamp") > my_date)))
如果您担心 SQL 注入,您可能会遇到更大的问题。如果单独有 (almost) 没有内置安全机制,可能不应该暴露在不受信任的环境中。
【讨论】:
以上是关于Apache Spark JDBC SQL 注入 (pyspark)的主要内容,如果未能解决你的问题,请参考以下文章
SparkSQL介绍与Hive整合Spark的th/beeline/jdbc/thriftserve2shell方式使用SQL
CVE-2022-33891 Apache spark shell 命令注入漏洞复现
在 Apache Spark JDBC DataFrame 中使用 Postgis 几何类型