为什么这个准备声明很脆弱

时间:2013-08-09 19:39:19

标签: sql prepared-statement sql-injection

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

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

1 个答案:

答案 0 :(得分: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