2012-09-30 26 views
1

嗨,那裏我只是測試自己開發的應用程序,並且遇到問題。我輸入了如何防止以zend格式顯示腳本標籤

<script>window.location = "http://www.google.com";</script> 

in Zend_Form_Element_Text元素。我按提交併保存值。在保存值之後,我將用戶重定向到列表,當它重定向到列表時,腳本標籤將執行,並且它將轉到google.com

我的表單元素看起來像

$first_name = new Zend_Form_Element_Text('first_name'); 
$first_name->setRequired(true) 
      ->addFilter('StringTrim') 
      ->addValidator('StringLength', false, array(2, $metaData['first_name']['LENGTH'])) 
      ->setDecorators(array('ViewHelper', 'errors')); 

我想知道我怎麼能防止用戶輸入這些類型的值?有沒有內置驗證或其他方式?

+0

你可能有逃跑之前'echo'-ING在其顯示值視圖的值,例如:'$這個 - >逃生($這 - >如first_name)'。 – vstm

+0

@vstm我不會阻止這個值被輸入數據庫?有沒有驗證它? –

+0

轉義防止它被髮送到客戶端。您可以將'HtmlEntities'過濾器添加到您的表單元素中,這應該在將值寫入數據庫之前「轉義」該值。 – vstm

回答

1

測試你的應用程序做得很好,許多人不打擾。不要擔心將該字符串存儲在數據庫中,它不會造成任何傷害,並且更改它可能會給其他有效的條目帶來問題。作爲vstm says,請在使用它時將其轉義。

但是,由於您具體談論的是「名字」字段,因此可能會進行一些更多驗證,例如拒絕其中包含/的任何名稱。我不知道有任何語言作爲名稱的一部分。如果有的話,我很想知道它是如何發音的。你也可以添加. = \和其他一些名單,但不要太過分。

您應仔細考慮表單中的每個字段,以確定您將合理期望接收哪些輸入並相應地驗證輸入。任何未通過驗證的內容都會被拒絕。類似於'<script>window.location = "http://www.google.com";</script>'這樣的字符串絕對不能通過對期望某個人姓名的字段的驗證。

就個人而言,我從不過濾輸入。它要麼通過驗證,要麼被接受,要麼不被拒絕。我無法通過過濾輸入錯誤的輸入,因此它被拒絕,並且要求用戶重新輸入數據。例如,在使用上

一個 StripTags過濾
<script>window.location = "http://www.google.com";</script> 

你會留下

了window.location = 「http://www.google.com」;

這仍然不是一個有效的名稱,應該被拒絕。

您的驗證將永遠不會工作100%的時間,這就是爲什麼你應該總是轉義從用戶輸入接收到的值,然後將它們回顯給瀏覽器。

Zend Framework有一個validators的筏,您可以使用它,不要忘記PHP已經爲您提供的validators and filters。正確使用它們,您將大大降低惡意輸入對應用程序或更重要的是用戶造成傷害的風險。

您可以使用那些驗證器和過濾器,但PHP和Zend Framework都不知道您期望的數據類型,所以閱讀文檔並確切瞭解它們如何工作以及如何使用他們以及何時使用它們。

The Web Application Security Project有一個很好的資源,每個web開發者都應該被迫閱讀死亡之痛。

tl; dr
驗證輸入和轉義輸出。

1

您可以使用過濾器來限制來自用戶的輸入。 Read about the filters

Zend框架中有一個名爲Zend_Filter_StripTags的過濾器,它可以讓您選擇去除全部或選定的標籤。這是網站本身的一個例子。

$filter = new Zend_Filter_StripTags();  
print $filter->filter('<B>My content</B>'); 

作爲結果,您將得到剝離內容 '我的內容'。

在你的情況下

$first_name->setRequired(true) 
      ->addFilter('StringTrim') 
      ->addFilter('StripTags') //Here a add a filter to strip tags 
      ->addValidator('StringLength', false, array(2, $metaData['first_name']['LENGTH'])) 
      ->setDecorators(array('ViewHelper', 'errors'));