php pdo字符,关于php:真正的转义字符串和PDO
本問題已經(jīng)有最佳答案,請猛點這里訪問。
我在從MySQL庫遷移后使用PDO。我用什么來代替舊的real_escape_string功能?
我需要轉(zhuǎn)義單引號,這樣它們就會進(jìn)入我的數(shù)據(jù)庫,我認(rèn)為可能有更好的方法來處理這一點,而不添加(斜線)到我的所有字符串。有人能告訴我應(yīng)該用什么嗎?
對參與方來說有點晚了,但是如果Prepare()方法不是選項(例如,當(dāng)您構(gòu)建自己的模型時),則可以使用pdo::quote()。
你應(yīng)該使用PDO Prepare
從鏈接:
Calling PDO::prepare() and PDOStatement::execute() for statements that will be issued multiple times with different parameter values optimizes the performance of your application by allowing the driver to negotiate client and/or server side caching of the query plan and meta information, and helps to prevent SQL injection attacks by eliminating the need to manually quote the parameters.
謝謝。我以前讀過,但后來聽說PDO準(zhǔn)備不會阻止SQL注入。我不知道該相信什么了。你確定準(zhǔn)備會阻止注射攻擊嗎?
PDO防止SQL注入。(它沒有幫助防止XSS Vuerabilities,但mysql也沒有真正的逃逸)
是的,這就是為什么我想要另一個選擇。我已經(jīng)在一些地方讀到了這篇文章,并記得我曾經(jīng)思考過有多少網(wǎng)站現(xiàn)在會受到攻擊。我很想自己對此有一個明確的答案。
約翰:是的,如果你使用正確,比爾在這篇文章中有一個很好的解釋——>stackoverflow.com/questions/1314521/…
@不,我同意XSS,但我仍然擔(dān)心準(zhǔn)備而不是保護(hù)。你確定嗎?如果它真的可以防止注入攻擊,那么我就用它。
@子母彈-我有疑問,并沒有深入研究,但我認(rèn)為問別人不會有什么傷害。我可沒有下一個喬那么好。
@斯特德:謝謝,我現(xiàn)在正在看。
任何數(shù)據(jù)庫層都無法保護(hù)您免受XSS的攻擊,因為這是頁面輸出時間轉(zhuǎn)義的問題,與數(shù)據(jù)庫無關(guān)。雖然許多錯誤引導(dǎo)的作者嘗試在SQL轉(zhuǎn)義或輸入值溢出的同時進(jìn)行HTML轉(zhuǎn)義,但這是解決此問題的錯誤時間,通常會導(dǎo)致不完整的保護(hù)以及其他令人討厭的錯誤。
如果這個答案是正確的,那么為什么我的PDO沒有準(zhǔn)備好從參數(shù)中包含的字符串中正確地轉(zhuǎn)義單引號?
"PDO PREPARE不會阻止SQL注入"-它將通過常量值(例如變量分配)防止注入,但不會保護(hù)其他地方的注入,例如標(biāo)識符(表/列名稱)中的注入。如果使用來自用戶輸入的表名,那么需要注意避免通過該向量進(jìn)行SQL注入。
有關(guān)準(zhǔn)備好的語句如何防止SQL注入的深入解釋,請閱讀:stackoverflow.com/a/12202218。
PDO提供了一種替代方案,旨在用pdo::quote()方法替換mysql_escape_string()。
以下是PHP網(wǎng)站的摘錄:
$conn = new PDO('sqlite:/home/lynn/music.sql3');
/* Simple string */
$string = 'Nice';
print"Unquoted string: $string
";
print"Quoted string:" . $conn->quote($string) ."
";
?>
上述代碼將輸出:
Unquoted string: Nice
Quoted string: 'Nice'
我目前正在將舊代碼遷移到使用PDO的過程中,雖然這個解決方案是一個很好的解決方案,但是人們需要意識到它會在字符串周圍加引號。因此,如果人們構(gòu)建的查詢已經(jīng)有了像"SELECT * FROM users WHERE username = '".$conn->quote($username)."'";這樣的引號,那么查詢將不可避免地失敗。
接受的答案可能是推薦的方法和最佳實踐,但這個答案是對實際問題的正確答案。有時,您實際上需要使用舊的mysql_escape_string函數(shù),例如,如果您正在構(gòu)建一個要稍后執(zhí)行的文件。你不能用事先準(zhǔn)備好的聲明來做這件事。
使用準(zhǔn)備好的語句。它們將數(shù)據(jù)和語法分開,從而消除了對MySQL數(shù)據(jù)進(jìn)行轉(zhuǎn)義的需要。請參見例如本教程。
皮斯克沃,謝謝。我已經(jīng)在使用它們了,只是在錯誤出現(xiàn)的地方?jīng)]有。我只是想知道Prepare是否真的能阻止注射攻擊。我聽過相反的說法,似乎有很多爭論。
@約翰:是的,準(zhǔn)備好的語句將停止SQL注入攻擊。(當(dāng)然,SQL注入只是一個可能的攻擊向量,因此防止它們不是一個魔法"如果你的網(wǎng)站現(xiàn)在完全安全"的灰塵)
@約翰沒有一場辯論。事實上只有你在辯論。
賈維斯:是的。還有……?
啊,好吧,只是覺得你還想再加點什么。很好的指向文檔的鏈接,謝謝。
準(zhǔn)備好的語句并不能抵御所有類型的SQL注入,例如,如果使用動態(tài)表名。有關(guān)更多詳細(xì)信息,請參閱我對已接受答案的評論。
當(dāng)然,它們不是萬無一失的;只要有足夠的努力,你就可以用任何東西射自己的腳。但是,它們確實刪除了最常見的錯誤類型/攻擊向量。
這在某些情況下是有幫助的,但是如果您試圖插入或更新數(shù)據(jù),并且列和或表名來自變量,那么就可以了。那就沒用了。因為只有當(dāng)數(shù)據(jù)在select語句中時,它才會允許您包含列名。因此,如果從變量中獲取表名,或者執(zhí)行插入或更新操作,并且從變量中獲取列名,那么仍然需要轉(zhuǎn)義數(shù)據(jù)。
@基特拉莫斯:我想說,雖然有各種特殊情況,但準(zhǔn)備好的聲明對最常見的情況有幫助。當(dāng)然,如果您正在做一些高級的工作,這可能不是適合該工作的工具;但是我猜90%的SQL語句(以及99.9%的按執(zhí)行量計算)確實屬于選擇/插入/更新類別,其中準(zhǔn)備好的查詢是該工作的正確工具。(從我在代碼中看到的內(nèi)容來看——注意問題來自2010年——動態(tài)列名要么是A.高度特定的元代碼(數(shù)據(jù)庫管理),要么是B.無體系結(jié)構(gòu)的代碼(非規(guī)范化))。
總結(jié)
以上是生活随笔為你收集整理的php pdo字符,关于php:真正的转义字符串和PDO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PID控制器开发笔记之八:带死区的PID
- 下一篇: 锋巢集团韩松解读:数智化营销赋能企业智慧