问题描述 我们前端希望要一个订单编号,我打算拿数据库中的 id,截取中间的一部分出来当成订单编号用。 然后 Druid 就给我报sql injection violation了。。。
重现步骤 执行以下 SQL:
SELECT SUBSTR('12345678' FROM 2 FOR 4)
异常信息
sql injection violation, syntax error: syntax error, expect RPAREN, actual FOR pos 35, line 1, column 32, token FOR : SELECT SUBSTR('12345678' FROM 2 FOR 4)
原提问者GitHub用户lg-Cat73
SQL注入是一种常见的安全漏洞,攻击者可以通过构造恶意的SQL语句来执行未经授权的操作。根据您的描述,您在使用Druid时遇到了SQL注入违规的报错。
为了防止SQL注入漏洞,请采取以下措施:
1. 使用参数化查询:使用预编译语句和参数来执行SQL查询。例如,在Java中可以使用PreparedStatement对象进行参数化查询。通过使用问号(?)占位符代替实际的参数,并使用setXXX方法设置参数值,可以防止恶意输入注入到SQL语句中。
2. 输入验证和过滤:对用户输入数据进行验证和过滤,确保输入数据符合预期格式,并清理特殊字符。可以使用正则表达式验证输入数据的格式,或使用工具类如Apache Commons Lang中的StringEscapeUtils对输入数据进行过滤。
3. 最小化数据库权限:限制数据库用户的操作权限,最小化其权限范围。创建一个只有查询权限的数据库用户,并在应用程序中使用该用户执行查询操作。这样即使发生SQL注入漏洞,攻击者也无法执行除查询以外的操作。
另外,根据提供的异常信息,Druid库已经修复了与OFFSET FETCH语法相关的SQL注入问题。确保您使用的是Druid的最新版本,可以避免这个问题。
以上措施应该帮助您解决SQL注入违规问题。如果还有其他问题,请随时提问。
SQL注入是一种常见的安全漏洞,攻击者可以通过构造恶意SQL语句来执行未经授权的操作,例如删除数据、修改数据、插入数据或者获取敏感数据等。
采取以下措施:
1.参数化查询
参数化查询是一种使用预编译语句和参数来执行SQL查询的技术,可以避免SQL注入漏洞。例如,您可以使用JDBC的PreparedStatement对象来执行参数化查询。在参数化查询中,您可以使用问号(?)来表示参数,并使用setXXX方法来设置参数值。
2.输入验证和过滤
输入验证和过滤是一种验证和清理用户输入数据的技术,可以防止恶意输入导致的SQL注入漏洞。例如,您可以使用Java的正则表达式来验证输入数据是否符合预期格式,或者使用Apache Commons Lang库中的StringEscapeUtils类来过滤输入数据中的特殊字符。
3.最小化数据库权限
最小化数据库权限是一种限制用户对数据库的操作权限的技术,可以减少SQL注入漏洞造成的损失。例如,您可以创建一个只有查询权限的数据库用户,并在应用程序中使用该用户来执行查询操作。这样可以避免开发人员使用具有高权限的数据库用户来执行查询操作,从而减少SQL注入漏洞的风险。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。