回答

收藏

Codeigniter如何清除输入?

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

我正在构建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类会自动进行查询转义,但是对于其他所有情况,您应该使用给定上下文的正确方式手动转义/清理数据,并使用 输出 而不是 输入
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则