如何处理mysql程序中的where子句?
问题描述:
这是我的程序。如何处理mysql程序中的where子句?
DELIMITER //
drop procedure if exists GetID;
CREATE PROCEDURE GetID(IN tb VARCHAR(255), in name2 varchar(255))
BEGIN
set @sel = concat('select id FROM ', tb, ' WHERE ename = ', name2);
prepare stmt from @sel;
execute stmt;
deallocate prepare stmt;
END //
DELIMITER ;
当我尝试使用GetID('city','ny')执行存储过程时。我WHERE子句中的错误
未知列“NY” ......
这里“城市”是表名。哪里不对?
答
假设名2是与通过表中的列ename进行比较围在SQL名2
戴上引号的字符串参数:
set @sel = concat('select id FROM ', tb, ' WHERE ename = ''', name2,'''');
它通常建议不要使用字符串连接构建SQL查询。由于您正在对查询中的列名进行硬编码,因此提供“动态”表名是没有意义的。但是,如果必须,请使用QUOTE
正确地转义并引用传入的字符串。
set @sel = concat('select id FROM ', tb, ' WHERE ename = ', quote(name2));
答
绝不将字符串直接连接到查询中。这是非常糟糕的,你传递一个表名,unsanitized。这需要固定,太多,但一个正确的解决方案,您的直接问题是:
set @sel = concat('select id FROM ', tb, ' WHERE ename = ', QUOTE(name2));
的QUOTE()
功能正确和安全的报价和逃逸的说法,并正确处理空值和...这里防止SQL注入漏洞。
请参阅https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_quote。
它的工作原理!你能否解释为什么我应该在'ename ='后面加三个引号,最后是四个引号?非常感谢。 – dullboy
我仍然无法弄清楚为什么我需要在'ename ='和最后四个引号之后使用三重引号。假设查询应该看起来像这样,'从tb where ename ='name2''中选择id。如果我们需要使用一个多引号来逃避单引号,它应该看起来像'从tb中选择id,其中ename =''name2'''。我错过了什么?非常感谢。 – dullboy
Nooooooo。 SQL注入失败。 –