SQL 参数 - 在哪里使用

发布于 2024-12-09 19:26:46 字数 264 浏览 0 评论 0原文

我正在将 SQL 参数应用到我的项目中以防止 SQL 注入。

我是否向应用程序中的每个查询(包括没有任何用户交互的查询)添加参数?

例如,如果我的用户想要搜索关键字并提交了一个文本字段。我已将参数化方法添加到使用该关键字的查询中,以阻止用户添加恶意内容。但在这个查询的下面是另一个查询,它从顶部搜索中获取关键字 ID,并在其他地方运行它自己的小查询。

这就是令我困惑的地方,即使关键字 ID 不是来自用户,我是否也将参数方法添加到此查询中?

非常感谢

I'm in the midst of applying SQL parameters to my project to prevent SQL Injection.

Do I add parameters to every query in my application, including the queries that don't have any user interaction?

For example, if my user wanted to search for a keyword and submitted a text field. I've added the parameterized method to the query that used that keyword, to stop the user adding something malicious. But underneath this query, is another query, which get's the keyword ID from the top search and runs it's own little query elsewhere.

This is what's confusing to me, do I add the parameter method to this query too, even though the keyword ID wasn't from the user?

Many thanks

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

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

发布评论

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

评论(2

从来不烧饼 2024-12-16 19:26:46

是的,在任何有参数的地方使用参数化查询。

今天在特定查询上没有使用用户输入这一事实并不意味着明天也会一样。代码更改。也许恶意用户会找出如何破坏第一个查询,然后破坏第二个查询。

您应该考虑纵深防御

Yes, use parameterized queries in any place you have parameters.

The fact that today no user input is used on a specific query doesn't mean tomorrow will be the same. Code changes. Perhaps a malicious user will figure out how to compromise the first query and then the second one.

You should think about defense in depth.

世界如花海般美丽 2024-12-16 19:26:46

是的,这也应该是一个参数。否则,您必须跟踪插入到数据库中的哪些值来自用户 - 没有什么可以阻止“'; DROP DATABASE”的名称。如果您盲目地相信数据库中的数据会被清理,那么您一定会在某些时候出错。

像这样的东西

SELECT Rows FROM TABLE2 WHERE KeywordId = (
   SELECT KeywordId FROM TABLE1 WHERE UserInput = @u
)

就可以了,因为你的 SQL 引擎将在内部使用参数。其逻辑如下:

var keywordId = sql_exec("SELECT KeywordId FROM Table1 WHERE UserInput = @u", userInput);
var rows = sql_exec("SELECT Rows FROM Table2 WHERE KeywordId = '" + keywordId + "'");

这是不正确的 - 因为应用程序没有使用外部和变量输入的参数。

Yes, that should be a parameter too. Otherwise, you have to keep track of what values that you have inserted into the db came from a user - there's nothing to prevent the name of "'; DROP DATABASE". If you're blindly trusting data from the database to be sanitized, you're bound to get it wrong at some point.

Something like:

SELECT Rows FROM TABLE2 WHERE KeywordId = (
   SELECT KeywordId FROM TABLE1 WHERE UserInput = @u
)

would be ok, because your SQL engine will use parameters internally. It's the logic like:

var keywordId = sql_exec("SELECT KeywordId FROM Table1 WHERE UserInput = @u", userInput);
var rows = sql_exec("SELECT Rows FROM Table2 WHERE KeywordId = '" + keywordId + "'");

that would be incorrect - since the application is not using parameters for external and variable input.

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