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 を DB に保存する場合は、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 インジェクションとクロスサイド スクリプティングという 2 種類の攻撃を防ぐ必要があります。htmlspecialchars()XSS とmysql_real_escape_string()SQL インジェクションの両方を考慮して使用しました。

しかし、それらを間違った順序で使用しました。最初に htmlspecialchars を使用する必要があります。これは、保存/出力したいものだからです。データベースに保存するには、保存する前に mysql_real_escape_string 化されたプレゼンテーションにラップするか、代わりにパラメーター バインディングを使用する必要があります。

于 2013-02-12T13:18:08.850 に答える