我正在学习 sql-injection 并且我知道 prepare 语句可以防止它。我将下面的示例作为准备语句的易受攻击的用法之一,但没有解释原因。下面是代码
PreparedStatement psProblem =Connection.prepareStatement( "SELECT user,password, FROM tbl_user," + userinput.addTableName + " WHERE (user=?)" );
我正在学习 sql-injection 并且我知道 prepare 语句可以防止它。我将下面的示例作为准备语句的易受攻击的用法之一,但没有解释原因。下面是代码
PreparedStatement psProblem =Connection.prepareStatement( "SELECT user,password, FROM tbl_user," + userinput.addTableName + " WHERE (user=?)" );
由于相同的原因,任何带有未经处理的用户输入的 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