回答

收藏

SQL注入保护

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

我想我会从您认为可以基本上消除SQL注入可能性的选项中获得您的意见(我认为)。! M4 a/ U3 H4 \+ j- H: Q9 v6 z
当前,我有我的管理员帐户,该帐户显然可以为我提供数据库的完整命令(更改,删除等)。我将拥有一个PHP使用的帐户,该帐户只能访问SELECT,UPDATE,DELETE,INSERT。如何为每个操作设置一个用户,然后仅在mysql_query语句中引用连接ID呢-4 k' X) F& N- c
现在很明显,这将给服务器带来更多压力,本质上每页必须建立4个连接,但是如果安全性是重要的是,在我看来,通过将命令限制为要在这种情况下执行的EXACT函数,这将是一个有效的选择。关于此选项的可行性有何想法???
. q: u, F" ?0 }更新:正如我之前没有提到的那样,这不是防止SQL注入,mysql_real_escape_string(),准备好的语句等的唯一障碍。但是我只是想也许所有这些都失败了,不是吗?至少限制了他们可能造成的损害?(例如,在注册表上,他们将无法选择哈希或删除条目)。3 W' d. q. H. ?0 n% X* v
               
1 }0 I3 k( j+ G2 l$ W' }解决方案:; `4 a- K5 |% K3 d6 ?! }
               
+ c  y, Y$ F( P' d, c
4 q: v. q3 _, {$ n+ l$ A5 s& _! c! t* c+ H7 k1 M7 b
                这 不是1 P8 V" X& R  h* w4 l( r
SQL注入的全部内容。每当您使用未在SQL查询中清除的参数时,都会使数据库保持开放状态以进行SQL注入,这不一定具有破坏数据的目的。也可能是窃取数据或获得未经授权的访问。- |5 ^2 p9 U+ `. o7 H4 m: q
考虑一个非常受限制的帐户,它所能做的就是SELECT。您编写用于身份验证的查询:5 h* l* r$ t( U# m8 R: D
$sql = "SELECT COUNT(*) AS count
! f( P( ?1 y6 }5 G+ V; Z8 X5 R          FROM users 2 |  ?# |& y9 f5 C: ?
         WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";5 f; c/ @, k2 ^
// check if returns a count of 1, if yes, log in* t  k3 x& Y5 y1 m
使用普通输入,您希望查询看起来像:
1 d6 h# O5 x$ M. _  G( K% xSELECT COUNT(*) AS count5 m' U( Y' B* `
  FROM users
6 y5 U  {; i9 l3 j' w WHERE user_id = 'username' AND pass='********': l7 [9 q5 ~& b
如果用户名和密码均匹配,则应返回1作为计数。现在,攻击者尝试以管理员身份登录。由于您尚未清除输入内容,因此它们的发送方式$_POST['user']为:admin';. D% S7 n6 B2 i" `
--。整个查询变为:* l1 F* f) c2 c) j
SELECT COUNT(*) AS count
7 c5 g0 M$ o  r$ Z2 C5 t8 T3 C  FROM users 6 `' g5 w3 C9 e' E7 A9 B5 S
WHERE user_id = 'admin'; -- AND pass='********'
5 u/ a- a$ k6 y/ W; k3 s: \5 [之后的所有内容--均为注释,因此它将忽略其他条件并返回1。到了这里,您刚刚授予了恶意用户admin访问权限。这就是一些实际的攻击方式。您从低特权帐户开始,并通过安全漏洞尝试获取更多特权。
9 `, h7 a5 o* _
: l- F5 T5 k4 U, N1 I6 B长话短说,具有限制特权,应用范围的帐户(例如:没有DROP,ALTER等)是很好的。永远不要给任何人或任何应用程序超出他们所需的特权。但是要防止SQL注入,请使用准备好的语句。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则