我的考试中有一个非常基本的SQL注入问题——will my";“奇怪”;解决方案工作?

我的考试中有一个非常基本的SQL注入问题——will my";“奇怪”;解决方案工作?,sql,security,code-injection,Sql,Security,Code Injection,(我不是以英语为母语的人,请原谅我的错误) 它得到了一些Java代码,这些代码负责构建一个简单的SQL查询。任务是 为两个参数username和password提供字符串参数,以删除user\u表 注意:我们没有学习SQL代码,所以不必担心确切的SQL语法。这不要紧 我记不起确切的代码,但与此非常相似: function(String username, String password) { String sql = "SELECT * FROM user_table WHERE id

(我不是以英语为母语的人,请原谅我的错误)

它得到了一些Java代码,这些代码负责构建一个简单的SQL查询。任务是 为两个参数
username
password
提供字符串参数,以删除
user\u表

注意:我们没有学习SQL代码,所以不必担心确切的SQL语法。这不要紧

我记不起确切的代码,但与此非常相似:

function(String username, String password)
{
    String sql = "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;
    //invoke the SQL query with this String
}
现在,这里最好的解决方案可能是:

username = "Oscar"
password = "123; DROP TABLE user_table"
但这是我写的:

username = "Oscar; DROP TABLE user_table; 1=1"
password = "123"
我在解决方案中看到的问题是,最后一个SQL命令是
1=1和pw=123
,它只是一个在代码中浮动的布尔表达式,不做任何操作。它没有分配给任何东西,也没有作为任何东西的条件


这会导致运行时错误吗?如果是,以前的命令还会执行吗?

首先,以下代码:

String sql = 
    "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;
生成无效查询:

  • id
    pw
    可能是字符串,因此传递的值应该用单引号括起来

  • 关键字前缺少空格

这应该是:

String sql = 
    "SELECT * FROM user_table WHERE id = '" + username + "' AND pw ='" + password + "'";
现在,在练习中,您可以简单地使用
pw
SELECT
之后添加
delete
语句(同时仍然为
SELECT
生成有效的SQL)。如果应用程序代码允许一次执行多个查询,则第二条语句将在第一条语句之后执行

例如,这个:

id: "foo"
pw: "bar'; DROP TABLE user_table; --"
将连接为:

SELECT * FROM user_table 
WHERE id = 'foo' AND pw ='bar'; DROP TABLE user_table; --'
请注意,最终注释标记转义了最后一个引号。这是有效的SQL,实际上会删除该表

士气:一定要使用查询参数

String sql = 
    "SELECT * FROM user_table WHERE id = :id AND pw = :pwd";

首先,此代码:

String sql = 
    "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;
生成无效查询:

  • id
    pw
    可能是字符串,因此传递的值应该用单引号括起来

  • 关键字前缺少空格

这应该是:

String sql = 
    "SELECT * FROM user_table WHERE id = '" + username + "' AND pw ='" + password + "'";
现在,在练习中,您可以简单地使用
pw
SELECT
之后添加
delete
语句(同时仍然为
SELECT
生成有效的SQL)。如果应用程序代码允许一次执行多个查询,则第二条语句将在第一条语句之后执行

例如,这个:

id: "foo"
pw: "bar'; DROP TABLE user_table; --"
将连接为:

SELECT * FROM user_table 
WHERE id = 'foo' AND pw ='bar'; DROP TABLE user_table; --'
请注意,最终注释标记转义了最后一个引号。这是有效的SQL,实际上会删除该表

士气:一定要使用查询参数

String sql = 
    "SELECT * FROM user_table WHERE id = :id AND pw = :pwd";
“从user_表中选择*,其中id=“+username+”和pw=“+password

username=“Oscar;DROP TABLE user\u TABLE;1=1”

密码=“123”

现在,如果手动更换,将导致:


从用户_表中选择*,其中id=Oscar;删除表用户\表;1=1,pw=123

这将导致SQL语法错误。如果您想变得聪明,可以在用户名“Oscar;DROP TABLE user_TABLE;1=1-”的末尾添加“-”,这将对查询的其余部分进行注释,注入将生效。

“从user_TABLE中选择*,其中id=“+username+”和pw=“+password

username=“Oscar;DROP TABLE user\u TABLE;1=1”

密码=“123”

现在,如果手动更换,将导致:


从用户_表中选择*,其中id=Oscar;删除表用户\表;1=1,pw=123


这将导致SQL语法错误。如果您想变得聪明,可以在用户名“Oscar;DROP TABLE user_TABLE;1=1-”的末尾添加“-”,这将对查询的其余部分进行注释,注入将变得有效。

本练习的重点是学习使用参数。学习使用参数。在SQL Server中,整个批处理不会编译,也不会执行任何操作。通常,注释标记用于注释掉不需要的内容code@GordonLinoff您的意思是使用参数调用函数,即函数(用户名、密码)?请不要担心这个。“这不是一个初学者编码考试,而是关于安全性的。”马丁史密斯:好的,谢谢。不幸的是,对于我的解决方案,我可能得不到很多分数。本练习的重点是学习使用参数。学习使用参数。在SQL Server中,整个批处理不会编译,也不会执行任何操作。通常,注释标记用于注释掉不需要的内容code@GordonLinoff您的意思是使用参数调用函数,即函数(用户名、密码)?请不要担心这个。“这不是一个初学者编码考试,而是关于安全性的。”马丁史密斯:好的,谢谢。不幸的是,我的解决方案可能得不到很多分数。这是否也会注释掉
1=1
?如果不是的话,我不明白为什么这现在变得有效。最后仍然会有一个布尔表达式四处浮动,什么也不做:现在它将只是
1=1
而不是
1=1和pw=123
My bad,在1=1之前添加“-”,您可以删除“1=1”,这是否也会注释掉
1=1
?如果不是的话,我不明白为什么这现在变得有效。最后仍然会有一个布尔表达式四处浮动,什么也不做:现在它将只是
1=1
,而不是
1=1和pw=123
My bad,在1=1之前添加“-”,您可以删除“1=1”