2010-03-01 116 views
1

我試圖防止xss注入。 所以之前我提交表單,一個JavaScript函數被調用JavaScript字符串替換等效於PHP?

function validatefield(id) { 
    var description = document.getElementById(id).value; 
    description = description.replace(/[\"\'][\s]*javascript:(.*)[\"\']/gi, ""); 
    description = description.replace(/script(.*)/gi, "");  
    description = description.replace(/eval\((.*)\)/gi, ""); 
    document.getElementById(id).value=description; 
} 

我wonderng如果有一種方式插入的MySQL之前,做在PHP中一樣嗎?如果他們繞過了validatefield函數。

謝謝

+1

將此javascript代碼移植到php並不是防止XSS的好策略。有些方法可以將JavaScript注入到您的邏輯沒有涉及的HTML中,例如。 'onclick'屬性。正確的(而且更簡單!)的方式是在輸出任何html上下文之前將用戶提交的數據包裝在'htmlspecialchars()'中。 – Asaph 2010-03-01 04:20:46

+0

但是如果你想允許一些HTML,htmlspecialchars是不夠的。 – 2010-03-01 04:23:03

+0

@Matthew Flaschen:當然是對的。雖然我沒有得到印象,但海報通過他的表格專門收集了HTML。它沒有提到問題的任何地方。在收集HTML數據的情況下,我會採取白名單方式,並去除所有未經批准的標籤和屬性。 – Asaph 2010-03-01 04:26:05

回答

4

您正在尋找preg_replace

$description = preg_replace('regex pattern', 'regex replacement', $description); 
+0

正則表達式不適合(非常規)html語法。你還必須運行它,直到它沒有找到任何更多的匹配來替換,以照顧像<<劇本一樣的守舊... – jasonbar 2010-03-01 04:38:10

+0

我試圖只複製和粘貼js版本,但它似乎並不工作 $ text = preg_replace('/ [\'\'] [\ s] * javascript:(。*)[\'\']/gi','',$ text); $ text = preg_replace('/ script(。*)/ gi','',$ text); $ text = preg_replace('/ eval \((。*)\)/ gi','',$ text); – hao 2010-03-01 04:38:49

+1

正則表達方言是不同的。該函數只接受Perl Compatible Regular Expressions。這裏是一個備忘單: http://www.phpguru.org/downloads/PCRE%20Cheat%20Sheet/PHP%20PCRE%20Cheat%20Sheet.pdf 您將需要重寫正則表達式,以便他們能夠在PHP。 – 2010-03-01 04:47:56

3

一般來說,你可以使用preg_replace在PHP正則表達式替換。但是你的設計有幾個問題

  1. 你甚至不應該在客戶端上這樣做。它會在不提供安全性的情況下放慢速度。
  2. 您正在刪除非常安全的事物(例如「我寫了一個腳本來做這種事情」),同時忽略了許多實際的危險,如onclick屬性(另請參閱XSS Cheat Sheet)。

一般來說,如果你想允許某種形式的HTML,白名單是一種更好的方法。 HTML Purifier是一個在PHP中實現這個功能的流行工具。

+0

對於html純化器和白名單的+1。噓!用於定期表達和html。 – jasonbar 2010-03-01 04:38:38