<?xml version="1.0" encoding="utf-8"?><!-- generator="b2evolution/3.3.1" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>yohgaki's blog - addslashesによるエスケープ処理は止めましょう の最近のコメント</title>
		<link>http://blog.ohgaki.net/?disp=comments</link>
		<atom:link rel="self" type="application/rss+xml" href="http://blog.ohgaki.net/?tempskin=_rss2&#38;disp=comments&#38;p=505" />
		<description></description>
		<language>ja-JP</language>
		<docs>http://backend.userland.com/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=3.3.1"/>
		<ttl>60</ttl>
				<item>
			<title>石井 [訪問者] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Sun, 19 Feb 2006 14:44:06 +0000</pubDate>
			<dc:creator>石井 [訪問者]</dc:creator>
			<guid isPermaLink="false">c782@http://blog.ohgaki.net/</guid>
			<description>pg_set_client_encodingを呼ぶのと，SET client_encoding TO をするのは，PostgreSQL 7.4以降であれば同じです．違っていたのは7.3以前の話ですね．</description>
			<content:encoded><![CDATA[pg_set_client_encodingを呼ぶのと，SET client_encoding TO をするのは，PostgreSQL 7.4以降であれば同じです．違っていたのは7.3以前の話ですね．]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c782</link>
		</item>
				<item>
			<title>komura [訪問者] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Sat, 18 Feb 2006 01:17:59 +0000</pubDate>
			<dc:creator>komura [訪問者]</dc:creator>
			<guid isPermaLink="false">c780@http://blog.ohgaki.net/</guid>
			<description>遅くなってしまいましたが、pg_set_client_encoding( 'SJIS' ) を実行してから同様の事を検証してみました。&lt;br /&gt;
&lt;br /&gt;
結果としては、&lt;br /&gt;
&lt;br /&gt;
SET client_encoding TO 'SJIS'; &lt;br /&gt;
&lt;br /&gt;
を実行してから SQL を実行したのと同様の結果になりました(0x9527 が SJIS の文字として見なされ、SQL インジェクション可能)。&lt;br /&gt;
&lt;br /&gt;
PHP 5.1.2 と PostgreSQL 8.1.3 で確認しました。&lt;br /&gt;
&lt;br /&gt;
あと、ご指摘通り、pg_prepare() と pg_execute() によるプリペアードクエリでは問題ありませんでした(文字コードが SJIS の場合でも SQL インジェクションを起こせない)。&lt;br /&gt;
&lt;br /&gt;
PHP 側でこれらの関数が導入されたのは PHP 5.1.0 以降のようですので、それより前のバージョンでは文字コードに SJIS を使用しないようにするしかないように思います。</description>
			<content:encoded><![CDATA[遅くなってしまいましたが、pg_set_client_encoding( 'SJIS' ) を実行してから同様の事を検証してみました。<br />
<br />
結果としては、<br />
<br />
SET client_encoding TO 'SJIS'; <br />
<br />
を実行してから SQL を実行したのと同様の結果になりました(0x9527 が SJIS の文字として見なされ、SQL インジェクション可能)。<br />
<br />
PHP 5.1.2 と PostgreSQL 8.1.3 で確認しました。<br />
<br />
あと、ご指摘通り、pg_prepare() と pg_execute() によるプリペアードクエリでは問題ありませんでした(文字コードが SJIS の場合でも SQL インジェクションを起こせない)。<br />
<br />
PHP 側でこれらの関数が導入されたのは PHP 5.1.0 以降のようですので、それより前のバージョンでは文字コードに SJIS を使用しないようにするしかないように思います。]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c780</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 21:29:03 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c775@http://blog.ohgaki.net/</guid>
			<description>http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html&lt;br /&gt;
&lt;br /&gt;
Iliaさんも同じ事を書いているのですね。と思ったら、リンク先のブログにもリンクあるし。よく読まないといかんですね。</description>
			<content:encoded><![CDATA[http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html<br />
<br />
Iliaさんも同じ事を書いているのですね。と思ったら、リンク先のブログにもリンクあるし。よく読まないといかんですね。]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c775</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 21:18:15 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c774@http://blog.ohgaki.net/</guid>
			<description>もう一つ対処方法を。&lt;br /&gt;
&lt;br /&gt;
プリペアードクエリを使用すればエンコーディングが違っていても（本来これ自体問題なのですが）SQLインジェクションは出来ないはずですね。&lt;br /&gt;
&lt;br /&gt;
エスケープ処理のミスのみでなく、エンコーディング設定のミスを防ぐためにもプリペアードクエリを使用した方が良いですね。&lt;br /&gt;
</description>
			<content:encoded><![CDATA[もう一つ対処方法を。<br />
<br />
プリペアードクエリを使用すればエンコーディングが違っていても（本来これ自体問題なのですが）SQLインジェクションは出来ないはずですね。<br />
<br />
エスケープ処理のミスのみでなく、エンコーディング設定のミスを防ぐためにもプリペアードクエリを使用した方が良いですね。<br />
]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c774</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 21:03:08 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c773@http://blog.ohgaki.net/</guid>
			<description>今日のところはちょっと時間不足なので、最後にkomuraさんコメントありがとうございます。&lt;br /&gt;
&lt;br /&gt;
pg_set_client_encoding関数以外でエンコーディングを変えると問題になる事は知っていましたが（自分が実装した関数なので当たり前ですが）SETで変えるのと同じ、と思われている方もいるはずですね。非常に参考になりました。&lt;br /&gt;
&lt;br /&gt;
時間が出来たらもう少し調べて確認してみたいと思います。&lt;br /&gt;
</description>
			<content:encoded><![CDATA[今日のところはちょっと時間不足なので、最後にkomuraさんコメントありがとうございます。<br />
<br />
pg_set_client_encoding関数以外でエンコーディングを変えると問題になる事は知っていましたが（自分が実装した関数なので当たり前ですが）SETで変えるのと同じ、と思われている方もいるはずですね。非常に参考になりました。<br />
<br />
時間が出来たらもう少し調べて確認してみたいと思います。<br />
]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c773</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 20:53:21 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c772@http://blog.ohgaki.net/</guid>
			<description>mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', &quot; and \x1a.&lt;br /&gt;
&lt;br /&gt;
とあるので、MySQLもmysql_real_escape_stringを使っていればどんな文字列で大丈夫なように作ってあると思います。仕様通りのエンコーディング指定をしていてもダメならMySQLのセキュリティホールという事に。</description>
			<content:encoded><![CDATA[mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.<br />
<br />
とあるので、MySQLもmysql_real_escape_stringを使っていればどんな文字列で大丈夫なように作ってあると思います。仕様通りのエンコーディング指定をしていてもダメならMySQLのセキュリティホールという事に。]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c772</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 20:46:09 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c771@http://blog.ohgaki.net/</guid>
			<description>正しい設定方法を書いていなかったですね。&lt;br /&gt;
&lt;br /&gt;
pg_set_client_encoding関数を使ってクライアントエンコーディングを設定すれば問題なく処理されるはずです。これが正しく処理されていないならPostgreSQLのセキュリティホール :)&lt;br /&gt;
&lt;br /&gt;
専用の関数は単純なラッパーの場合もありますが、意味があって専用関数になっている場合もあります。内部仕様を完全に把握していない場合は専用関数を使うべきと思います。&lt;br /&gt;
</description>
			<content:encoded><![CDATA[正しい設定方法を書いていなかったですね。<br />
<br />
pg_set_client_encoding関数を使ってクライアントエンコーディングを設定すれば問題なく処理されるはずです。これが正しく処理されていないならPostgreSQLのセキュリティホール :)<br />
<br />
専用の関数は単純なラッパーの場合もありますが、意味があって専用関数になっている場合もあります。内部仕様を完全に把握していない場合は専用関数を使うべきと思います。<br />
]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c771</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 20:43:17 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c770@http://blog.ohgaki.net/</guid>
			<description>なるほど。文字エンコーディングの違い問題が発生する典型的な例ですね。&lt;br /&gt;
&lt;br /&gt;
時間が無くて試していませんが、&lt;br /&gt;
&lt;br /&gt;
SET client_encoding TO 'SJIS'; &lt;br /&gt;
&lt;br /&gt;
接続先のDBサーバにこのSQLを送信すると、クライアントのエンコーディングとサーバのエンコーディングが別のエンコーディングになるので基本的に間違っています。&lt;br /&gt;
&lt;br /&gt;
要するにこうするとクライアントライブラリ（libpq）はサーバ側がSJISを使っている、ということを知らずに処理する事になります。&lt;br /&gt;
&lt;br /&gt;
PostgreSQLサーバはSJISエンコーディングをサポートしていないのでクライアント側でクライアントエンコーディング-&gt;サーバエンコーディングに変換していた、と思います。（ここの記憶が怪しいですが、SETでインジェクションが可能になるならこうなっているはず。libpqの接続構造体がエンコーディングを保持していた記憶は確かなはず）&lt;br /&gt;
&lt;br /&gt;
文字エンコーディングの違いでXSSが発生するのと同じで、SQLインジェクションできるようになるのは普通(?)の事だと思います。&lt;br /&gt;
# もしかして普通はそう考えない?&lt;br /&gt;
&lt;br /&gt;
</description>
			<content:encoded><![CDATA[なるほど。文字エンコーディングの違い問題が発生する典型的な例ですね。<br />
<br />
時間が無くて試していませんが、<br />
<br />
SET client_encoding TO 'SJIS'; <br />
<br />
接続先のDBサーバにこのSQLを送信すると、クライアントのエンコーディングとサーバのエンコーディングが別のエンコーディングになるので基本的に間違っています。<br />
<br />
要するにこうするとクライアントライブラリ（libpq）はサーバ側がSJISを使っている、ということを知らずに処理する事になります。<br />
<br />
PostgreSQLサーバはSJISエンコーディングをサポートしていないのでクライアント側でクライアントエンコーディング->サーバエンコーディングに変換していた、と思います。（ここの記憶が怪しいですが、SETでインジェクションが可能になるならこうなっているはず。libpqの接続構造体がエンコーディングを保持していた記憶は確かなはず）<br />
<br />
文字エンコーディングの違いでXSSが発生するのと同じで、SQLインジェクションできるようになるのは普通(?)の事だと思います。<br />
# もしかして普通はそう考えない?<br />
<br />
]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c770</link>
		</item>
				<item>
			<title>komura [訪問者] in response to: addslashesによるエスケープ処理は止めましょう</title>
			<pubDate>Tue, 14 Feb 2006 16:58:05 +0000</pubDate>
			<dc:creator>komura [訪問者]</dc:creator>
			<guid isPermaLink="false">c769@http://blog.ohgaki.net/</guid>
			<description>リンク先ではデータベース側で文字列を SJIS として処理している場合は、mysql_real_escape_string() や pg_escape_string() 等のデータベース専用のエスケープ関数を使用してもエスケープ処理が回避されてしまうことが書かれています。&lt;br /&gt;
PostgreSQL でも、SET client_encoding TO 'SJIS'; を実行した後、&quot;\x95' OR a = a; --&quot; のような文字列を渡して、pg_escape_string()  でエスケープすると、SQL インジェクションを引き起こすことが可能であることを確認しました(PostgreSQL 8.0.6/8.1.3)。&lt;br /&gt;
0x9527 という文字は本来は SJIS としては認められないはずですが、PostgreSQL では SJIS のマルチバイト文字として処理されるようです。</description>
			<content:encoded><![CDATA[リンク先ではデータベース側で文字列を SJIS として処理している場合は、mysql_real_escape_string() や pg_escape_string() 等のデータベース専用のエスケープ関数を使用してもエスケープ処理が回避されてしまうことが書かれています。<br />
PostgreSQL でも、SET client_encoding TO 'SJIS'; を実行した後、"\x95' OR a = a; --" のような文字列を渡して、pg_escape_string()  でエスケープすると、SQL インジェクションを引き起こすことが可能であることを確認しました(PostgreSQL 8.0.6/8.1.3)。<br />
0x9527 という文字は本来は SJIS としては認められないはずですが、PostgreSQL では SJIS のマルチバイト文字として処理されるようです。]]></content:encoded>
			<link>http://blog.ohgaki.net/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#c769</link>
		</item>
			</channel>
</rss>
