通过基于三个过滤器的concating条件创建一个简单的SQL查询—Java&;MySQL
我有三个HTMLSelect标记。内容如下:通过基于三个过滤器的concating条件创建一个简单的SQL查询—Java&;MySQL,java,mysql,sql,Java,Mysql,Sql,我有三个HTMLSelect标记。内容如下: 所有人、用户、来宾 全部,批准,拒绝 所有的,公共的,私人的 我正在做以下工作: String by = //Some Code to get this value String status = //Some Code to get this value String privacy = //Some Code to get this value String searchQuery = "SELECT * FROM requests"; if
String by = //Some Code to get this value
String status = //Some Code to get this value
String privacy = //Some Code to get this value
String searchQuery = "SELECT * FROM requests";
if(!by.equalsIgnoreCase("all")){
searchQuery += " WHERE SEARCH_BY='" + by + "'";;
}
if(!status.equalsIgnoreCase("all")){
searchQuery += " WHERE SEARCH_STATUS='" + status + "'";;
}
if(!privacy.equalsIgnoreCase("all")){
searchQuery += " WHERE SEARCH_PRIVACY='" + privacy + "'";;
}
仅当用户仅更改一个标记时,此查询才有效。但是,如果他更改两个select标记:searchQuery
将如下所示:
SELECT * FROM requests WHERE SEARCH_BY='Users' WHERE SEARCH_STATUS='Rejected'
我知道我可以使用和
关键字,比如:WHERE this condition和that condition
但是知道此条件
存在的可能性有多大(仅当此选择标记未更改时),它会使我的查询如下:何处和该条件
最后,我需要的是:
Select * FROM requests WHERE SEARCH_BY='A' AND SEARCH_STATUS='B' AND SEARCH_PRIVACY='C';
其中A
,B
和C
可以是全部或一个值。当它完成时,我希望它包含来自数据库的所有结果
类似于:WHERE SEARCH\u BY='all'
应将数据库的所有行返回到all
关键字,而不是将SEARCH\u BY
列的值与之匹配。尝试以下操作:
String searchQuery = "SELECT * FROM requests where 1=1";
if(!by.equalsIgnoreCase("all")){
searchQuery += " AND SEARCH_BY='" + by + "'";;
}
if(!status.equalsIgnoreCase("all")){
searchQuery += " AND SEARCH_STATUS='" + status + "'";;
}
if(!privacy.equalsIgnoreCase("all")){
searchQuery += " AND SEARCH_PRIVACY='" + privacy + "'";;
}
这使用了一个虚拟条件,因此无论满足多少其他条件,它们都将被添加为和尝试以下操作:
String searchQuery = "SELECT * FROM requests where 1=1";
if(!by.equalsIgnoreCase("all")){
searchQuery += " AND SEARCH_BY='" + by + "'";;
}
if(!status.equalsIgnoreCase("all")){
searchQuery += " AND SEARCH_STATUS='" + status + "'";;
}
if(!privacy.equalsIgnoreCase("all")){
searchQuery += " AND SEARCH_PRIVACY='" + privacy + "'";;
}
这使用了一个虚拟条件,因此无论满足多少其他条件,它们都将被添加为和首先确保“by”、“status”和“privacy”值与选择选项相等。这样编写的代码可能会成为SQL注入的牺牲品。有很多方法可以做到这一点。一个简单的例子是:
public enum EBy {
All, Users, Guests
}
public enum EStatus {
All, Approved, Rejected
}
public enum EPrivacy {
All, Public, Private
}
EBy eBy = EBy.valueOf(by);
EStatus eStatus = EStatus.valueOf(status);
EPrivacy ePrivacy = EPrivacy.valueOf(privacy);
避免在sql查询中使用“WHERE 1=1”SELECT*fromt
不等于SELECT*fromt,其中1=1
您可以看到在两个查询上运行“explain”
String where = "";
if (eBy != null && eBy != EBy.All) {
where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_BY = '" + eBy.name() + "'";
}
if (eStatus != null && eStatus != EStatus.All) {
where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_STATUS = '" + eStatus.name() + "'";
}
if (ePrivacy != null && ePrivacy != EPrivacy.All) {
where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_PRIVACY = '" + ePrivacy.name() + "'";
}
searchQuery += where;
您正在使用JDBC吗?尝试对准备好的查询应用值,而不是将它们连接到查询字符串中。互联网上有很多关于这方面的资料,例如:首先确保“by”、“status”和“privacy”值与选择选项相等。这样编写的代码可能会成为SQL注入的牺牲品。有很多方法可以做到这一点。一个简单的例子是:
public enum EBy {
All, Users, Guests
}
public enum EStatus {
All, Approved, Rejected
}
public enum EPrivacy {
All, Public, Private
}
EBy eBy = EBy.valueOf(by);
EStatus eStatus = EStatus.valueOf(status);
EPrivacy ePrivacy = EPrivacy.valueOf(privacy);
避免在sql查询中使用“WHERE 1=1”SELECT*fromt
不等于SELECT*fromt,其中1=1
您可以看到在两个查询上运行“explain”
String where = "";
if (eBy != null && eBy != EBy.All) {
where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_BY = '" + eBy.name() + "'";
}
if (eStatus != null && eStatus != EStatus.All) {
where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_STATUS = '" + eStatus.name() + "'";
}
if (ePrivacy != null && ePrivacy != EPrivacy.All) {
where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_PRIVACY = '" + ePrivacy.name() + "'";
}
searchQuery += where;
您正在使用JDBC吗?尝试对准备好的查询应用值,而不是将它们连接到查询字符串中。互联网上有很多关于这方面的资料,例如:只是想确认它是否匹配一个整数和另一个整数,或者我需要创建一个名为“1”和值“1”的列。是的,它匹配一个整数和另一个整数,等于true=true或1>0等等。。不需要添加任何内容@Rupinderjeet47只想确认它是否将一个整数与另一个整数匹配,或者我需要创建一个名为“1”和值“1”的列。是的,它将一个整数与另一个intenger匹配,等于true=true或1>0等。。不需要添加任何内容@rupinderjeet47eBy
和eBy.name()
之间有什么区别?此查询用于结果集。我认为用户不能在我的网站上编辑select标签的属性/值。我直接在查询中插入标记中的值。如果他们设法只改变select变量,就会出现注入。对吗?RE:eBy
和eBy.name()
之间有什么区别,因为您使用enum
对象来匹配eBy.All
,那么,为什么您不能在查询中输出它,为什么您需要使用eBy.name()
?1。用户可以编辑HTML发送到服务器的值。阅读更多关于SQL注入的信息。“some string”+eBy+“some string”等于“some string”+eBy.toString()+“some string”,这就是为什么我会优先选择eBy.name(),因为我不确定是否没有为该枚举预定义toString()方法。在一个大的应用程序中,依赖toString()方法不是一个好主意,因为有人可能会更改它,甚至不会警告您:)为什么一个带有“Where 1=1”的查询不等于另一个没有它的查询?在eBy
和eBy.name()
之间有什么区别?此查询用于结果集。我认为用户不能在我的网站上编辑select标签的属性/值。我直接在查询中插入标记中的值。如果他们设法只改变select变量,就会出现注入。对吗?RE:eBy
和eBy.name()
之间有什么区别,因为您使用enum
对象来匹配eBy.All
,那么,为什么您不能在查询中输出它,为什么您需要使用eBy.name()
?1。用户可以编辑HTML发送到服务器的值。阅读更多关于SQL注入的信息。“some string”+eBy+“some string”等于“some string”+eBy.toString()+“some string”,这就是为什么我会优先选择eBy.name(),因为我不确定是否没有为该枚举预定义toString()方法。在大型应用程序中,依赖toString()方法不是一个好主意,因为有人可能会更改它,甚至不会警告您:)为什么带有“Where 1=1”的查询不等于没有它的另一个查询?