回答

收藏

C#sqlite注入

技术问答 技术问答 355 人阅读 | 0 人回复 | 2023-09-14

如果我更改选择
$ U2 f. g) [7 p: w8 b& r  wString insSQL2
+ @* T  k+ Y' v7 z9 i    = "select * from Produtos where nome = '" + txtBuscaNome.Text + "'") C; n3 ?( D5 |: H# P$ d$ {; Q

( z) H1 v% }& z; `8 ?String insSQL21 T2 ?6 p0 c# l. G7 s
    = "select * from Produtos where nome = ''" + txtBuscaNome.Text + "''"
4 X; d2 y, n" j会阻止sql注入吗?
" L, M+ g8 z9 l2 o                & ^5 s* M- [% S6 x% y  A! W" b& B" @
解决方案:
0 |. ]# P( E# p1 ~               
) R; g9 S% D- b+ o. l0 S7 Y8 |( w6 P7 h, Q8 {: E/ {  `

* v; m/ ~( T( E* m" e8 c7 c                不。
3 E, o$ {$ g' ]$ H' R9 S7 `# _SQL注入不是创造性地使用引号字符。这是关于将输入视为 数据 而不是 代码 。看一下经典的SQL注入漏洞:
' W. M6 [5 ]' v9 z"SELECT * FROM Users WHERE Id = " + someValue;' J% y' h, d, [3 k
从直观 上看 ,您 似乎 将其someValue用作数据值,但 实际上是 将其用作 实际的SQL代码; _+ z3 S& o( d" r4 ^
。SQL引擎不会将此视为值参数,而是将其视为正在执行的命令的一部分。该代码 应该 只是一个值,但 可以 是任何值。而且您将执行提供的任何代码。
4 o8 |  x( ^1 v以这种方式进行思考,很明显,您永远不应在应用程序中 执行用户提供的代码 。
9 k  P2 ^( m$ R7 e3 K替代方法是将用户输入视为 预定义 代码中的值。这样,您可以控制代码的完整范围,并且用户仅提供值。看起来更像这样:) j+ t' `! ]  p( w: n" {# N/ `
"SELECT * FROM Users WHERE Id = @id";
1 R$ K( x+ {) ?; d现在,SQL引擎将看到该参数(@id),并希望您为该参数提供一个 值 。在ADO.NET中,它可能类似于:, C# G1 X7 B, q" v
someCommand.Parameters.AddWithValue("@id", someValue);
6 B3 ~# U) w5 o* t+ i9 U- q1 l现在,SQL引擎知道这是一个数据值而不是代码,因此它将其视为数据而不是执行它。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则