我正在学习sql-injection,我知道prepare语句可以防止它。我将下面的示例作为prepare语句的一个易受攻击的用法,但没有解释原因。下面是代码
PreparedStatement psProblem =Connection.prepareStatement( "SELECT user,password, FROM tbl_user," + userinput.addTableName + " WHERE (user=?)" );
答案 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