回答

收藏

为什么我们总是喜欢在SQL语句中使用参数?

技术问答 技术问答 131 人阅读 | 0 人回复 | 2023-09-13

我对使用数据库非常陌生。现在我可以写SELECT,UPDATE,DELETE,和INSERT命令。但是我看过很多我们喜欢写的论坛:& j- i. G+ \, a2 l2 H
SELECT empSalary from employee where salary = @salary
- ]# a. o$ V4 [+ f' u…代替:
0 k6 `% w  c3 a1 |SELECT empSalary from employee where salary = txtSalary.Text9 n5 V- @! f) z0 g9 B
为什么我们总是喜欢使用参数,我将如何使用它们?) X; l$ X% n' h* f
我想知道第一种方法的用途和好处。我什至听说过SQL注入,但是我不太了解。我什至不知道SQL注入是否与我的问题有关。3 k3 ?# q9 K! j2 D
               
5 N) b5 `* M, @解决方案:, ]+ P, ^) v: q  j% I  E  Z; g- C
               
/ A+ @7 H$ h( d4 f. Y. M8 x8 u3 v
, z- m0 C  o/ [3 O$ b! z
  M5 U0 v8 t+ C% `                当数据库与程序界面(例如桌面程序或网站)结合使用时,使用参数有助于防止 SQL注入攻击2 S8 X/ @! g% T; N8 `
在您的示例中,用户可以通过编写中的语句直接在数据库上运行SQL代码txtSalary。
3 ?. O2 x' e1 m2 V. C! a( c例如,如果他们要编写0 OR 1=1,则执行的SQL将是0 \9 Y; ]+ v4 ^* }7 n8 h
SELECT empSalary from employee where salary = 0 or 1=1
2 f9 A8 _% k9 E# y- T6 ?从而所有empSalaries都将被退回。
* V4 ]0 Z" N. `9 A. }* u- `此外,用户可能会对您的数据库执行更差的命令,包括删除以下命令0; Drop Table employee:% n0 Q/ v0 [2 }! [' T1 z
SELECT empSalary from employee where salary = 0; Drop Table employee
: a/ w0 U* {. U' B0 z: jemployee然后将删除该表。
) I5 C+ x4 g) L5 Y0 Y- d9 U6 ~1 ^$ W' f3 z% b# E' e
就您而言,您似乎正在使用.NET。使用参数非常简单:
( a9 z& N: a( }# Y    string sql = "SELECT empSalary from employee where salary = @salary";
9 x3 V9 @. U. R$ S4 g    using (SqlConnection connection = new SqlConnection(/* connection info */))
5 I: `" f! x. w" \+ C6 Z$ r5 x, k    using (SqlCommand command = new SqlCommand(sql, connection))* m3 f& t* Q& m' J, j0 c
    {
8 A, @  e9 s# x* U5 }" p* t        var salaryParam = new SqlParameter("salary", SqlDbType.Money);
& g3 [0 Q% A. v" d  r' j        salaryParam.Value = txtMoney.Text;
  d( f: T* b% S* `8 ^0 Z        command.Parameters.Add(salaryParam);. P, s' S3 i3 S* e: W3 u
        var results = command.ExecuteReader();6 r0 G7 o* g* B$ ~
    }2 j/ M! W9 I. v) Q2 o3 X

- m, Q) c& H; ^4 h0 C0 L7 w
9 D6 t! ?# C2 m# b5 d    Dim sql As String = "SELECT empSalary from employee where salary = @salary". N1 N! ]4 c  Y, R- a# k) n
    Using connection As New SqlConnection("connectionString")7 B5 e, w+ V0 H" q2 D
        Using command As New SqlCommand(sql, connection)5 R) g2 ?2 ?" f$ o
            Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
5 }% |* L  M( Z% R$ {" V+ f' }1 G! ~9 @            salaryParam.Value = txtMoney.Text
7 j8 g8 d* Y+ A8 t! M) \' ~( W            command.Parameters.Add(salaryParam)& p! M1 R: ~  ]5 ?8 b
            Dim results = command.ExecuteReader()0 b* f+ e* u) J* B0 {7 x
        End Using$ Q0 M; I# _7 _- {* I6 J; d9 m
    End Using5 D9 A6 G3 l, d* R3 `& F. `
编辑2016-4-25:
  D6 h7 T2 R1 V0 w8 Q8 P根据George Stocker的评论,我将示例代码更改为not use8 \" O7 A) O" _) w* l
AddWithValue。另外,通常建议您将IDisposables包装在using语句中。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则