来自“ Bobby Tables” XKCD漫画的SQL注入如何工作?
技术问答
411 人阅读
|
0 人回复
|
2023-09-14
|
此SQL的作用是:
/ m j8 o! A7 j9 v/ ZRobert’); DROP TABLE STUDENTS; –* z& G( I2 k* |6 \5 I, c0 J6 ~9 |
我知道这两个’和–是征求意见,但不字DROP得到的评论,以及因为它是在同一行的一部分吗?5 z! v4 h, b, U: G! K
9 ?0 W0 X3 {. E; D, d, ?8 a解决方案:
' O: o. f) s& R" r$ \9 M8 O/ c
3 q0 u T- l+ z5 P4 c4 g+ k. b6 {( g2 X4 A& ]1 J
2 i6 M3 M% z" K
学校程序中的原始代码可能看起来像
/ b/ {/ ^1 C5 P2 R4 Xq = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";
) u+ Q! F* D7 P/ t0 p9 F
) A8 T1 P! o2 _如您所见,这是将文本输入添加到查询中的简单方法,并且非常糟糕。
5 b4 U6 V0 ~8 V: p+ z! L% u在将名字,中间名称文本框FNMName.Text(即Robert'); DROP TABLE STUDENTS; –)和姓氏文本框LName.Text(即称为Derper)的值与查询的其余部分连接在一起之后,结果实际上是两个查询,中间用语句终止符(分号)。第二个查询已注入到第一个查询中。当代码对数据库执行此查询时,它将看起来像这样& U1 {" D* H k Z9 z: t* \* V" V
INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')
* n, L) O# i: f! T- ]; k
7 V1 H# X" n% ?8 C! K; W' E0 {用简单的英语粗略地翻译成两个查询:
4 ^) _2 M0 u4 U5 c# m7 l% @向“学生”表中添加一个名称为“ Robert”的新记录 ~7 m' Y! o3 z. M2 C
和# G1 R% A1 g/ R/ u! M2 q
删除学生表) G6 \) `- v+ z* x
第二个查询之后的所有内容都标记为注释: –‘, ‘Derper’)
) ]- t9 ~* n% p6 r. d将’在学生的名字是不是一个评论,它的关闭字符串分隔符。由于学生的名字是一个字符串,因此在语法上需要它来完成假设的查询。注入式攻击仅在其将有效查询SQL注入结果的SQL查询时起作用。 |
|
|
|
|
|