1

私は sql-injection について学んでおり、prepare ステートメントがそれを防ぐことができることを理解しています。以下の例は、prepare ステートメントの脆弱な使用法の 1 つとしてありましたが、その理由についての説明はありませんでした。以下はコードです

PreparedStatement psProblem =Connection.prepareStatement( "SELECT user,password, FROM    tbl_user," + userinput.addTableName + " WHERE (user=?)" );
4

1 に答える 1

1

サニタイズされていないユーザー入力を含む SQL ステートメントは、同じ理由で脆弱です。ユーザーは、SQL を早期に終了させる文字列を入力し、それを独自の SQL に置き換えることができます。

たとえば、次のように入力するtbl_user WHERE 1=0; DROP TABLE tbl_user;--と、ユーザー テーブルが削除されます。結果の SQL は次のようになります。

SELECT user,password, FROM tbl_user,tbl_user WHERE 1=0; DROP TABLE tbl_user;--WHERE (user=?)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
     |                                                    |                  |
Your original query does nothing because of its condition |                  |
                                                          |                  |
                                                 The attack payload          |
                                                                             |
                                                           Commented out portion
于 2013-08-09T19:45:35.507 に答える