6

セキュリティ検証の観点から、次の違いはありますか?

stmt.setObject(1, theObject);

stmt.setString(1, theObject);?

この場合theObjectはあることはわかっていStringますが、他のケースをカバーするためにこのコードの一部をより一般的にすることに興味があり、入力検証のセキュリティの観点が影響を受けるかどうか疑問に思っていました

4

3 に答える 3

1

setObject()jdbc はすべての型の型解決を試みるため、s を使用しても問題ありませんjava.lang.*

ただし、この方法で任意の SQL 文字列をデータベースに渡すことには、潜在的な問題があります。セキュリティの抜け穴: SQL 文字列を作成するために使用するパラメータを慎重に検証しないと、さまざまな種類の SQL 挿入攻撃を受ける可能性があります。

型なしで渡すことに注意しnullてくださいsetObject()

于 2012-11-05T08:47:39.640 に答える
0

私見では

JDBCはデータベースサーバーの非常に軽いラッパーであるため(DBが直接解釈するSQLを生成する以外にほとんど何もしません)、私は期待しています

stmt.setObject(1, theObject);

とまったく同じになる

stmt.setString(1, theObject == null ? "null" : theObject.toString())`;

「型の検証」は、データベースが結果のSQLを処理し、それがそれに適合するかどうかを検出するときに行われます。

于 2012-11-05T08:37:04.267 に答える
0

答えはプロバイダーに関連しているようで、ドライバーの実装に依存します。現在の postgresql ドライバーのソースを確認すると、2 つの呼び出しが同じです。

ドライバーが型を認識しない場合、例外がスローされます。

/** code from ./org/postgresql/jdbc2/AbstractJdbc2Statement.java */
public void setObject(int parameterIndex, Object x) throws SQLException
{
    checkClosed();
    if (x == null)
        setNull(parameterIndex, Types.OTHER);
    else if (x instanceof String)
        setString(parameterIndex, (String)x);
    else if (x instanceof BigDecimal)
        setBigDecimal(parameterIndex, (BigDecimal)x);
    else if (x instanceof Short)
        setShort(parameterIndex, ((Short)x).shortValue());
    else if (x instanceof Integer)
        setInt(parameterIndex, ((Integer)x).intValue());
    else if (x instanceof Long)
        setLong(parameterIndex, ((Long)x).longValue());
    else if (x instanceof Float)
        setFloat(parameterIndex, ((Float)x).floatValue());
    else if (x instanceof Double)
        setDouble(parameterIndex, ((Double)x).doubleValue());
    else if (x instanceof byte[])
        setBytes(parameterIndex, (byte[])x);
    else if (x instanceof java.sql.Date)
        setDate(parameterIndex, (java.sql.Date)x);
    else if (x instanceof Time)
        setTime(parameterIndex, (Time)x);
    else if (x instanceof Timestamp)
        setTimestamp(parameterIndex, (Timestamp)x);
    else if (x instanceof Boolean)
        setBoolean(parameterIndex, ((Boolean)x).booleanValue());
    else if (x instanceof Byte)
        setByte(parameterIndex, ((Byte)x).byteValue());
    else if (x instanceof Blob)
        setBlob(parameterIndex, (Blob)x);
    else if (x instanceof Clob)
        setClob(parameterIndex, (Clob)x);
    else if (x instanceof Array)
        setArray(parameterIndex, (Array)x);
    else if (x instanceof PGobject)
        setPGobject(parameterIndex, (PGobject)x);
    else if (x instanceof Character)
        setString(parameterIndex, ((Character)x).toString());
    else if (x instanceof Map)
        setMap(parameterIndex, (Map)x);
    else
    {
        // Can't infer a type.
        throw new PSQLException(GT.tr("Can''t infer the SQL type to use for an instance of {0}. Use setObject() with an explicit Types value to specify the type to use.", x.getClass().getName()), PSQLState.INVALID_PARAMETER_TYPE);
    }
}
于 2012-11-05T09:05:26.690 に答える