2017-12-08 15 views
1

SQLインジェクション攻撃から保護されている間に、jdbcにSQLクエリをサブミットしようとしています。私はApache Spark JDBC SQLインジェクション(pyspark)

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) 

私は何とかバインドのparamsを使用することができますようないくつかのコードを持っていますか?

ここにSQLインジェクションができないような解決策があれば、うまくいくでしょう。

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) 

を単純な場合には、このように、サブクエリのための必要はありません:あなたはSQLAlchemyのを使用している場合

答えて

0

、あなたが試すことができます。次のことができます。

df = (sqlContext.read 
    .jdbc(url=url, properties=properties, table=my_table) 
    .where(col("timestamp") > my_date))) 

、あなたはSQLインジェクションを心配している場合、あなたがより大きな問題を抱えている可能です。単独で(almost)セキュリティメカニズムが組み込まれておらず、おそらく信頼できない環境で公開されるべきではありません。

関連する問題