<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>「我很納悶&#8230;怎麼一堆 PHP 程式設計師不知道要怎麼防 SQL Injection」的迴響</title>
	<atom:link href="http://www.pigo.idv.tw/archives/820/feed" rel="self" type="application/rss+xml" />
	<link>http://www.pigo.idv.tw/archives/820</link>
	<description>嘿嘿嘿嘿 .....</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:41:50 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>由：pigo</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-1053</link>
		<dc:creator>pigo</dc:creator>
		<pubDate>Thu, 15 Dec 2011 11:55:27 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-1053</guid>
		<description>&lt;p&gt;to&#160;曼菲士&lt;/p&gt;
&lt;p&gt;確實 PDO prepare 不是徹底防止 sql injection , 但確可以讓程式碼少寫 , 且效能也比較好 , 某些情形下再加以不同的正規式 replace 過濾甚至還要搭配過濾掉資料含有 HTML SCRIPT 的元件來防止寫入資料庫後造成 xss 攻擊 , 這些則是網站開發者隨年齡與經驗必須慢慢去體會的&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>to&nbsp;曼菲士</p>
<p>確實 PDO prepare 不是徹底防止 sql injection , 但確可以讓程式碼少寫 , 且效能也比較好 , 某些情形下再加以不同的正規式 replace 過濾甚至還要搭配過濾掉資料含有 HTML SCRIPT 的元件來防止寫入資料庫後造成 xss 攻擊 , 這些則是網站開發者隨年齡與經驗必須慢慢去體會的</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：曼菲士</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-1052</link>
		<dc:creator>曼菲士</dc:creator>
		<pubDate>Thu, 15 Dec 2011 10:33:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-1052</guid>
		<description>我認為 把SQL injection 丟給PDO prepare處理
並不算懂怎麼過濾
真正的懂 是能用正規式 自己replace</description>
		<content:encoded><![CDATA[<p>我認為 把SQL injection 丟給PDO prepare處理<br />
並不算懂怎麼過濾<br />
真正的懂 是能用正規式 自己replace</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：佳佳</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-1004</link>
		<dc:creator>佳佳</dc:creator>
		<pubDate>Fri, 26 Aug 2011 06:41:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-1004</guid>
		<description>哈阿哈哈
以前學校沒教
我是到恆逸上課才學的

我去面試也有被問到這題
考試也有考

借轉喔!!!!</description>
		<content:encoded><![CDATA[<p>哈阿哈哈<br />
以前學校沒教<br />
我是到恆逸上課才學的</p>
<p>我去面試也有被問到這題<br />
考試也有考</p>
<p>借轉喔!!!!</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：CHENG</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-782</link>
		<dc:creator>CHENG</dc:creator>
		<pubDate>Wed, 10 Nov 2010 18:56:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-782</guid>
		<description>感謝大大提供全英文資訊~ 哈哈  
我對於英文部分真的還要繼續加強~~

不管怎樣 感謝您~~~</description>
		<content:encoded><![CDATA[<p>感謝大大提供全英文資訊~ 哈哈<br />
我對於英文部分真的還要繼續加強~~</p>
<p>不管怎樣 感謝您~~~</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：pigo</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-781</link>
		<dc:creator>pigo</dc:creator>
		<pubDate>Wed, 10 Nov 2010 08:29:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-781</guid>
		<description>&lt;a href=&quot;#comment-780&quot; rel=&quot;nofollow&quot;&gt;@CHENG &lt;/a&gt; 
看看這篇就知道了
http://www.php.net/manual/en/pdo.error-handling.php

基本上 execute() 也有返回 bool 可以讓你判斷有沒有錯 , 但若妳要完全用 Exeception 就要如上述網址去改看看</description>
		<content:encoded><![CDATA[<p><a href="#comment-780" rel="nofollow">@CHENG </a><br />
看看這篇就知道了<br />
<a href="http://www.php.net/manual/en/pdo.error-handling.php" rel="nofollow">http://www.php.net/manual/en/pdo.error-handling.php</a></p>
<p>基本上 execute() 也有返回 bool 可以讓你判斷有沒有錯 , 但若妳要完全用 Exeception 就要如上述網址去改看看</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：CHENG</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-780</link>
		<dc:creator>CHENG</dc:creator>
		<pubDate>Tue, 09 Nov 2010 05:41:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-780</guid>
		<description>HI~我又來了 大大我遇到一個我無解的問題 想說可以詢問你看看~
function NewSqlGo($SqlLink=NULL,$Parameters=NULL){
                 try{
                        $sth = $this-&gt;dbh-&gt;prepare($SqlLink);
                        $sth-&gt;execute($Parameters);

                        //print_r($sth-&gt;errorInfo());   //這裡可以輸出錯誤

                        } catch (PDOException $e) {
                                /*連線例外方法
                                ===========================*/
                                echo &quot;例外&quot;;
                                print_r( $e-&gt;errorInfo());
                   }
                        //$this-&gt;dbh =NULL;//關閉連線
        }

這是我寫的一個連線方法 在最上面已經有產生資料庫連線
然而我故意傳入一個錯誤的資料庫 然而只有在TRY 那邊使用 $sth-&gt;errorInfo()
才會顯現錯誤語法~

然後在例外處理部分使用$e去接 並把它導向errorInfo()要列印出錯誤
結果 
不管是
echo &quot;例外&quot; 
或者 $e-&gt;errorInfo() 都沒有顯現資料

想說問大大能不能為我解惑~</description>
		<content:encoded><![CDATA[<p>HI~我又來了 大大我遇到一個我無解的問題 想說可以詢問你看看~<br />
function NewSqlGo($SqlLink=NULL,$Parameters=NULL){<br />
                 try{<br />
                        $sth = $this-&gt;dbh-&gt;prepare($SqlLink);<br />
                        $sth-&gt;execute($Parameters);</p>
<p>                        //print_r($sth-&gt;errorInfo());   //這裡可以輸出錯誤</p>
<p>                        } catch (PDOException $e) {<br />
                                /*連線例外方法<br />
                                ===========================*/<br />
                                echo "例外";<br />
                                print_r( $e-&gt;errorInfo());<br />
                   }<br />
                        //$this-&gt;dbh =NULL;//關閉連線<br />
        }</p>
<p>這是我寫的一個連線方法 在最上面已經有產生資料庫連線<br />
然而我故意傳入一個錯誤的資料庫 然而只有在TRY 那邊使用 $sth-&gt;errorInfo()<br />
才會顯現錯誤語法~</p>
<p>然後在例外處理部分使用$e去接 並把它導向errorInfo()要列印出錯誤<br />
結果<br />
不管是<br />
echo "例外"<br />
或者 $e-&gt;errorInfo() 都沒有顯現資料</p>
<p>想說問大大能不能為我解惑~</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：CHENG</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-719</link>
		<dc:creator>CHENG</dc:creator>
		<pubDate>Sat, 30 Oct 2010 05:05:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-719</guid>
		<description>恩 我目前使用的方式就是您說的
物件化 資料庫連線物件

之後再使用那問件去執行其他方法 只是最近在想該怎樣做可以做到防sql injection
且效能高 又不會很難維護的方法~ 目前已經有個大方向了~</description>
		<content:encoded><![CDATA[<p>恩 我目前使用的方式就是您說的<br />
物件化 資料庫連線物件</p>
<p>之後再使用那問件去執行其他方法 只是最近在想該怎樣做可以做到防sql injection<br />
且效能高 又不會很難維護的方法~ 目前已經有個大方向了~</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：pigo</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-718</link>
		<dc:creator>pigo</dc:creator>
		<pubDate>Sat, 30 Oct 2010 03:15:40 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-718</guid>
		<description>&lt;a href=&quot;#comment-717&quot; rel=&quot;nofollow&quot;&gt;@CHENG &lt;/a&gt; 
是啊 , 有很多種用法 , 看人怎麼設計

最簡單的做法 , 一個基礎的 db class , 裡面有個 $this-&gt;db , 然後其他的資料操作邏輯都可以寫成物件去繼承 db class , 就很好用了</description>
		<content:encoded><![CDATA[<p><a href="#comment-717" rel="nofollow">@CHENG </a><br />
是啊 , 有很多種用法 , 看人怎麼設計</p>
<p>最簡單的做法 , 一個基礎的 db class , 裡面有個 $this->db , 然後其他的資料操作邏輯都可以寫成物件去繼承 db class , 就很好用了</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：CHENG</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-717</link>
		<dc:creator>CHENG</dc:creator>
		<pubDate>Sat, 30 Oct 2010 02:14:35 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-717</guid>
		<description>經過看了6次您的回文 我稍微寫一下我的想法
像您說的 已經被學校或者外面書本教育到使用傳統連線已經習慣~
而且效率相當低 所以特別來找尋PDO相關的連線方式~

所以我稍微的去GOOGLE  找斷一段語法
// 組合 SQL 語法，取得符合 id = 2、name = &#039;John&#039; 的資料
$sth = $dbh-&gt;prepare(&#039;SELECT * FROM table WHERE id = :id AND name = :name&#039;);
$where = array(&#039;:id&#039; =&gt; 2, &#039;:name&#039; =&gt; &#039;John&#039;);

// 使用 execute()，會自動 quote $where 的參數
$sth-&gt;execute($where);

所以簡單講~假設使用 prepare() 是做為宣告此資料庫連線，
然後使用 execute()做綁定動作時 execute()會自動quote傳入的變數達到簡短程式碼增加效率，

因為小弟目前是剛畢業的PHP 程式設計師，
每天用最多的 就是資料庫連線， 所以最近把PDO物件導向化，
希望把資料庫連線簡短且有效率，而不是寫得又臭又長又難維護，
查到 SQL Injection才來詢問您，還希望大大有機會可以認識認識，
因為對於台灣的資訊安全教育，我也真的很擔心所以目前在瘋狂的自我補強。

且你上面提到的 PDOStatment 也讓程式有比較方便或彈性的設計 
其實我看到那段語法就想說 假設資料庫連線的宣告都先做成方法
例如  要使用 User Table時就Query(In User,$sql);
$sql=array(&#039;:id&#039; =&gt; 2, &#039;:name&#039; =&gt; &#039;John&#039;); 
把$sql帶入In User Table 這樣去就可以在下次使用時隨意更換資料庫
我這想法是不是就是你說的PDOStatment方便或彈性的設計嗎?</description>
		<content:encoded><![CDATA[<p>經過看了6次您的回文 我稍微寫一下我的想法<br />
像您說的 已經被學校或者外面書本教育到使用傳統連線已經習慣~<br />
而且效率相當低 所以特別來找尋PDO相關的連線方式~</p>
<p>所以我稍微的去GOOGLE  找斷一段語法<br />
// 組合 SQL 語法，取得符合 id = 2、name = &#8216;John&#8217; 的資料<br />
$sth = $dbh-&gt;prepare(&#8216;SELECT * FROM table WHERE id = :id AND name = :name&#8217;);<br />
$where = array(&#8216;:id&#8217; =&gt; 2, &#8216;:name&#8217; =&gt; &#8216;John&#8217;);</p>
<p>// 使用 execute()，會自動 quote $where 的參數<br />
$sth-&gt;execute($where);</p>
<p>所以簡單講~假設使用 prepare() 是做為宣告此資料庫連線，<br />
然後使用 execute()做綁定動作時 execute()會自動quote傳入的變數達到簡短程式碼增加效率，</p>
<p>因為小弟目前是剛畢業的PHP 程式設計師，<br />
每天用最多的 就是資料庫連線， 所以最近把PDO物件導向化，<br />
希望把資料庫連線簡短且有效率，而不是寫得又臭又長又難維護，<br />
查到 SQL Injection才來詢問您，還希望大大有機會可以認識認識，<br />
因為對於台灣的資訊安全教育，我也真的很擔心所以目前在瘋狂的自我補強。</p>
<p>且你上面提到的 PDOStatment 也讓程式有比較方便或彈性的設計<br />
其實我看到那段語法就想說 假設資料庫連線的宣告都先做成方法<br />
例如  要使用 User Table時就Query(In User,$sql);<br />
$sql=array(&#8216;:id&#8217; =&gt; 2, &#8216;:name&#8217; =&gt; &#8216;John&#8217;);<br />
把$sql帶入In User Table 這樣去就可以在下次使用時隨意更換資料庫<br />
我這想法是不是就是你說的PDOStatment方便或彈性的設計嗎?</p>
]]></content:encoded>
	</item>
	<item>
		<title>由：pigo</title>
		<link>http://www.pigo.idv.tw/archives/820/comment-page-2#comment-716</link>
		<dc:creator>pigo</dc:creator>
		<pubDate>Fri, 29 Oct 2010 18:00:04 +0000</pubDate>
		<guid isPermaLink="false">http://www.pigo.idv.tw/?p=820#comment-716</guid>
		<description>&lt;a href=&quot;#comment-714&quot; rel=&quot;nofollow&quot;&gt;@CHENG &lt;/a&gt; 
PDO 有兩個物件
PDO 及 PDOStatment
PDO 本身就可以執行 sql 了 , 就是 PDO::query()
那就和原本的 mysql_query 一樣
因此先回想 mysql_query() 怎麼使用
mysql_query( &quot;select * from users WHERE user=&#039;&quot; . $_POST[&#039;user&#039;] . &quot;&#039;&quot;);
如果單純這樣寫 , 被攻擊是一定會的
但如果
mysql_query(&quot;select * from users WHERE user=&#039;&quot; .mysql_real_escape_string($_POST[&#039;user&#039;]) . &quot;&#039;&quot;);
就可以防止
同理 , PDO::query() 可以搭配 PDO::quote() 等同上述效果

至於為何有另一種 PDOStatment 物件的做法
我個人已經不曉得到底這種做法是從那一種語言開始看到 , java jdbc 很早前就有用這種做法 ,  早期的 PHP ADODB 套件就有導入這種做法
好處就是你可以不用寫那麼多程式碼 , 至少可以不用下太多次 PDO::quote , 可以用陣列帶值進去取代就和 PDO::quote() 的效果可預防 sql injection 了

另外 PDOStatment 也讓程式有比較方便或彈性的設計 , 你可能要仔細摸才能品味到</description>
		<content:encoded><![CDATA[<p><a href="#comment-714" rel="nofollow">@CHENG </a><br />
PDO 有兩個物件<br />
PDO 及 PDOStatment<br />
PDO 本身就可以執行 sql 了 , 就是 PDO::query()<br />
那就和原本的 mysql_query 一樣<br />
因此先回想 mysql_query() 怎麼使用<br />
mysql_query( "select * from users WHERE user=&#8217;" . $_POST['user'] . "&#8216;");<br />
如果單純這樣寫 , 被攻擊是一定會的<br />
但如果<br />
mysql_query("select * from users WHERE user=&#8217;" .mysql_real_escape_string($_POST['user']) . "&#8216;");<br />
就可以防止<br />
同理 , PDO::query() 可以搭配 PDO::quote() 等同上述效果</p>
<p>至於為何有另一種 PDOStatment 物件的做法<br />
我個人已經不曉得到底這種做法是從那一種語言開始看到 , java jdbc 很早前就有用這種做法 ,  早期的 PHP ADODB 套件就有導入這種做法<br />
好處就是你可以不用寫那麼多程式碼 , 至少可以不用下太多次 PDO::quote , 可以用陣列帶值進去取代就和 PDO::quote() 的效果可預防 sql injection 了</p>
<p>另外 PDOStatment 也讓程式有比較方便或彈性的設計 , 你可能要仔細摸才能品味到</p>
]]></content:encoded>
	</item>
</channel>
</rss>

