是否有必要验证输入以防止SQL注入?

是否有必要验证输入以防止SQL注入?,sql,security,jpa,sql-injection,Sql,Security,Jpa,Sql Injection,我正在读这篇文章: 我正在使用JPA和准备好的语句(这是第一点)。 还有第三点,就是使用白名单进行输入验证 当我使用准备好的语句时,是否需要注意输入验证 我不明白白名单(第3点)。比如说,我会有一个输入,您可以在其中写入文档的名称。我将如何验证此输入?你能给我一些例子,如何验证输入以防止SQL注入吗?因此,我的JPQL查询是: 从文档d中选择d,其中d.user.id=:id和d.title=:title 您正在使用准备好的语句,将所有SQL数据文本(简单地说,字符串和数字)从变量放入查询中

我正在读这篇文章: 我正在使用JPA和准备好的语句(这是第一点)。 还有第三点,就是使用白名单进行输入验证

  • 当我使用准备好的语句时,是否需要注意输入验证
  • 我不明白白名单(第3点)。比如说,我会有一个输入,您可以在其中写入文档的名称。我将如何验证此输入?你能给我一些例子,如何验证输入以防止SQL注入吗?因此,我的JPQL查询是:
从文档d中选择d,其中d.user.id=:id和d.title=:title


您正在使用准备好的语句,将所有SQL数据文本(简单地说,字符串和数字)从变量放入查询中。不需要其他验证。相反,在使用准备好的语句时,不应考虑数据源问题(无论是用户输入还是其他任何内容)。不管任何情况,都要无条件地准备好陈述

在极少数情况下,当您需要从变量中添加任何其他SQL查询部分(例如标识符或关键字)时,应该实现基于白名单的过滤。这种方法只是代表根据程序中硬编码的值列表过滤输入变量。鉴于选择总是有限的(与数据变量相反),这是相当合理的。例如,如果表格顺序基于用户输入,则应根据代码中预先编写的值列表检查字段名和方向关键字(ASC或DESC)

正如“您的常识”(希望也是您的常识)所说,在本例中,您将通过使用准备好的语句(又称参数化查询)来避免SQL注入。当使用准备好的语句时,参数永远不会被解释为SQL,它们只是作为数据由数据库处理

但是,当您能够进行验证时,验证总是很好的防御编码。将数据(文档的名称)放入数据库后将如何使用它。开发人员通常将数据库中的数据视为“可信数据”,并且没有适当地利用编码或准备好的语句,这可能会导致各种问题,例如二阶SQL注入或存储的XSS

值的白名单验证是理想的,但这并不总是可能的。在您的案例中,如何验证自由格式文本(如文档名称)?您可能希望将您的姓名限制为某些字符(白色字符列表),但这可能会造成限制并导致国际化问题。至少:

  • 您可以要求大多数字段具有最大长度
  • 您通常应该验证任何字符串只包含有效的 用于编码的字符(例如,否)-此 通常可以在WAF或servlet过滤器中完成
  • 您可能还希望将输入限制为
一般而言,您应该始终:

  • 在将某些内容放入数据库(或将其传递到任何信任边界)之前,尽可能对输入进行验证
  • 将来自其他来源(如数据库)的任何数据视为不受信任的数据,并确保您正在使用准备好的语句、编码或以其他方式处理不受信任的数据

当您只替换查询中的参数值时,不需要担心SQL注入。如果您构造查询并替换表名或列名之类的内容,您就会这样做。谢谢。即使用户想要登录到应用程序,它也安全吗?因此,仅当我需要处理表/列时(替换、创建等)?我理解得对吗?