Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

怎样实现与MySQL原生客户端库libmysql相同的预编译相关接口(mysql_stmt_...)的功能 #1599

Open
SuKunlun opened this issue Aug 2, 2024 · 4 comments

Comments

@SuKunlun
Copy link

SuKunlun commented Aug 2, 2024

看了下源码: 1、workflow中仅实现了COM_QUERY协议 2、libmysql中mysql_stmt_execute实现的源码,其底层发送的依次是下列请求: COM_STMT_PREPARE请求 预编译请求 COM_STMT_SEND_LONG_DATA请求 发送参数值给预编译语句,预编译中有几个就得发几个该请求,参数值按内容copy到数据包 COM_STMT_EXECUTE请求 执行预编译语句

所以我理解 Prepare Satement 不是建立在原始SQL语句上的功能,它有自己特定的请求协议,只是用原始的SQL语句也能实现。(不确定理解的对不对。。。。)

根据目前workflow提供的接口,好像也只能对参数值做下转义处理,然后拼接出SET语句执行,我还没有想到怎样封装能避免这种手动拼接SQL的方法。

要想实现libmysql预编译相关接口功能,可能还是需要在workflow底层实现COM_STMT_...相关的通信协议,并提供相应接口。。。。

@Barenboim
Copy link
Contributor

根据我们之前对MySQL指令的了解,大多数指令都是可以用QUERY来解决,例如PREPARE,EXECUTE都有对应的SQL语句。你了解到的 COM_STMT_PREPARE 和 PREPARE 语句,在功能上有区别吗?

@SuKunlun
Copy link
Author

SuKunlun commented Aug 2, 2024

根据我们之前对MySQL指令的了解,大多数指令都是可以用QUERY来解决,例如PREPARE,EXECUTE都有对应的SQL语句。你了解到的 COM_STMT_PREPARE 和 PREPARE 语句,在功能上有区别吗?

先说下哈,目前我们使用预编译主要是想解决项目中的SQL注入问题。
这两者感觉功能上基本没有区别,但是libmysql中mysql_stmt_相关接口可以完全避免手动拼接SQL语句,感觉能很好的解决SQL注入问题。
如果用QUERY来解决,好像不能避免手动拼接SQL语句,感觉这样SQL注入的风险就很大。

@Barenboim
Copy link
Contributor

根据我们之前对MySQL指令的了解,大多数指令都是可以用QUERY来解决,例如PREPARE,EXECUTE都有对应的SQL语句。你了解到的 COM_STMT_PREPARE 和 PREPARE 语句,在功能上有区别吗?

先说下哈,目前我们使用预编译主要是想解决项目中的SQL注入问题。 这两者感觉功能上基本没有区别,但是libmysql中mysql_stmt_相关接口可以完全避免手动拼接SQL语句,感觉能很好的解决SQL注入问题。 如果用QUERY来解决,好像不能避免手动拼接SQL语句,感觉这样SQL注入的风险就很大。

我们刚才研究了一下MySQL的二进制命令,用这个来防止SQL注入确实比文本命令更好。虽然PREPARE和EXECUTE用文本命令的方式也可以发送,但依然有SQL拼接的可能性。

不过我们目前公司内部没有用户向我们提这个需求,所以目前也分不出精力开发。如果你有兴趣也可以自己尝试实现一下。包的基本结构是一样的,可能mysql_parser部分都是可以复用。需要派生出MySQLBinRequest和MySQLBinResponse来支持二进制命令的发送和结果接收。

@SuKunlun
Copy link
Author

SuKunlun commented Aug 5, 2024

根据我们之前对MySQL指令的了解,大多数指令都是可以用QUERY来解决,例如PREPARE,EXECUTE都有对应的SQL语句。你了解到的 COM_STMT_PREPARE 和 PREPARE 语句,在功能上有区别吗?

先说下哈,目前我们使用预编译主要是想解决项目中的SQL注入问题。 这两者感觉功能上基本没有区别,但是libmysql中mysql_stmt_相关接口可以完全避免手动拼接SQL语句,感觉能很好的解决SQL注入问题。 如果用QUERY来解决,好像不能避免手动拼接SQL语句,感觉这样SQL注入的风险就很大。

我们刚才研究了一下MySQL的二进制命令,用这个来防止SQL注入确实比文本命令更好。虽然PREPARE和EXECUTE用文本命令的方式也可以发送,但依然有SQL拼接的可能性。

不过我们目前公司内部没有用户向我们提这个需求,所以目前也分不出精力开发。如果你有兴趣也可以自己尝试实现一下。包的基本结构是一样的,可能mysql_parser部分都是可以复用。需要派生出MySQLBinRequest和MySQLBinResponse来支持二进制命令的发送和结果接收。

好的,我这边研究下!
感谢解答!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants