天道酬勤,学无止境

codeigniter active record, when to escape, if at all

I just recently started using active record (before I just wrote manual queries since I was so used to them).

I was looking at the code of ion_auth and I saw that in a few places the strings had been escaped even though active record was used,

i.e

 ->where($this->identity_column, $this->db->escape_str($identity))
 ->where($this->tables['groups'].'.name', $this->db->escape_str($group))

Thing is, I havent escaped anywhere where I have used active record since on the documentation it said active record escapes strings automatically.

My question, when using active record, are there some situations when you should escape strings?

评论

From the Codeigniter User Guide:

Beyond simplicity, a major benefit to using the Active Record features is that it allows you to create database independent applications, since the query syntax is generated by each database adapter. It also allows for safer queries, since the values are escaped automatically by the system.

The creator of ion_auth may have had a particular reason for escaping the string, but if you are using Active Record, Codeigniter escapes the queries automatically.

But there are queries that "look" like they might be Active Record, which need to be escaped. Here's a list of them, again from the Codeigniter User Guide.

Usually you can let codeigniter handle it. In some cases if you are building a more complex query using the active record (e.g : $this->db->where('(some sql where clause)') you can use the escape methods of the DB library.

No, it is not necessary to use escape. I have tried with different format of text mixing single quote and double quote also a whole bunch of html tags, all works perfectly fine.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Codeigniter - Active Record 是否容易受到 SQL 注入的攻击?(Are Codeigniter - Active Records Vulnerable to SQL Injections?)
    问题 只是在 Stack Overflow 上读到这个,因此让我想知道是否可以通过 CI 中的活动记录进行 SQL 注入。 在我的项目中的大多数地方,为了用户注册和用户配置文件更新,我已经完成了这样的 SQL 插入: 控制器 : $name = $this->input->post('name'); $last_name = $this->input->post('last_name'); $age = $this->input->post('dob'); $user_data = array( 'name' => $name, 'last_name' => $last_name, 'age' => $age ); $this->user_model->add_user_function($user_data); 模型: function add_user_function($data) { $this->db->insert('user_table',$data); return; } 就像上面 SO 链接中的示例一样,我的代码是否容易受到 SQL 注入的攻击? 如果可能会损害我的系统,您能否举一个特定的例子,如果它存在,我该如何预防。 回答1 CodeIgniter 已经为您的案例提供了 2 个安全功能。 用户输入的 XSS 过滤:输入类的方法有第二个布尔参数,它允许您通过
  • 在Codeigniter中转义SQL查询(Escaping SQL queries in Codeigniter)
    问题 我正在使用CodeIgniter将一些数据插入MySQL表中。 因为我正在使用INSERT IGNORE INTO并且不想编辑活动记录类来启用此功能,所以我正在手动生成SQL查询。 $this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type) VALUES ('" . $data['lat'] . "', '" . $data['lng'] . "', '" . $data['date'] . "', '" . $data['type'] . "')"); 问题: $data['type']中的字符串包含单引号时,查询失败。 如何使这些需要转义的字符自动转义,例如使用活动记录时? 回答1 另一种方法是使用查询绑定,该绑定会自动转义所有值: $sql = "INSERT IGNORE INTO my_table(lat, lng, date, type) VALUES (?,?,?,?);"; $this->db->query($sql, array($data['lat'], $data['lng'], $data['date'], $data['type'])); 回答2 使用$ this-> db-> escape(); 它将自动转义字符串 此函数确定数据类型,以便它只能转义字符串数据。
  • CodeIgniter-活动记录插入,如果新的或更新重复(CodeIgniter- active record insert if new or update on duplicate)
    问题 对于给定的键,是否可以在 CodeIgniter 中执行活动记录查询,该查询将更新现有记录(如果已经存在或插入如果不存在)? 我知道这可以通过首先查询找到现有记录来完成,但我正在寻找最有效的方法。 回答1 基本上你要找的可能是这个INSERT ... ON DUPLICATE KEY UPDATE - 前提是你使用 MySQL 并且你的 id 是表上的唯一键。 您必须手动构造查询并传递给$this->db->query()函数,而不是任何内置的活动记录,如 DB Driver 的辅助函数。 例子: $sql = 'INSERT INTO menu_sub (id, name, desc, misc) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE name=VALUES(name), desc=VALUES(desc), misc=VALUES(misc)'; $query = $this->db->query($sql, array( $id, $this->validation->name, $this->validation->desc, $this->validation->misc )); 回答2 如果您使用 Codeigniter 3.0 或更高版本,您可能需要考虑使用“$this->db->replace()”。
  • SQL查询转义+ Codeigniter(SQL query escaping + codeigniter)
    问题 我使用的是codeigniter,大多数时候都使用活动记录进行查询(这会自动使它们转义),但是由于变量的原因,该查询似乎不太适合它。 因此,我需要弄清楚如何手动转义查询。 Codeigniter文档建议以这种方式转义查询: $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")"; 我的原始查询 $sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'"; 我逃脱的查询 $sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")"; 但是我在正确使用语法上遇到了麻烦。 错误消息是: PHP错误消息:未定义的变量:user_language SQL错误:语法错误...在第1行的“ VALUES(NULL)”附近 回答1 $sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id); 如果您要选择$ id给出的用户语言,则应该采用这种方式。
  • SQL注入和Codeigniter(SQL Injection and Codeigniter)
    问题 有关Codeigniter及其输入处理功能的一些疑问。 有些人可能有点怪异,但仍然有疑问。 如果我在CodeIgniter中使用Active Record Class函数,是否可以防止我的输入被SQL注入? 我在某处读过它,但是我不明白该怎么做? 还是为什么? xssclean是否也以任何方式处理SQL注入? 回答1 我的输入是否被禁止进行SQL注入? 并非完全“自动”,但它确实提供了参数化查询。 还是不使用CodeIgniter,您应该尽可能使用参数化查询来查询字符串黑客。 $bof= "a'b"; $zot= 'a\b'; // Insecure! Don't do this! // $this->db->query("SELECT foo FROM bar WHERE bof='$bof' AND zot='$zot'"); // Secure but annoying to write // $this->db->query("SELECT foo FROM bar WHERE bof='".$this->db->escape($bof)."' AND zot='".$this->db->escape($zot)."'"); // This is what you want // $this->db->query('SELECT foo FROM bar WHERE
  • Using Codeigniter Escape function
    I have recently added a comments section to a blog. Codeigniter says to always escape data before putting it into the Db.(I do have xss clean on fulltime). Some people say all active record operations are escaped. Am I wasting my time using escape on the function below? Using the function below I escape the data, but it all comes out into the view escaped. How do you "un-escape" data so it will be readable without the ' '? I dont want to use a regex to delete every '' in case its used in a sentence I guess my real question is, are active records always escaped or not? ie: Author comes out
  • 在 codeigniter 中防止 SQL 注入(Prevent SQL injections in codeigniter)
    问题 在我的项目中,我使用 $this->input->(get|post) 将数据传递给模型。 在模型中,我总是使用活动记录。 这足以防止 sql 注入吗? 回答1 不,它不是。 编辑:是的...没有看到您对使用活动记录的评论。 您需要使用 PHP 或 CodeIgniter 的转义函数手动转义您的输入,或者您应该使用 CodeIgniter 的查询绑定,或者您可以使用 CodeIgniter 的 Active Record 类。 我更喜欢做查询绑定,因为它 a) 使我的查询看起来更好 b) 确保我的所有输入在 MySQL 中运行之前都被清理。 http://ellislab.com/codeigniter/user_guide/database/queries.html 这像这样工作: $qStr = "SELECT * FROM students WHERE id=?"; $q = $this->db->query($qStr, array($id); CodeIgniter 将识别您的变量是什么类型的数据,并相应地包装它。 也就是说,如果它是一个字符串,它会在 SQL 中的转义值周围放置'和' ,这是确保用户无法注入任何恶意内容所需要的。
  • Escaping SQL queries in Codeigniter
    I am inserting some data into a MySQL table using CodeIgniter. Because I am using INSERT IGNORE INTO and do not want to edit the active records class to enable this feature, I am generating the SQL query manually. $this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type) VALUES ('" . $data['lat'] . "', '" . $data['lng'] . "', '" . $data['date'] . "', '" . $data['type'] . "')"); Problem: The query failed when the string in $data['type'] contained a single quote. How can I make it such that these characters that need to be escaped gets escaped automatically, like when using Active
  • Inserting NOW() into Database with CodeIgniter's Active Record
    I want to insert current time in database using mySQL function NOW() in Codeigniter's active record. The following query won't work: $data = array( 'name' => $name , 'email' => $email, 'time' => NOW() ); $this->db->insert('mytable', $data); This is because CodeIgniter’s ActiveRecord class automatically escapes the input. The following works fine, by calling set() and passing peratmeter FALSE, so that it doesn't escape the NOW(). $data = array( 'name' => $name , 'email' => $email, ); $this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data); However, my question is that is
  • 已通过 SQL 注入攻击的登录代码示例,尽管 mysql_real_escape_string ...(Login code sample which has been hacked via SQL Injection, although mysql_real_escape_string…)
    问题 我使用 CodeIgniter,并且在黑客攻击方面遇到了麻烦。 是否可以对下面的登录代码进行 SQL 注入: function process_login() { $username = mysql_real_escape_string($this->input->post('username')); $password = mysql_real_escape_string(MD5($this->input->post('password'))); //Check user table $query = $this->db->getwhere('users', array('username'=>$username, 'password'=>$password)); if ($query->num_rows() > 0) { // success login data 我使用mysql_real_escape_string错误的,还是什么? 回答1 没有发布的内容可能不会受到 sql 注入的影响。 尽管 getwhere() 可能会执行 stripslashes(),但我不确定。 如果存在 SQL 注入,很可能它位于应用程序的另一部分。 攻击者可以利用该漏洞获取你极弱的md5()哈希值,破解后登录。 使用 sha2 系列的任何成员,sha-256 都是不错的选择。
  • 使用CodeIgniter的Active Record函数将一个子句添加到不带引号的MySQL语句中(Add a clause to a MySQL statement without quotes using CodeIgniter's Active Record functions)
    问题 我想使用codeigniter中的活动记录来更新一行,而我只想增加一个字段值(received_qty = Received_qty +1),我意识到我可以在通常的sql中做到这一点,但是我不能在codeigniter活动记录中做到这一点。 $update['received_qty'] = 'received_qty + 1'; $update['received_date'] = date("Y-m-d"); $this->db->where($where); $this->db->update('vrs_distribution', $update); 有人知道如何使用活动记录吗? 回答1 这将起作用。 $this->db->set('received_qty', 'received_qty + 1', FALSE); $this->db->set('received_date', date("Y-m-d")); $this->db->where($where); $this->db->update('vrs_distribution'); ActiveRecord会转义放入set(),where()和许多其他方法的所有内容。 where和set都可以采用$ escape的第三个可选参数,它是一个布尔值。 将其设置为FALSE,CodeIgniter不会转义任何内容
  • CodeIgniter Active Record 'like'忽略'where'(CodeIgniter Active Record 'like' ignoring 'where')
    问题 使用 like 进行非常简单的搜索,并可以选择省略选项,但是我发现 like 语句使查询忽略了 where 语句 $this->db->like('LOWER(location) OR LOWER(name)', strtolower($term)); $this->db->where('stage', 1); $this->db->order_by("name", "asc"); $query = $this->db->get($this->user_table); return $query->result(); 上面使用 $term = "dublin" 生成的示例; SELECT * FROM (`users`) WHERE `stage` = 1 AND LOWER(location) OR LOWER(name) LIKE '%dublin%' ORDER BY `name` asc" 它仍然返回 'stage' 不等于 1 的行。 有任何想法吗? 谢谢! 回答1 $term = strtolower($term); $this->db->where("(LOWER(location) LIKE '%{$term}%' OR LOWER(name) LIKE '%{$term}%')"); 回答2 $query = $this->db->query("SELECT
  • Codeigniter活动记录中的子查询(subquery in codeigniter active record)
    问题 SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace); 如何在CodeIgniter活动记录中编写以上选择语句? 回答1 ->where()支持将任何字符串传递给它,它将在查询中使用它。 您可以尝试使用以下方法: $this->db->select('*')->from('certs'); $this->db->where('`id` NOT IN (SELECT `id_cer` FROM `revokace`)', NULL, FALSE); where()中的,NULL,FALSE告诉CodeIgniter不要转义查询,这可能使查询混乱。 更新:您还可以检出我编写的子查询库。 $this->db->select('*')->from('certs'); $sub = $this->subquery->start_subquery('where_in'); $sub->select('id_cer')->from('revokace'); $this->subquery->end_subquery('id', FALSE); 回答2 不建议使用函数_compile_select()和_reset_select() 。 而是使用get_compiled_select() : #Create
  • SQL query escaping + codeigniter
    I'm using codeigniter and most of the time use active record for my queries (which automatically escapes them), but this query doesn't seem to fit neatly into it because of the variable. So I need to figure out how to escape the query manually. Codeigniter docs suggest escaping the queries this way: $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")"; My original query $sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'"; My escaped query $sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")"; But I'm
  • Does CodeIgniter automatically prevent SQL injection?(Does CodeIgniter automatically prevent SQL injection?)
    问题 我刚刚继承了一个项目,因为最后一位开发人员离开了。 该项目基于Code Igniter构建。 我以前从未与Code Igniter合作。 我快速浏览了一下代码,并在控制器中看到了数据库调用,如下所示: $dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'"); 或像这样的电话: $dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'"); 代码点火器会自动清理这些查询以防止SQL注入吗? 回答1 使用$this->db->query方法时,CodeIgniter会对您传递的变量进行ESCAPE处理。 但是仅当您将变量作为绑定传递时,这是一个示例: $dbResult = $this->db->query("SELECT * FROM users WHERE username = ?", array($this->input->post('username'))); 还要记住, $_POST不应比$this->input->post优先,因为它所做的是检查变量是否存在以防止错误。 回答2
  • Codeigniter this->db->query(Codeigniter this->db->query)
    问题 $this-db->query() 是否有 mysql 注入保护? 我想知道,因为我在实例中使用它并且没有做任何事情来防止 sql 注入。 回答1 使用 CodeIgniter 进行查询的 ActiveRecord 样式会转义参数,但不会转义 query()。 您可以通过以下方式使用活动记录: $someAge = 25; $this->db->select('names, age'); $query = $this->db->get_where('people', array('age' => '>' . $someAge)); 在此处阅读更多相关信息:https://www.codeigniter.com/userguide2/database/active_record.html 回答2 不,默认情况下 db->query() 不受 SQL 注入保护,您几乎没有选择。 使用查询绑定 $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick')); 对于更复杂的查询,您必须在继续时构建查询,请使用 compile_bind() 获取 SQL 块。 $sql = "SELECT *
  • 使用Codeigniter插入IGNORE(INSERT IGNORE using Codeigniter)
    问题 我正在尝试使用Codeigniter和Active Records在MySQL表中插入几行。 PHP代码 $data = array('......'); // some rows of data to insert $this->db->insert_batch('my_table', $data); 但是,这可能会导致将重复的行插入到表中。 为了处理重复数据的插入,如果行是重复的,我计划使用INSERT IGNORE命令不插入行。 问题:我在Active Record中找不到等效的INSERT IGNORE ,也不想编辑Active Record类。 还有其他选择吗? 以下内容看起来很有趣,但是如果执行以下操作,查询将不会运行两次? $insert_query = $this->db->insert_batch('my_table', $data); // QUERY RUNS ONCE $insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query); $this->db->query($insert_query); // QUERY RUNS A SECOND TIME 回答1 使用第二个想法的技术,您可以通过遍历数组并使用以下命令来生成查询: $this->db->query(
  • 如何将该SQL重写为CodeIgniter的活动记录?(How can I rewrite this SQL into CodeIgniter's Active Records?)
    问题 SELECT *, SUM(tbl.relevance) AS relevance FROM ( ( SELECT q_id, MATCH(a_content) AGAINST ('бутон') AS relevance FROM answers WHERE MATCH(a_content) AGAINST ('бутон') ) UNION ( SELECT q_id, (MATCH(q_content) AGAINST ('бутон')) * 1.5 AS relevance FROM questions WHERE MATCH(q_content) AGAINST ('бутон') ) ) AS tbl JOIN questions ON questions.q_id = tbl.q_id GROUP BY tbl.q_id ORDER BY relevance DESC 回答1 Codeigniter当前在其Active Records类中不支持子查询。 您只需要使用此: $this->db->query($your_query, FALSE); 请记住传递第二个参数,以使Codeigniter不会尝试转义您的查询。 回答2 好吧,确实在codeigniter中有一个简单的针对子查询的技巧。 您必须执行以下操作转到system / database / DB
  • Codeigniter Active Record - 计算找到的总行数(MySQL)(Codeigniter Active Record - Count Total Found Rows with Limit (MySQL))
    问题 我在应用了限制的 Codeigniter 模型中使用复杂的 SQL 查询。 如果未应用限制和偏移量,我想计算将找到的总行数。 我想将计数和结果数组一起返回给我的控制器 - 我该怎么做? 如果这是正确的解决方案,我将 SQL_CALC_FOUND_ROWS 放在哪里? 这是查询(最初不是我自己构建的): $this->db ->select('table1.* ,table2.* ,table3.* ,table4.* ,table5.* ,table6.* ,table7.* ,table8.* ,table9.* ,(SELECT GROUP_CONCAT(field1) FROM table10 WHERE table10.field3 = table9.field2) as categories ,(SELECT GROUP_CONCAT(field1) FROM table5 WHERE table5.field11 = table4.field12 AND table4.field21 = 0 AND table5.field1 != 0) as categories2 ,(SELECT AVG(table11.field4) FROM table11 WHERE table11.field6 = table9.field2) as rating ,(SELECT
  • 更新查询增量字段加上1个代码点火器(Update query increment field plus 1 codeigniter)
    问题 尝试在数据库的给定字段上增加1时遇到问题。 我尝试了有无活动记录。 我的函数如下所示(在我的模型中) function _set_reads($id){ $this->db->set('reads', 'reads+1', FALSE) $this->db->where('id', $id); $this->db->update('article'); } 和 function _set_reads($id){ $sql = 'update article set reads=reads+1 where id=?'; $this->db->query($sql, array($id)); } 在这两种情况下,我都会收到相同的错误,并且显示以下错误消息: Error Number: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'reads+1 WHERE `id` = '15'' at line 1 UPDATE `article` SET `reads` = reads+1 WHERE `id` = '15' 我正在使用最新版本的MAMP 回答1