2009-11-16 12 views
10

CKEditor içinde, editör tarafından kendisine dokunulmayacak bir kod bloğu oluşturmak ve kullanıcı tarafından açıkça değiştirilene kadar amaçlanan durumda tutulacak mıdır? Aşağıdaki javascript değişkenlerini (komut dosyası etiketlerine bağlı) ve bir flash filmi girmeyi denedim, ancak CKEditor yapıştırılmış kodum/işaretlememi yeniden yazmayı ve kodumu kırmayı sürdürüyor.CKEditor'da SCRIPT etiketlerini (ve daha fazlasını) koruma

aşağıdaki kurulum ile çalışıyorum:

<script type="text/javascript"> 
    var editor = CKEDITOR.replace("content", { 
    height : "500px", 
    width : "680px", 
    resize_maxWidth : "680px", 
    resize_minWidth : "680px", 
    toolbar : 
    [ 
     ['Source','-','Save','Preview'], 
     ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'], 
     ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'], 
     ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'], 
     ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'], 
     ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], 
     ['Link','Unlink','Anchor'], 
     ['Image','Table','HorizontalRule','SpecialChar'] 
    ] 
    }); 
    CKFinder.SetupCKEditor(editor, "<?php print url::base(); ?>assets/ckfinder"); 
</script> 

Ben en ideal çözüm sınırlı exclusives çok daha fazla olanak class="preserve" içeren herhangi etiketinin içeriğini korumak olacağını varsayalım.

Güncelleme: Ben bu soruna çözüm düşünüyorum CKEDITOR.config.protectedSource() içindedir, ama benim normal ifade deneyimi bu sorunu ele almak çok çocuk olduğunu gösteriyor. 'Korunan' sınıfı içeren tüm etiketlerin CKEditor tarafından dokunduğundan muaf tutulmasını nasıl sağlarım?

+1

Ne yaptığınızdan emin değilsiniz ... ancak bu düzenleyici komut dosyalarını kabul ederse ve çıktıları sayfaya geri gönderirse sitenizi tamamen XSS (Cross Site Scripting) saldırılarına maruz bırakıyorsunuz. – scunliffe

+0

scunliffe, Tam olarak ne olduğu. Ancak bu, sitenin yönetim kısmı içinde yer almaktadır. Kullanıcılar bu sayfaya erişmiyor. Güvenlik sorunu için endişelenmiyorum. Sadece bir yöneticinin erişimi olacaktır. – Sampson

cevap

5

sorun değil: Eğer CKEditor atmak istemiyorum etiketleri işaretlemek için class="preserve" kullanmak istediğimiz için editör başlatırken, daha sonra aşağıdaki JavaScript satırları ekleyin CKEditor ile. Bunun yerine, konu Siteyi çalıştıran MVC-Engine ile oldu. Kohana, varsayılan olarak etkinleştirilen yapılandırmasında global_xss_filtering'a sahiptir. Bu, sitenizdeki komut dosyası saldırılarını önlemek için komut dosyası etiketlerinin gönderilmesini engeller. Bu değeri false olarak değiştirmek, formlarda <script> etiketlerinin gönderilmesine izin verecek, ancak aynı zamanda siteyi çok ciddi olabilecek olası güvenlik sorunlarına da açacaktır. global_xss_filtering'u devre dışı bırakmamanız önerilir. CKEditor klasöründe

/* /(system|application)/config/config.php - line 66 */ 
/** 
* Enable or disable global XSS filtering of GET, POST, and SERVER data. This 
* option also accepts a string to specify a specific XSS filtering tool. 
*/ 
$config['global_xss_filtering'] = FALSE; 
+2

tch ... neden 'kohana' etiketi eklemediniz? Sonuçta bir kohana kullanıcısıyım, bu yüzden kohana meselesi olduğunu bilsem yardım edebilmeliydim. iyi, benim için çok kötü lütuf elde edemedim: P .. en azından yeni bir şey öğrendim yine de – Lukman

+0

Üzgünüm, Lukman :) Eminim * bir CKEditor meselesi olmalı. '$ _POST [' elementi ']' yerine '$ this-> input-> post ("element") yerine yanıltmaya karar verene kadar, sorunumun başka bir yerde olduğunu anladım. Hemen hemen düşündüm XSS ve config ile dosdoğru gitti :) – Sampson

10

Öneri 1: Yöneticinin komut dosyalarını/HTML kodunu girmesi için ayrı düz metinler oluşturun.

Öneri 2: yöneticileri komut/HTML kodu koymak ve sunucu tarafı <script></script> ve HTML koduna çevirmek için kullanabileceğiniz [script][/script] veya [html][/html] gibi bir BBCode'u tanıtın. Kaydedilmiş bir içeriği CKEditor'a gösterdiğinizden emin olun, sunucu tarafınızın bunları ilk önce bbcode'a çevirmesini sağlayın (veya CKEditor bunları çıkartacaktır). Ya da daha az zor olan yol, gönderilen içeriği veritabanına girildiği gibi saklamak ve sadece sayfayı görüntülerken çeviriyi yapmaktır.

Öneri 3:

// protect <anytag class="preserve"></anytag> 
CKEDITOR.config.protectedSource.push(/<([\S]+)[^>]*class="preserve"[^>]*>.*<\/\1>/g); 
// protect <anytag class="preserve" />< 
CKEDITOR.config.protectedSource.push(/<[^>]+class="preserve"[^>\/]*\/>/g); 
+0

Komut dosyaları, zaman zaman flash öğelerini kullanır, böylece flash öğelerini kullanarak editöre gönderilir.Her ikisi de CKEditor tarafından yeniden yazılıyor. Kod veritabanında saklanacak, ancak CKEditor kullanılarak yönetici sayfamdan yazılıyor. Ben çözümün CKEDITOR.config.protectedSource() ile olduğunu düşünüyorum ama regex deneyimim biraz kuru. – Sampson

+0

CKEDITOR.config.protectedSource() 'regexes ile düzenlenmiştir :) – Lukman

+0

Teşekkür ederim, Lukman. Bu akşam eve geldiğimde bunlara bir girdap vereceğim. – Sampson

8

Bir config.js dosya var. Aç ve kodu yapıştırın: Bu kaynağı modunda <script>...</script> etiketleri sağlayacak

CKEDITOR.editorConfig = function(config) { 
    config.allowedContent = { 
     script: true, 
     $1: { 
      // This will set the default set of elements 
      elements: CKEDITOR.dtd, 
      attributes: true, 
      styles: true, 
      classes: true 
     } 
    }; 
}; 

.

+0

Bu sorunu çözdüğünüz için teşekkür ederim. – Dave

İlgili konular