簡體   English   中英

PHP / MySQL-使用PDO的顯示名稱/用戶名/密碼的安全字符

[英]PHP / MySQL - Safe characters for display names / usernames / passwords, with PDO

有點PHP / MySQL的新手在這里...

我一直在構建一個基於PHP的站點,該站點使用MySQL數據庫存儲用戶信息,例如用戶的顯示名稱,用戶名和密碼。

我一直在學習轉義,准備好的語句等,以及如何防止SQL注入,例如“ bobby'); drop table users--”。

我正在使用PDO准備好的語句從表單獲取用戶輸入,以便將其注冊到DB中。 但是,我需要知道幾件事:

  1. 由於我使用准備好的語句來顯示名稱,用戶名,密碼等,所以可以允許使用@,#,$甚至“單”或“雙引號”之類的特殊字符嗎? 空格,國際字符,帶有重音符號的字符或諸如♥這樣的字符呢? 當我問是否可以“允許”使用這些字符時,我想知道是否會由於允許在用戶名中使用引號或括號,或者將諸如html標記的粗體或斜體之類的內容引起其他安全風險?

  2. 如果可以允許使用大多數特殊字符,但不允許使用某些特殊字符:是否有我絕對需要將其設置為非法的任何特定“危險”字符(在MySQL范圍內)? (我覺得引號可能適合這個議程,但是我對此表示不一。)

  3. 如果我允許字符超出典型的“字母數字和下划線”范圍,那么以后(在MySQL,SQL或PHP中)允許奇怪的字符有什么陷阱嗎? 顯示人們的用戶名時,我是否需要以某種方式使html標簽顯示為字符串,而不是實際標簽? 還是每當我要查詢用戶名時都需要轉義引號? 還是這無關緊要,因為我將在PDO中使用准備好的語句?

  4. 像utf8或utf16這樣的字符集是否可以放入任何地方,以便我可以接受范圍最廣的顯示名稱和用戶名,同時仍確保可以在我的網站上顯示這些字母?

  5. 我知道有些西里爾字母看起來與英文字母相同。 我曾經直接從MS Word復制這些文件,並在我的用戶名中使用它們。 我意識到,只要將英語“ a”換成西里爾字母“ a”,就可以將它們用於感知他人。 如果某人不熟悉替代代碼,則其中很難找到帶有♥的用戶名。 這應該引起關注嗎? 你對此的看法如何?

預先感謝任何可以給我一些啟示的人。

SQL Injection Cheat Sheet包含幾個MySQL查詢示例,您可以在開發過程中對其進行測試。

這是學習有關“可接受”什么的一些問題的寶貴資源,並且您必須考慮“一條數據”的整個生命周期。

通常,一條數據可能以HTML形式開始,然后被發布到您的PHP腳本中(因此,如果用戶希望他們可以直接發布數據而無需該形式)。 然后,您的php腳本(希望如此) 清理數據,然后將其存儲

在數據庫中時,您可能正在執行備份操作,將其保存到SQLDump或其他某種維護方式。

然后顯然可以在某些時候讀取數據,如果這是一種降價語言,它可能會被編譯 ,最終將數據發送到某人的瀏覽器,然后將其注入html顯示

如您所見,在數據的整個生命周期中,有很多地方可能出錯。 如果您沒有考慮所有這些問題,則可能會看到一些常見的錯誤,例如每次存儲/加載數據時反斜杠都會堆積起來。.sql錯誤,容易受到攻擊等。

您要支持哪種數據? 隨你(由你決定。 只要確保正確處理即可。

首先讓我說我真的很喜歡你的風格。 似乎大多數人沒有花時間去思考這些事情,而只是將查詢打成一片而根本沒有進行數據清理。 因此,祝賀您勤奮。 :)

就是說,使用PDO,您不必擔心報價會打亂您的查詢。 特別是如果您使用bindParam綁定變量,則可以進行嚴格的參數控制。 這樣,您可以強制轉換變量的類型和長度。 同樣,特殊字符不會打亂您的查詢,因為PDO也會轉義它們。 因此,無需擔心。

至於使HTML顯示為文本而不是實際HTML,一個非常有用的函數是htmlspecialchars() ,它將html代碼轉換為字符代碼。 此函數也可以與可選的ENT_QUOTES標志一起使用,該標志將"轉換為" 。htmlspecialchars()也可以選擇將輸出設置為您選擇的編碼。

暫無
暫無

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

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