4

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

将页面插入数据库:

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

4 回答 4

3

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

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

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

于 2013-02-12T12:56:04.267 回答
3

您可以使用 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

于 2013-02-12T13:12:41.650 回答
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)。这样框架将进行转义。

于 2013-02-12T13:48:50.877 回答
0

您必须在这里防止两种类型的攻击:SQL 注入和跨端脚本。您考虑了两者,并htmlspecialchars()针对 XSS 和mysql_real_escape_string()SQL 注入使用了它们。

但是您以错误的顺序使用它们。您首先必须使用 htmlspecialchars,因为这是您想要存储/输出的内容。要将其保存到数据库中,您必须在存储之前将其包装到其 mysql_real_escape_string-ized 表示中,或者使用参数绑定。

于 2013-02-12T13:18:08.850 回答