问题 单项选择题

某公司开发基于Web的招聘系统,采用Java EE系统架构。该系统实现时,对用户的登录判断所使用的动态SQL语句如下。
SELECT *FROM Users WHERE User_Name="+strUserName+"AND Password="+strPassword+";
以下关于该SQL语句的讨论中,正确的观点是______。

A.这是一条安全的SQL语句,能够防止SQL注入
B.该SQL语句不安全,若执行测试用例“strUsetName:Guo'or'a'='a,strPassword:Zhu'or'a'='a",则系统就允许以第一行的身份进行登录
C.该SQL语句容易造成SQL注入,若执行测试用例“strUser Name:'Guo'--,strPassword:Zhu”,则系统就允许以Guo身份登录,并对用户表中的所有行做任何操作
D.该SQL语句容易造成SQL注入,若执行测试用例“strUsetName:'Guo';DROP table,strPassword:Zhu”,则系统将造成数据库中的所有表被永久删除

答案

参考答案:B

解析: 依题意,对于该动态SQL语句若采用拼接字符串方式,则无法防止SQL注入。例如,若执行测试用例“strUserName:Guo'or'a'='a,strPassword:Zhu'or'a'='a”,则该SQL语句变为:
SELECT *FROM Users WHERE User_Name='Guo'or'a'='a'AND Password='Zhu'or'a'='a';
由于'a'='a'条件总是成立,因此SQL的执行结果包括用户表中的所有行,系统就允许以第一行的身份进行登录。
再例如,若执行测试用例“strUserName:'Guo'--,strPassword:Zhu”,则陔SQL语句变为:
SELECT *FROM Users WHERE User_Name='Guo'--AND Password= 'Zhu';
由于“--”是SQL中的注释符号,其后的内容为注释,因此上述语句中“--”之后的内容变为注释,只要用户表中存在用户名为Guo,系统就允许用户以Guo的身份登录,并以Guo的身份进行任何可进行的操作。
更为严重的情况下,若用户输入“strUserName:'Guo';DROP table users_details;'--'”,以及任何字符串作为strPassword,该SQL就变为:
SELECT *FROM Users WHERE User_Name='Guo';DROP table users_details;
'--'AND Password='Zhu';
这就造成数据库中users details表被永久删除。
防止SQL注入的方法主要有:拼接SQL之前对特殊符号进行转义,使其不作为SQL语句的功能符号。

多项选择题
问答题 简答题