gpt4 book ai didi

mysql - 使用 MySQL 存储过程检查恶意代码

转载 作者:行者123 更新时间:2023-11-29 03:07:04 24 4
gpt4 key购买 nike

我正在尝试在 MySql 中编写一个存储过程,它将采用单个参数,然后检查该参数是否包含任何包含“DROP”、“INSERT”、“UPDATE”、“TRUNCATE”等的文本,几乎所有不是 SELECT 语句的东西。我知道这并不理想,但不幸的是,SELECT 语句是在客户端构建的,为了防止某种中间人更改,它只是服务器的安全级别增加。

我尝试了多种方法来实现它,但是,它对我不起作用。我想出了类似的事情:

CREATE PROCEDURE `myDatabase`.`execQuery` (in INC_query text)
BEGIN

#check to see if the incoming SQL query contains INSERT, DROP, TRUNCATE,
#or UPDATE as an added measure of security
IF (
SELECT LOCATE(LOWER(INC_query),'drop') OR
SELECT LOCATE(LOWER(INC_query),'truncate') OR
SELECT LOCATE(LOWER(INC_query),'insert') OR
SELECT LOCATE(LOWER(INC_query),'update') OR
SELECT LOCATE(LOWER(INC_query),'set')
>= 1)
THEN
SET @command = INC_query;
PREPARE statement FROM @command;
EXECUTE statement;
ELSE
SELECT * FROM database.otherTable; #just a generic output to know the procedure executed correctly, and will be removed later. Purely testing.

END IF;

END

即使它包含我的任何“可过滤”词,它仍然会执行查询。任何帮助将不胜感激,或者如果有更好的方法,我会洗耳恭听。

最佳答案

如果您有一个名为 updated_atsettings 的列怎么办?您不可能期望它按您的预期工作。这种技术是对 clbuttic 有如此多引用的原因在网络上。

如果你走这条路,你真的会把事情搞得一团糟。

处理此问题的唯一合理方法是发送您要构建的查询类型的参数,然后使用经过审查的允许术语白名单 在您的应用程序中构建查询。以 JSON 表示的示例:

{
"select" : {
"table" : "users",
"columns" : [ "id", "name", "DROP TABLE users", "SUM(date)", "password_hash" ],
"joins" : {
"orders" : [ "users.id", "orders.user_id" ]
}
}

您只需要创建一个查询构造函数来发出这种东西,以及另一个将它转换回有效查询的构造函数。您可能只想列出特定的列以供查询,因为某些列可能是 secret 的或仅供内部使用,不会被公开,例如本例中的 password_hash

您还可以允许像 (SUM|MIN|MAX|AVG)\((\w+)\) 这样的模式来捕获特定的分组操作或 JOIN 条件。这取决于您想走多远。

关于mysql - 使用 MySQL 存储过程检查恶意代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13596176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com