Re: [請益]請問 mysql_real_escape_string的寫法?

看板PHP作者 (石頭)時間8年前 (2015/08/08 20:48), 8年前編輯推噓3(304)
留言7則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《ahoo122002 (承讓)》之銘言: : 請問mysql_real_escape_string? : 有大約google了一下sql injection : 之後想說這樣寫ok嗎? : 1. : function test($value){ : return mysql_real_escape_string($value); : } : $name = test($_POST["name"]); : $password = test($_POST["password"]); escape sql 是在有 SQL 的地方才應該做的事情 沒有SQL 的時候 escape ...沒什麼 OK 不 OK 可言... : 2. : <?php : function mysql_escape_mimic($inp) { : // blah blah : return $inp; : } : $name = mysql_escape_mimic($_POST["name"]); : $password = mysql_escape_mimic($_POST["password"]); 不要寫自己的 escape function,要用別人寫好的 這世界比你以為的險惡太多... 你寫的方法看起來跟 addslashes() 滿類似的 那麼就有可能被人用塞入奇怪的多 byte 字元攻破 操作方法像是這篇 http://www.securityidiots.com /Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html : 有高手可以提供其他好的寫法嗎? : 先不談PDO,ORM <----這還不太懂 還是談一談比較好,用 PDO 比較不容易作錯事情... // 1. DB 先生,你好,我要跟你建立連線 // 2. DB 先生,我等下要下這句 SQL,其中有個參數叫做「:name」 // 真的執行的時候我會跟你說會「:name」的內容是什麼 // 3. DB 先生,「:name」 的內容是 $_POST['name'],請跑我剛剛那句 SQL // 4. DB 先生,請把剛剛執行的結果回給我 $db = new PDO('mysql:host={機器的IP};dbname={DB的名字}', '帳號', '密碼'); $db->prepare('SELECT * FROM user WHERE name=:name'); $db->execute([':name' => $_POST['name']]); $result = $db->fetchAll(); 其中那個 prepare() 在做的事情叫做「prepared statement」,細節請自己找 然後這樣下的話 DB 會幫你搞定 escape 之類的事情,你可以完全不用管 不用自己 escape,那就不會 escape 錯... 然後 ORM 其實只是把 DB 操作包裝起來而已,寫 code 的時候連 DB 在哪都不用管了 且 ORM 不是個標準,很多人在寫,大家寫的都不太一樣... 以下是 Laravel 的範例 // 查詢使用者資料 // 錢包扣一百元 // 存檔 $member = Member::where('name', '=', )->first(); $member->money = $member->money - 100; $member->save(); 一個 row 拉出來會變一個物件,然後可以直接改物件的內容來改資料 ORM 就是這件事... 好處是有人覺得這樣寫比較直覺(也有人不這麼認為) 然後你不用管 escape ,現代的 ORM 會幫你搞定(通常是透過底層的 PDO) ORM 連 SQL 都不太讓你寫... 不用自己 escape,就不用擔心 escape 錯東西 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.27.58.126 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1439038082.A.307.html ※ 編輯: hiigara (114.27.58.126), 08/08/2015 20:53:24

08/10 19:45, , 1F
是否只有文字輸入的部份,要防sql injection
08/10 19:45, 1F

08/10 21:52, , 2F
所有外來的東西 (不論是不是輸入框) 都要防
08/10 21:52, 2F

08/11 10:33, , 3F
是阿,是否只有參數要防injection? 參數和SQL stmt
08/11 10:33, 3F

08/11 10:34, , 4F
一定要在一起escape才算數嗎?SQL stmt又不會有外來的
08/11 10:34, 4F

08/12 19:50, , 5F
針對第1個寫法,想說大家都知道,所以省略sql,才只貼
08/12 19:50, 5F

08/12 19:50, , 6F
部份程式碼,來問大家。
08/12 19:50, 6F
那你就只是幫 mysql_real_escape_string() 改個名字而已? ※ 編輯: hiigara (211.23.191.35), 08/12/2015 23:07:12

08/13 19:12, , 7F
就寫個function,要用到的就run
08/13 19:12, 7F
文章代碼(AID): #1LnVg2C7 (PHP)
文章代碼(AID): #1LnVg2C7 (PHP)