##测试表结构 create table com_demo ( id int8 not null, name varchar(32), sex varchar(4), age int4 ); alter table com_demo add constraint com_demo_pkey primary key (id); insert into com_demo values (1, '张三', '男', 28); insert into com_demo values (2, '李四', '女', 36); insert into com_demo values (3, '王五', NULL, 19); insert into com_demo values (4, '赵六', NULL, 27);
##查询SQL(数据库级别执行没问题,经过DRUID报错) select * from com_demo order by sex asc nulls first
##报错 sql injection violation,syntax error:TODO pos 51,line 1, column 46,token FIRST:select * from com_demo order by sex asc nulls first
##定位原因,PG词法分析器关键字集合有first没有last,last正常first报错,map中删掉first正常,具体原因还不知道 com.alibaba.druid.sql.dialect.postgresql.parser.PGLexer
原提问者GitHub用户1176896650
在 PostgreSQL 中,可以使用 NULLS FIRST 或 NULLS LAST 指定空值在排序时应该排在前面或后面。如果您在排序时添加 NULLS FIRST 或 NULLS LAST 时出现了错误,可能是因为使用的 PostgreSQL 版本不支持该语法或者语法错误。
如果您在排序时添加 NULLS FIRST 或 NULLS LAST 报错,可以检查以下几个方面:
检查 PostgreSQL 版本。在使用 NULLS FIRST 或 NULLS LAST 时,需要确保使用的 PostgreSQL 版本支持该语法。如果您使用的是较旧的 PostgreSQL 版本,可能不支持该语法,需要升级到较新的版本。
检查语法错误。在使用 NULLS FIRST 或 NULLS LAST 时,需要确保语法正确,并遵循 PostgreSQL 的语法规范。可以使用 SQL 调试工具或者其他方式检查语法错误,并进行修正。
检查排序列是否存在空值。在使用 NULLS FIRST 或 NULLS LAST 时,需要确保要排序的列存在空值。如果该列不存在空值,则无法使用 NULLS FIRST 或 NULLS LAST 进行排序。
,您在使用Druid查询SQL时遇到了SQL注入漏洞。该漏洞可能是由于Druid的SQL解析器没有正确处理SQL语句中的关键字导致的。具体来说,您在查询语句中使用了“first”关键字,但是Druid的SQL解析器将其解析为一个错误的语法结构,导致查询失败。
为了解决这个问题,您可以考虑使用Druid的SQL解析器来自定义SQL解析器,以便能够正确处理SQL语句中的关键字。具体来说,您可以使用Druid的SQL解析器来实现一个自定义的SQL解析器,该解析器能够正确处理SQL语句中的关键字,从而避免出现SQL注入漏洞。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。