-2

私は動的に構築されたSQLを持っています、以下はクエリです:

private String constructTownSearchQuery(String country, String stateName,String districtName,String townName) {
        StringBuilder statesSearchQuery = new StringBuilder();
        statesSearchQuery.append(" select cntry.countryid,cntry.country,sta.stateid,sta.state,dst.districtid,dst.district,twn.townid,twn.town ");
        statesSearchQuery.append(" from m_countries as cntry,m_states as sta,m_districts as dst,m_towns as twn ");
        statesSearchQuery.append(" where cntry.countryid = sta.countryid ");
        statesSearchQuery.append(" and sta.stateid = dst.stateid ");
        statesSearchQuery.append(" and twn.districtid=dst.districtid ");

        if (!country.equals("")) {
            statesSearchQuery.append(" and cntry.country='").append(country).append("' ");
        }
        if (!stateName.equals("")) {
            statesSearchQuery.append(" and sta.state='").append(stateName).append("'");
        }
        if (!districtName.equals("") ) {
           statesSearchQuery.append(" and dst.district='").append(districtName).append("'");
        }
        if (!townName.equals("") ) {
           statesSearchQuery.append(" and  twn.town='").append(townName).append("'");
        }
        statesSearchQuery.append(" order by cntry.country ");
        return statesSearchQuery.toString();
    }

このクエリを使用すると、SQLインジェクションが発生しやすく、PreparedStatementこれを回避するために使用するように指示されました。

お願いはpreparedStatement、これを使用する方法を教えてくれます。

よろしく。

4

1 に答える 1

3

()thisのようにクエリに値パラメータを追加する.append(country)と、簡単に注入できる可能性があります。

たとえば、"Australia"通常の場合に国を渡す場合は問題ありませんが、国をとして渡す場合は"a' or '1'='1"、すべての国が選択されます。

SQLステートメントの場合と同様に、PreparedStatementプリコンパイルされ、このオブジェクトを使用してこのステートメントを複数回効率的に実行でき、SQLインジェクションから安全になります。

PreparedStatementの詳細

String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();

SQLインジェクションの詳細。

于 2012-11-26T07:18:04.307 に答える