gpt4 book ai didi

mysql - 这个MySQL存储过程如果使用prepared statements是否还有SQL注入(inject)的风险?

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:28 25 4
gpt4 key购买 nike

我是 MySQL 的新手,我尽可能多地进行了搜索,但我希望有人能为我提供明确的答案。

我一直在研究我的 MySQL 数据库中存储过程的问题。它采用来自外部源的单个字符串参数作为搜索值,并基于该参数返回结果。但是,只要键入 '(单引号/撇号),它就会返回错误。调查后,我被告知 SP 因为它很容易受到 SQL 注入(inject)的攻击,并且通过解决单引号的问题将得到解决。这是存储过程:

BEGIN
SET @t1=CONCAT("SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like","'",searchString,"%'"," LIMIT 20");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END

我看过的所有内容都表明避免 SQL 注入(inject)的最佳方法是使用准备好的语句,那么它仍然存在风险吗?此外,为了解决单引号的问题,我看到了在键入的任何地方添加另一个单引号的建议(因此 ' 将变为 '')。这是修复错误的最佳方法吗?

感谢帮助

最佳答案

当您使用准备好的语句时,您没有为语句的变量部分使用位置占位符 ?。因此,您编写的选择查询仍然容易出现 SQL 注入(inject)。这是一个更新版本:

BEGIN
SET @t1 = CONCAT('SELECT ID AS Id, NAME AS Name, FROM SEARCH_TABLE WHERE NAME LIKE ? LIMIT 20');
PREPARE stmt1 FROM @t1;
SET @a = CONCAT('%', searchString, '%'); -- assuming searchString is defined somewhere
EXECUTE stmt1 USING @a;

我们使用 CONCAT() 函数绑定(bind) %?%,并注意到 LIKE 占位符只是一个 ? 。此外,理想情况下,您的查询应该有一个 ORDER BY 子句,假设它使用的是 LIMIT

关于mysql - 这个MySQL存储过程如果使用prepared statements是否还有SQL注入(inject)的风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58337194/

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