1

我正在学习 sql-injection 并且我知道 prepare 语句可以防止它。我将下面的示例作为准备语句的易受攻击的用法之一,但没有解释原因。下面是代码

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 回答