Codeigniter 2.1 - 将HTML页面插入数据库

时间:2013-02-12 12:48:57

标签: php mysql codeigniter codeigniter-2

我正在尝试创建迷你CMS,用户可以在其中创建新页面,然后该页面成为菜单的一部分。将完整页面插入数据库是否很明智?还是有更好的方法吗?我在插入时遇到了标签的一些问题。 现在的代码:

将页面插入db:

public function strana_insert()
    {
        $this->admin_login_check();
        $clear = $this->str->clean_request();

        $char  = array('\n', '\n');
        $strana  = str_replace($char, '<br>', $clear['opis']);
        $kljucna_rec = str_replace( ' ', '_', mb_convert_case($clear['naziv'], MB_CASE_LOWER, "UTF-8") );
            $data = array(
            'naziv'           => $clear['naziv'],
            'strana'          => htmlspecialchars($strana, ENT_QUOTES , "UTF-8"),
            'kljucna_rec'     => $kljucna_rec,
            'datum_kreiranja' => date("Y-m-d H:i:s")
        );
        $this->str->save($data);
        $this->save_routes();
        redirect('admin');
    }

clean_request函数的代码:

public function clean_request()
    {
        foreach($_POST as $key=>$value) :
            $clean[$key]=mysql_real_escape_string(trim($value));
        endforeach;

        return $clean;
    }

当我插入带有标签的页面时,我得到以下结果:

<a href=\"http://www.example.com\" class=\"link_name\">www.example.com</a>

更新页面后,* \ * 之间的所有内容都将被删除。这是怎么回事?

4 个答案:

答案 0 :(得分:2)

这是因为逃生功能!! htmlspecialchar将您的代码更改为一个简单的字符串!!

如果你想保存为html,你应该保存代码而不必转义!

BTW,这不是一种创建静态页面的聪明方法,您可能希望创建一个布局并简单地让用户将内容放入其中;)

答案 1 :(得分:2)

您可以使用Codeigniter的活动类来插入或使用以下方法。

在将HTML数据插入数据库之前执行以下操作:

$html_for_db = addslashes($html_content); 

并将$html_for_db插入数据库。

在显示此内容时,

echo stripcslashes($data_from_db);

stripcslashes() - 使用addcslashes引用的取消引用字符串

更多信息:http://php.net/manual/en/function.addslashes.php

答案 2 :(得分:1)

如果你想在你的数据库中存储html,我建议使用htmlpurifier来清理你的html代码,并删除不需要的html标签。

http://htmlpurifier.org/

还有一个助手可以让CodeIgniter中的htmlpurifier非常简单:https://github.com/refringe/codeigniter-htmlpurifier

使用htmlpurifier清理输入字符串后,应使用Codeigniters Active Record类来插入数据(http://ellislab.com/codeigniter/user-guide/database/active_record.html)。这样框架就可以进行转义。

答案 3 :(得分:0)

您必须在此处防止两种类型的攻击:SQL注入和跨侧脚本。您考虑了两者并使用htmlspecialchars()对XSS和mysql_real_escape_string()对SQL注入。

但是你以错误的顺序使用它们。首先必须使用htmlspecialchars,因为这是你想要存储/输出的东西。要将其保存到数据库中,您必须将其包装到其mysql_real_escape_string-ized演示文稿中,然后再将其存储或使用参数绑定。