2013-02-12 61 views
3

我試圖創建迷你CMS,用戶可以在其中創建新頁面,然後該頁面成爲菜單的一部分。將完整頁面插入數據庫是否明智或者有更好的方法可以這樣做?當我插入時,我也遇到了一些問題標籤。 代碼現在:Codeigniter 2.1 - 將HTML頁面插入數據庫

對於插入頁面到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> 

更新後pa ge * \ *之間的所有內容都將被刪除。這裏發生了什麼?

+0

什麼是你的db字段? varchar或文本? – 2013-02-12 12:51:30

+0

字段是longtext。 – Sasha 2013-02-12 12:52:04

+0

不要使用mysql_real_escape_string,使用帶有綁定(或Active Record)的框架的DB類。反斜槓可以是服務器上的magic_quotes設置;把它們關掉 – 2013-02-12 12:53:25

回答

2

你可以用笨的活動類插入此或使用以下方法。

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

+0

爲什麼!爲什麼使用addslashes?如果你想逃避一個字符串,這是錯誤的,特別是因爲框架提供了更好的方式來做到這一點。如果你想逃避HTML,addslashes沒有意義 – 2013-02-12 13:18:24

+0

@DamienPirsy,感謝您的寶貴信息讓我搜索和編輯我的答案。 – 2013-02-12 13:20:02

2

這是因爲逃生功能! htmlspecialchar更改您的代碼只是一個簡單的字符串!

如果你想保存爲html,你應該保存代碼而不會逃脫!

順便說一句,這不是創建一個靜態頁面的聰明的方式,您可能要創建一個佈局,只是讓用戶將內容放在它;)

+0

這是我這樣做的方式。該頁面的佈局已經設置好了,但是需要進行一些調整(在這裏和那裏上課,粗體文本等)。 – Sasha 2013-02-12 12:57:39

+0

btw,codeigniter自動跳過你的代碼以獲得更安全的查詢;資源:http://ellislab.com/codeigniter/user-guide/database/active_record.html – 2013-02-12 12:59:35

+0

簡單地說,不要逃避內容。 – 2013-02-12 13:01:16

0

你必須防止兩種攻擊這裏:SQL注入和交叉腳本。您考慮了這兩個問題,並針對XSS使用了htmlspecialchars(),並且針對SQL注入使用了mysql_real_escape_string()

但是你用它們的順序是錯誤的。你首先必須使用htmlspecialchars,因爲這是你想要存儲/輸出的東西。爲了將其保存到數據庫中,您必須在存儲它或使用參數綁定之前將其包裝到它的mysql_real_escape_string-ized演示文稿中。

1

如果你想在你的數據庫中存儲html,我建議使用htmlpurifier來清理你的html代碼,並且去掉不需要的html標籤。

http://htmlpurifier.org/

還有一個幫手,這使得使用htmlpurifier內笨非常簡單:https://github.com/refringe/codeigniter-htmlpurifier

後清洗並用htmlpurifier你應該使用Codeigniters活動記錄類中插入數據的輸入字符串(http://ellislab.com/codeigniter/user-guide/database/active_record.html) 。這樣框架就可以逃脫。

相關問題