preparedStatement是否可以避免SQL注入?

发布于 2024-10-05 04:54:10 字数 100 浏览 7 评论 0原文

我已阅读并尝试将易受攻击的 SQL 查询注入到我的应用程序中。还不够安全。我只是使用语句连接进行数据库验证和其他插入操作。

准备好的语句安全吗?而且这个说法也会有问题吗?

I have read and tried to inject vulnerable sql queries to my application. It is not safe enough. I am simply using the Statement Connection for database validations and other insertion operations.

Is the preparedStatements safe? and moreover will there be any problem with this statement too?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

愛上了 2024-10-12 04:54:10

使用字符串连接从任意输入构建查询不会使 PreparedStatement 安全。看一下这个例子:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";

如果有人输入

' or '1'='1

userName,你的 PreparedStatement 将很容易受到 SQL 注入攻击,因为该查询将在数据库上执行

SELECT * FROM users WHERE name = '' OR '1'='1';

,所以,如果你使用

preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);

你会安全的。

部分代码取自这篇维基百科文章

Using string concatenation for constructing your query from arbitrary input will not make PreparedStatement safe. Take a look at this example:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";

If somebody puts

' or '1'='1

as userName, your PreparedStatement will be vulnerable to SQL injection, since that query will be executed on database as

SELECT * FROM users WHERE name = '' OR '1'='1';

So, if you use

preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);

you will be safe.

Some of this code taken from this Wikipedia article.

神仙妹妹 2024-10-12 04:54:10

如果使用得当,准备好的语句确实可以防止 SQL 注入。但请针对您的问题发布一个代码示例,以便我们可以查看您是否正确使用它。

The prepared statement, if used properly, does protect against SQL injection. But please post a code example to your question, so we can see if you are using it properly.

故事灯 2024-10-12 04:54:10

仅仅使用 PreparedStatement 并不能保证您的安全。您必须在 SQL 查询中使用参数,这可以通过 PreparedStatement 实现。请参阅此处了解更多信息。

Well simply using PreparedStatement doesn't make you safe. You have to use parameters in your SQL query which is possible with PreparedStatement. Look here for more information.

古镇旧梦 2024-10-12 04:54:10

PreparedStatement如果您仍在连接字符串,那么单独使用 并不能帮助您。

例如,一名恶意攻击者仍然可以执行以下操作:

  • 调用睡眠函数,以便所有数据库连接都将繁忙,从而使您的应用程序无法
  • 从数据库中提取敏感数据
  • 绕过用户身份验证

受影响的不仅仅是 SQL。如果不使用绑定参数,甚至 JPQL 也可能受到损害。

最重要的是,在构建 SQL 语句时绝对不应该使用字符串连接。为此目的使用专用 API:

The PreparedStatement alone does not help you if you are still concatenating Strings.

For instance, one rogue attacker can still do the following:

  • call a sleep function so that all your database connections will be busy, therefore making your application unavailable
  • extracting sensitive data from the DB
  • bypassing the user authentication

And it's not just SQL that can b affected. Even JPQL can be compromised if you are not using bind parameters.

Bottom line, you should never use string concatenation when building SQL statements. Use a dedicated API for that purpose:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文