繁体   English   中英

如果使用准备好的语句,这个 MySQL 存储过程是否仍然存在 SQL 注入的风险?

[英]Is this MySQL stored procedure still at risk of SQL injection if it uses prepared statements?

我对 MySQL 还很陌生,我已经尽可能多地搜索了,但我希望有人能给我一个明确的答案。

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

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 注入的最佳方法是使用准备好的语句,那么它仍然存在风险吗? 此外,为了解决单引号的问题,我已经看到建议在输入的任何位置添加另一个单引号(因此 ' 将变为 '')。 这是修复错误的最佳方法吗?

谢谢您的帮助

当您使用准备好的语句时,您没有使用位置占位符? 对于您的陈述的可变部分。 因此,您编写的 select 查询仍然容易出现 SQL 注入。 这是一个更新的版本:

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() function 绑定%?% ,并注意到LIKE占位符只是一个? . 此外,假设您的查询使用LIMIT ,理想情况下应该有一个ORDER BY子句。

是的,您的代码对 SQL 注入开放,因为准备好的语句将用户提供的输入按原样连接在一起。 假设searchString包含字符串' OR '%' = '那么这个:

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

会导致:

SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like'' OR '%' = '%' LIMIT 20

它将允许某人通过任意 where 子句。 此外,用户输入中的单个'将中断查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM