Re: [請益] 無法寫入mysql資料庫

作者: SKL (:Q~~~~~~~)   2014-09-25 13:28:20
另外提一點 SQL Injection 問題,
如果我沒看錯,你的 chgStr 這樣寫實在很危險,
只要輸入 \' 就跳出來了阿...
e.g. SELECT foo FROM bar WEHRE aaa='\'''
1. 請 google prepared statements
除了 ext/mysql 你還有更好的選擇 => MySQLi 或 PDO_MySQL
盡量別再自己串 sql query 了...
(在 5.5 以前真要串的話也有 mysql_real_escape_string 可用)
而且 ext/mysql 在 5.5 之後準備掰掰了阿
http://php.net/manual/en/migration55.deprecated.php
2. 至於上篇 tkdmaf 提到的「魔術引號」為免誤解只要了解一下就好不要靠它,
因為 Magic Quotes 也在 5.3 deprecated, 5.4 掰掰了
http://php.net/manual/en/security.magicquotes.php
==
感覺你看的書或範例已經有點年代了... @@
※ 引述《tkdmaf (皮皮快跑)》之銘言:
: ※ 引述《dummytrue (就只是大叔而已)》之銘言:
: : 超新手發問:
: : 確認可以連結資料庫了
: : 從phpmyadmin新增資料也可以順利顯示
: : 可是從php就怎麼也寫不進去
: : <FORM Action=addnew.php Method=POST>
: : <TABLE Border="1" bgcolor="#FFCC66" bordercolor="#FF9933" cellspacing="0">
: : <TR><TD><font size="2">姓名:</font></TD>
: : <TD><font size="2"><INPUT Type="text" Size="30" Name="姓名"></font></TD></TR>
: : <TR><TD><font size="2">e-mail:</font></TD>
: : <TD><font size="2"><INPUT Type="text" Size="30" Name="e-mail">
: : </font></TD></TR>
: : <TR><TD><font size="2">主題:</font></TD>
: : <TD><font size="2"><INPUT Type="text" Size="60" Name="主題">
: : </font></TD></TR>
: : <TR><TD><font size="2">內容:</font></TD>
: : <TD><font size="2"><TEXTAREA Name="內容" Rows="8" Cols="60">
: : </TEXTAREA></font></TD></TR>
: : </TABLE><INPUT Type="submit" Value="送出討論主題">
: : </FORM>
: : 然後由這邊接:
: : Function chgStr($data)
: : {
: : $chgStr = "'" . str_replace("'", "''", $data) . "'";
: : return $chgStr;
: : }
: : //將資料寫入資料庫
: : $sql = "Insert Into maintitle (姓名, Email, 主題, 內容, 篇數, 發言日期)
: : Values (";
: : $sql = $sql . chgStr($_REQUEST["姓名"]) . ",";
: : $sql = $sql . chgStr($_REQUEST["e-mail"]) . ",";
: : $sql = $sql . chgStr($_REQUEST["主題"]) . ",";
: : $sql = $sql . chgStr(nl2br($_REQUEST["內容"])) . ",";
: : $sql = $sql . 0 . ",'";
: : date_default_timezone_set('Asia/Taipei');
: : $sql = $sql . date("Y-m-j H:i:s") . "')";
: : mysql_query($sql);
: : header("Location: index.php");
: : 沒有全部貼出來 應該是這兩段有問題吧?
: 幾個地方要注意,有的比較重要,有的是coding style
: 1.所有的函式指令集一律使用小寫。不要有大小寫混用的情形:
: 例:
: 正確:echo、function
: 錯誤的style:Echo、ECHO、Function
: 雖然使用錯誤的style並不一定會有錯誤,但對看的人而言要不是覺得奇怪。
: 要不就是有格格不入的感覺。
: 2.資料庫指令集有很多php的書都是教用大寫。
: 這當然也是coding style的問題,但是對sql指令集來說我的習慣是要就全部大寫,要
: 就全部小寫,不要大小寫混在一起使用,就算他不會出錯也不好。
: (其實我看到比較多的習慣是SQL指令集全大寫,欄位、資料才是用小寫)
: 3.$_REQUEST最好不要使用。
: 這東西是POST和GET都吃,那如果你表單也下name你設定post送出。
: 然後你的網址又帶name=xxx
: 雖然這樣取資料會是以表單的post為主。
: 那如果你的網址帶的參數是有意義的話參數就被消滅了。
: 該是post就用$_POST該是get就用$_GET
: 4.資料庫的欄位……正確的說除了資料本身資料庫的設定都不要用中文。
: 這個問題基本關乎中文編碼。就算你全部統一使用UTF-8做為你的編碼。
: 有關於資料庫的結構和指令集都不應該讓他出現中文。
: 這我該說做為一個程式設計師就算英文跟我一樣爛也實在不應該以中文做為程式碼
: 或是規劃資料庫的一部份。
: 不過話說回來,這種錯誤大概很多初學新手都會犯到使用中文。
: 當年我剛開始學MYSQL時,也幹過同樣的事。
: 後來就是自食惡果。
: 5.時區設定請寫在SERVER的PHP.INI設定中。如果是使用付費空間就請對方改。
: 基本上時區應該是全網頁一體適用。
: 如果說這是不能改的,那你最好祈禱你每次都記得設定時區,否則在做交易時可能
: 會因為時間上的錯誤導致交易異常。
: 也許現在的很多framework都有內置config來設定時區。
: 前提是你有在用。
: 儘可能將必要的設定做在server的設定檔中,而不是用程式中途去改。
: 除非是特別狀況(例如臨時上傳大檔案要臨時加大記憶體使用的空間)
: 6.無論如何,去了解一下關於php「魔術引號」這件事情。
: 7.date()格式,通常是Y-m-d或是Y-n-j,Y-m-j會變成下面這種情形:
: 2014年9月4日
: Y-m-d => 2014-09-04
: Y-n-j => 2014-9-4
: y-m-j => 2014-09-4
: 你應該會覺得月份和日期感覺格格不入吧。
: 當然這是個人感覺style的問題。
: 其實大部份應該都算是設計風格上的問題。
: 畢竟你的程式是能正常運作的。
: 不過去改善這些事情對修改及維護會很有幫助。
作者: duck10704 (duck)   2014-09-25 14:22:00
處理sql時候要 filter input, escape output :P
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-09-25 22:00:00
找工作必考SQL injection怎麼防 差不多有筆試都會考

Links booklink

Contact Us: admin [ a t ] ucptt.com