簡體   English   中英

在插入DB之前輸入PHP htmlentities(),而不是輸出

[英]PHP htmlentities() on input before DB insert, instead of on output

我想知道在執行以下程序時是否存在任何缺點或不良做法:

  1. $ user_input - > htmlentities($ user_input) - > mysql_escape($ user_input) - >將$ user_input插入DB
  2. 從DB中選擇$ user_input - > echo $ user_input

而不是做以下事情:

  1. $ user_input - > mysql_escape($ user_input) - >將$ user_input插入DB
  2. 從DB中選擇$ user_input - > echo htmlentities($ user_input)

當我們在很多地方顯示相同的$ user_input時,對輸入感覺更有效率,這樣做是否有任何缺點/不良做法/漏洞利用能力?

干杯!

對以下問題的回復很好:

@Matt:一般來說,為了保持可讀性和可維護性,請盡量將其存儲為盡可能接近原始未經過濾的內容。 這取決於兩件事:是否有其他人/程序會引用這些數據? 數據是否需要易於編輯?

@Sjoerd:如果你想將數據顯示為除HTML以外的其他內容,例如CSV下載,PDF等,則存在缺點。

這取決於兩件事:

  • 是否有其他人/計划會參考這些數據?
  • 數據是否需要易於編輯?

方法一的優點是,如果數據在一個地方使用 ,並且每次都會調用htmlentities() ,那么您將保存此步驟。

但是,如果HTML數據非常大,這只會帶來顯着的改進。 通常,為了保持可讀性和可維護性,請盡可能將其存儲為盡可能接近原始未經過濾的內容。

實際上,您可能會發現HTML無論如何都要存儲錯誤。 存儲像Markdown這樣的東西可能會更好,並且在查看時只需將其轉換為HTML。

我建議不要這樣做。 如果除了將其顯示為HTML(在控制台中顯示,發送文本電子郵件,寫入日志等)之外,您還需要其他任何數據,則必須將其轉換回來。

一個好的做法是僅在最后時刻應用此類轉換。 在插入數據庫之前使用mysql_escape,在顯示為HTML之前使用htmlentities(或htmlspecialchars)。 這樣你總能知道你的逃生功能應該在哪里。 如果他們不在那里,你很容易告訴你做錯了什么。 您還知道數據庫中的數據始終是干凈的,您無需記住是否對其進行了編碼,使用了什么以及如何將其重新編碼。

如果您想將數據顯示為HTML之外的其他內容,例如CSV下載,PDF等,則存在缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM