|
我正在构建Codeigniter应用程序,并且正在尽最大努力防止SQL注入。我正在使用Active Record方法构造所有查询。我知道Active
- n2 n6 }7 p9 a: w! qRecord会自动清除输入内容,但是我想知道到底是什么程度?它只是转义所有引号,还是做更多呢?如何防止混淆的SQL注入或其他更高级的注入?: i$ i$ ~( `7 {
基本上,我正在寻找有关CI如何清理数据的深入说明。有人知道吗
2 E) z8 ?5 Z: _* M% S i. ~9 f5 r
6 {, _: | y9 h) D9 b0 v# \* h解决方案:5 a8 [; C( E# D8 @+ G! X
0 T, o& T. k9 l! E
" C5 t ?# V) U; A
$ O/ v# Q4 N8 R* h 完全像这样(对于MySQL驱动程序):+ ]; d2 ^2 v! f9 R
尝试mysql_real_escape_string()(99%的情况会是这种情况)' a, y5 R8 b6 e$ D% R! A
跌回 mysql_escape_string(); b6 k6 ~. M0 w; `# _+ h. \
跌回 addslashes()
s! S; e0 ^" w5 g3 ^通过以下方式手动逃脱%并_处于LIKE有条件的状态str_replace()* k4 L i2 e* t: X
1 P; A0 ]% R4 }0 ~( Y+ r, v
https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294
3 N% w# O; D2 _# p- @% t# Y/**) ~8 ~+ g% s5 F9 G; i; f$ j, T
* Escape String& a/ t6 X: R8 X+ t: d6 D! u' r& m" X
*% Q5 ^/ r( [0 M! ^
* @access public
4 }0 L5 C/ U) M) P6 R: h7 }* @param string8 V+ x4 k# Y) M4 Q, P
* @param bool whether or not the string will be used in a LIKE condition% I! Q1 g$ f+ r ~" Q6 ?
* @return string0 U0 F$ X5 Z, V/ Q& Y# v
*/7 ~/ s; Z5 L8 H( v3 c
function escape_str($str, $like = FALSE)
) L( j2 g4 s$ T& j/ [1 ^* q{
9 s( h5 Q3 _$ i1 J if (is_array($str))
+ ~: W3 v) ~- F: O: x* v$ B& i {
6 O# X( V, X( ]) [ foreach ($str as $key => $val)
6 G) v7 d) g/ q5 V8 @$ {$ X {# Q M2 s% i6 l7 U* J5 A
$str[$key] = $this->escape_str($val, $like);
* G5 \ q* B: H* s2 h }! W$ a: E2 r5 C& H/ Y% q" g5 C7 I& t
return $str;" n/ ]. |0 L& `2 t2 K
}9 s2 a* c& @) w9 F3 {! |
if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))3 r& _2 H. a$ z* V
{
" X8 q4 F6 Q, O3 r: p7 b' p( h $str = mysql_real_escape_string($str, $this->conn_id);" b4 p/ v" b& {; Z1 b; |& d6 e
}8 x4 N- h/ c! Z
elseif (function_exists('mysql_escape_string'))
8 d1 h* E6 r _$ V {" x/ o- p% x( i. k
$str = mysql_escape_string($str);9 ~2 G. c) z* v7 F
}
, i6 o. T: E! _% }# ~, @ else
2 j) ?5 H3 O) T {
5 d$ h) U: _+ w+ @2 f1 B0 A) |# t $str = addslashes($str);1 ]1 T9 G' Z4 c0 W
}8 ~7 b4 U. k, a# t
// escape LIKE condition wildcards
9 V' \2 A5 W6 f if ($like === TRUE)
/ r5 v& \9 c/ p4 u- W4 n {
/ X( Z* R O1 E' P1 z$ Y7 i $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);+ g; o0 Z, _* ?2 k5 V2 Y K
}
% y0 X. p8 Z7 p7 i9 N return $str;
+ H- h' l* [0 A$ Q& `# p* A}( D. G& _* P2 h# A1 |
注意,这只是转义字符,因此MySQL查询不会中断或发生意外情况,并且仅在数据库查询的上下文中使用,以确保基于传递给它的内容正确的语法。) U' G8 l1 n$ A: C; A: X
没有任何魔术可以确保所有数据在 任何/ N$ G7 r0 p, z* l7 ~
上下文(例如HTML,CSV或XML输出)中的安全,并且以防万一您正在考虑它:xss_clean()不是一种千篇一律的解决方案,也不是100%防弹的,有时实际上是非常不合适的。Active
2 l# g2 _! w* F$ ?/ V8 vRecord类会自动进行查询转义,但是对于其他所有情况,您应该使用给定上下文的正确方式手动转义/清理数据,并使用 输出 而不是 输入 。 |
|