php還算新手
最近才開始轉用pdo的
請教一
以前知道用mysql_real_escape_string
但是最近才知道 pdo是不能用mysql_real_escape_string
因為這個函數好像是要用mysql_connect() 先連好才能用的
還知道了要用bindParam這類的寫法配合預先處理
$stmt = $dbh->prepare ("INSERT INTO user (firstname, surname) VALUES (:f-name, :s-name)");
$stmt -> bindParam(':f-name', 'John');
$stmt -> bindParam(':s-name', 'Smith');
$stmt -> execute();
想請教一下bindParam是否已經足夠安全?
還是用bindValue會更好?
請教二
相比mysql_real_escape_string好像麻煩點?
mysql_real_escape_string 處理後....寫入資料庫時
Tom's Book 在PHP中顯示處理成 Tom\'s Book
但寫入資料庫中,是只儲存 Tom's Book
這一點在前台顯示時,是非常方便的,因為畢竟的純粹的SELECT麻,也應該沒什麼安全問題...吧?
但是問題來了
既然bindParam自動加上了轉義,甚至儲存到資料庫中,那我不知道前台有什麼地方需要用到stripslashes()這個函數
難度每個地方都加嗎?
有關這問題只有三個可能吧?
1. PDO有其他防SQL注入的方法?? 儲存時可以不用儲存 "\" 這符號?
2. 有可能有設定檔加入一些東西...把全站都加上stripslashes()? 貌似不太可行?
3. 老老實實,除了日期或分類ID之外的,慢慢的一個個加上?
另外也想請教一下
$stmt = $dbh->prepare ("INSERT INTO user (firstname, surname) VALUES (:f-name, :s-name)");
$stmt -> bindParam(':f-name', 'John');
$stmt -> bindParam(':s-name', 'Smith');
$stmt -> execute();
除了用"?"以外,這一類的寫法算合理嗎?
還有,官方也提議我們用PDO需要升到5.3.6? 那還是直接升5.4 有需要特別注意什麼嗎?
回複討論(解決方案)
確實是新手,還不知道 PDO::quote 方法的存在
用PDO需要升到5.3.6,是因為直到5.3.6,PDO才具有實用價值。之前的所有版本都存在著各種嚴重問題
prepare 準備
bindParam 綁定參數
這是為一條SQL多次使用(僅參數不同)準備的,而無需每輪都組裝查詢串
php 是通過 magic_quotes_gpc 來決定是否對外來資料做轉義處理的
php 5.3.6及以後預設關閉
php5.4.0及以後忽視它的存在
也就是說:安全問題是你自己的問題,php不打算替你完成了
用了
prepare
bindParam
是否也不足夠
要用PDO::quote?
那想請問一下
用quote的話不是取代了prepare?
就不能預先處理或者批量insert?
預先處理後用 execute 和 直接用 query 是兩條路
quote 是轉義,對於預先處理後的 execute 會自動隱式執行
對於 query 需自己顯式的執行
預先處理後用 execute 和 直接用 query 是兩條路
quote 是轉義,對於預先處理後的 execute 會自動隱式執行
對於 query 需自己顯式的執行
明白了??
但是....
$sql = "INSERT INTO foo (id,name) VALUES ('',:name)";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':name', $name);
$name = $pdo->quote($_POST["name"]);
$stmt->execute();
比如我輸入:peter's book
但為什麼會儲存成'peter's book'
這是正常的嗎?
我輸出是要做些處理?