<?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 - SET NAMESは禁止 の最近のコメント</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=859" />
		<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>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Tue, 13 May 2008 01:04:38 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15180@http://blog.ohgaki.net/</guid>
			<description>&gt; お話をまとめると、上のような感じでしょうか。&lt;br /&gt;
&lt;br /&gt;
はい。&lt;br /&gt;
&lt;br /&gt;
普段MySQLを利用していないので指摘いただくまで忘れていました。mysql_set_charsetは新しい関数なので、古いPHP(ホスティング環境など）ではアップグレードが出来ないです。&lt;br /&gt;
&lt;br /&gt;
SET NAMESを利用していても、安全に運用したい方は以下のようにすればよいと思います。PHP以外の言語を利用されている方でも意味を理解いただければ、同じように対策できるはずです。&lt;br /&gt;
&lt;br /&gt;
■EUC-JPかUTF-8エンコーディング&lt;br /&gt;
この場合は話は簡単で入力時点で文字列がEUC-JPまたはUTF-8で正しくエンコーディングされているかチェックするだけです。アプリケーションの入力チェック処理としてmb_check_encoding(無い場合はmb_convert_encoding）を利用して文字エンコーディングが正しいかチェックすれば大丈夫です。そのまま、mysql_escape_stringを使ってエスケープすればほとんどの環境で大丈夫だと思います。&lt;br /&gt;
&lt;br /&gt;
# 例えば元のエンコーディングがISO-8859-1で&lt;br /&gt;
# EUC-JP, UTF-8に変更した場合は安全。&lt;br /&gt;
&lt;br /&gt;
蛇足ですが、文字エンコーディングのチェックはWebアプリケーションセキュリティ対策の基本です。例えば、htmlspecialchars/htmlentitiesが不正なマルチバイト文字に対して脆弱な問題が最近修正されていますが、入力チェックで文字エンコーディングが正しいかチェックしれていれば問題ありません。libxml2等よく利用されているライブラリにも文字エンコーディング関連の脆弱性が発見されていますが文字エンコーディングが正しければ影響を受けないものがほとんどです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■SJISエンコーディング（その１）&lt;br /&gt;
この場合、文字エンコーディングに配慮した置換ができる関数でエスケープするしかありません。例えば、mb_regex関数を利用して\と'をエスケープする自前の関数を作成して利用します。（マニュアルを見ないで書いています。mysqlでエスケープが必要な文字はMySQLマニュアルを参照してください）&lt;br /&gt;
&lt;br /&gt;
このエスケープ処理を行うだけでは壊れた文字エンコーディング攻撃に脆弱になるので、アプリケーション全体の入力チェック処理として、文字エンコーディングが正しいか確認する処理も追加します。&lt;br /&gt;
&lt;br /&gt;
■SJISエンコーディング(その2）&lt;br /&gt;
komuraさんのブログに書かれている通り、EUCやUTF-8にはSJISにある問題が無いです。なので以下の対策も有効です。&lt;br /&gt;
&lt;br /&gt;
&gt; 非効率ですが、データベースの文字コード&lt;br /&gt;
&gt; が Shift_JIS でも、クライアントの文字&lt;br /&gt;
&gt; コードを EUC-JP にして、SQL 文を EUC-JP &lt;br /&gt;
&gt; に変換してから発行することは可能だと思&lt;br /&gt;
&gt; います。&lt;br /&gt;
&lt;br /&gt;
文字列をmb_convert_encoding関数でSJISからEUCかUTF-8に変換し、変換後にmysql_escpae_stringでエスケープ処理行い、エスケープ済み文字列をまたSJISに変換してデータベースに送信すればSQLインジェクション出来なくなります。&lt;br /&gt;
&lt;br /&gt;
他の対策同様、アプリケーションレベルでの文字エンコーディングチェックも行うべきです。&lt;br /&gt;</description>
			<content:encoded><![CDATA[> お話をまとめると、上のような感じでしょうか。<br />
<br />
はい。<br />
<br />
普段MySQLを利用していないので指摘いただくまで忘れていました。mysql_set_charsetは新しい関数なので、古いPHP(ホスティング環境など）ではアップグレードが出来ないです。<br />
<br />
SET NAMESを利用していても、安全に運用したい方は以下のようにすればよいと思います。PHP以外の言語を利用されている方でも意味を理解いただければ、同じように対策できるはずです。<br />
<br />
■EUC-JPかUTF-8エンコーディング<br />
この場合は話は簡単で入力時点で文字列がEUC-JPまたはUTF-8で正しくエンコーディングされているかチェックするだけです。アプリケーションの入力チェック処理としてmb_check_encoding(無い場合はmb_convert_encoding）を利用して文字エンコーディングが正しいかチェックすれば大丈夫です。そのまま、mysql_escape_stringを使ってエスケープすればほとんどの環境で大丈夫だと思います。<br />
<br />
# 例えば元のエンコーディングがISO-8859-1で<br />
# EUC-JP, UTF-8に変更した場合は安全。<br />
<br />
蛇足ですが、文字エンコーディングのチェックはWebアプリケーションセキュリティ対策の基本です。例えば、htmlspecialchars/htmlentitiesが不正なマルチバイト文字に対して脆弱な問題が最近修正されていますが、入力チェックで文字エンコーディングが正しいかチェックしれていれば問題ありません。libxml2等よく利用されているライブラリにも文字エンコーディング関連の脆弱性が発見されていますが文字エンコーディングが正しければ影響を受けないものがほとんどです。<br />
<br />
<br />
■SJISエンコーディング（その１）<br />
この場合、文字エンコーディングに配慮した置換ができる関数でエスケープするしかありません。例えば、mb_regex関数を利用して\と'をエスケープする自前の関数を作成して利用します。（マニュアルを見ないで書いています。mysqlでエスケープが必要な文字はMySQLマニュアルを参照してください）<br />
<br />
このエスケープ処理を行うだけでは壊れた文字エンコーディング攻撃に脆弱になるので、アプリケーション全体の入力チェック処理として、文字エンコーディングが正しいか確認する処理も追加します。<br />
<br />
■SJISエンコーディング(その2）<br />
komuraさんのブログに書かれている通り、EUCやUTF-8にはSJISにある問題が無いです。なので以下の対策も有効です。<br />
<br />
> 非効率ですが、データベースの文字コード<br />
> が Shift_JIS でも、クライアントの文字<br />
> コードを EUC-JP にして、SQL 文を EUC-JP <br />
> に変換してから発行することは可能だと思<br />
> います。<br />
<br />
文字列をmb_convert_encoding関数でSJISからEUCかUTF-8に変換し、変換後にmysql_escpae_stringでエスケープ処理行い、エスケープ済み文字列をまたSJISに変換してデータベースに送信すればSQLインジェクション出来なくなります。<br />
<br />
他の対策同様、アプリケーションレベルでの文字エンコーディングチェックも行うべきです。<br />]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15180</link>
		</item>
				<item>
			<title>amiba [訪問者] in response to: SET NAMESは禁止</title>
			<pubDate>Sun, 11 May 2008 09:45:40 +0000</pubDate>
			<dc:creator>amiba [訪問者]</dc:creator>
			<guid isPermaLink="false">c15178@http://blog.ohgaki.net/</guid>
			<description>色々とご教授をありがとうございます。&lt;br /&gt;
&lt;br /&gt;
私自身も論点をぶらすような投稿を&lt;br /&gt;
少ししてしまったようなので、&lt;br /&gt;
論点を整理すると、「SET NAMESは禁止」&lt;br /&gt;
という論題で特に問題になるのはむしろ、&lt;br /&gt;
「中途半端にAPIを利用して、セキュリティー&lt;br /&gt;
ホールをつくってしまう」という&lt;br /&gt;
ことでしょうか。&lt;br /&gt;
&lt;br /&gt;
問題になるケースというのは、一見して&lt;br /&gt;
非常に安全に見える「文字コードを考慮した&lt;br /&gt;
エスケープをしてくれる関数」&lt;br /&gt;
（mysql_real_escape_stringやpg_escape_stringなどで&lt;br /&gt;
特に旧いバージョンのもの）を利用したけれども、&lt;br /&gt;
「SET NAMES」や「SET CLIENT ENCODING」&lt;br /&gt;
で文字コードを変更する&lt;br /&gt;
場合ということですよね。&lt;br /&gt;
&lt;br /&gt;
この場合には、例えば&lt;br /&gt;
mysql_real_escape_stringで考慮されている&lt;br /&gt;
文字コードと入ってくるデータが食い違って&lt;br /&gt;
しまって、エスケープの関数がざるになる&lt;br /&gt;
ケースがある。そして、「SET NAMES sjis」&lt;br /&gt;
した場合では問題の実例も報告されている。&lt;br /&gt;
&lt;br /&gt;
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;
例&lt;br /&gt;
－－－SET NAMES－－－&lt;br /&gt;
DB接続直後のデフォルト状態　&lt;br /&gt;
実際のコード　ujis、API想定コード ujis&lt;br /&gt;
↓&lt;br /&gt;
「SET NAMES sjis」を実行&lt;br /&gt;
実際のコード sjis、API想定コードujis&lt;br /&gt;
↓&lt;br /&gt;
エスケープ関数実行&lt;br /&gt;
入ってくるデータはsjisだが、ujisの基準で&lt;br /&gt;
エスケープ。結果、攻撃が可能に&lt;br /&gt;
&lt;br /&gt;
－－－APIで変更－－－&lt;br /&gt;
DB接続直後のデフォルト状態　&lt;br /&gt;
実際のコード　ujis、API想定コード ujis&lt;br /&gt;
↓&lt;br /&gt;
「mysql_set_charset(sjis)」を実行&lt;br /&gt;
実際のコード sjis、API想定コードsjis&lt;br /&gt;
↓&lt;br /&gt;
エスケープ関数実行&lt;br /&gt;
入ってくるデータはsjisで、sjisの基準で&lt;br /&gt;
エスケープ。（万々歳）&lt;br /&gt;
&lt;br /&gt;
（上のようなことを考えると例えば、&lt;br /&gt;
http://php.morva.net/manual/ja/function.mysql-set-charset.php&lt;br /&gt;
にあるJanez R.さんのような運用は、&lt;br /&gt;
問題がある。）&lt;br /&gt;
&lt;br /&gt;
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;
&lt;br /&gt;
ここで問題になってくるのが、mysql_set_charset&lt;br /&gt;
がPHPの5.2.3以降となっているところで、&lt;br /&gt;
これより旧いバージョンで運用している&lt;br /&gt;
ところが多い（pg_set_client_encodingは&lt;br /&gt;
結構古くからある）。&lt;br /&gt;
&lt;br /&gt;
ということで、仕方なく「SET NAMES」を使う&lt;br /&gt;
場合があるのですが、この場合には開発者間&lt;br /&gt;
できちんを申し合わせをしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
実際に問題のあるな実例が&lt;br /&gt;
確認されているのは、「SET NAMES sjis」あたり。&lt;br /&gt;
（http://wiki.postgresql.org/からすると、&lt;br /&gt;
utf8とかならば、安全でしょうか。）&lt;br /&gt;
&lt;br /&gt;
そして、&lt;br /&gt;
http://d.hatena.ne.jp/t_komura/20060122#1137944280&lt;br /&gt;
の対策は、SQLインジェクションは防げても、&lt;br /&gt;
登録データに変なものが入りやすくなってしまう。&lt;br /&gt;
&lt;br /&gt;
よって、登録されたデータを活用する際に&lt;br /&gt;
セキュリティーのための手間をかけなくては&lt;br /&gt;
ならないので、&lt;br /&gt;
可能であれば断然「APIで文字コード変更＋&lt;br /&gt;
APIでエスケープ」がよい。&lt;br /&gt;
&lt;br /&gt;
お話をまとめると、上のような感じでしょうか。</description>
			<content:encoded><![CDATA[色々とご教授をありがとうございます。<br />
<br />
私自身も論点をぶらすような投稿を<br />
少ししてしまったようなので、<br />
論点を整理すると、「SET NAMESは禁止」<br />
という論題で特に問題になるのはむしろ、<br />
「中途半端にAPIを利用して、セキュリティー<br />
ホールをつくってしまう」という<br />
ことでしょうか。<br />
<br />
問題になるケースというのは、一見して<br />
非常に安全に見える「文字コードを考慮した<br />
エスケープをしてくれる関数」<br />
（mysql_real_escape_stringやpg_escape_stringなどで<br />
特に旧いバージョンのもの）を利用したけれども、<br />
「SET NAMES」や「SET CLIENT ENCODING」<br />
で文字コードを変更する<br />
場合ということですよね。<br />
<br />
この場合には、例えば<br />
mysql_real_escape_stringで考慮されている<br />
文字コードと入ってくるデータが食い違って<br />
しまって、エスケープの関数がざるになる<br />
ケースがある。そして、「SET NAMES sjis」<br />
した場合では問題の実例も報告されている。<br />
<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
例<br />
－－－SET NAMES－－－<br />
DB接続直後のデフォルト状態　<br />
実際のコード　ujis、API想定コード ujis<br />
↓<br />
「SET NAMES sjis」を実行<br />
実際のコード sjis、API想定コードujis<br />
↓<br />
エスケープ関数実行<br />
入ってくるデータはsjisだが、ujisの基準で<br />
エスケープ。結果、攻撃が可能に<br />
<br />
－－－APIで変更－－－<br />
DB接続直後のデフォルト状態　<br />
実際のコード　ujis、API想定コード ujis<br />
↓<br />
「mysql_set_charset(sjis)」を実行<br />
実際のコード sjis、API想定コードsjis<br />
↓<br />
エスケープ関数実行<br />
入ってくるデータはsjisで、sjisの基準で<br />
エスケープ。（万々歳）<br />
<br />
（上のようなことを考えると例えば、<br />
http://php.morva.net/manual/ja/function.mysql-set-charset.php<br />
にあるJanez R.さんのような運用は、<br />
問題がある。）<br />
<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
<br />
ここで問題になってくるのが、mysql_set_charset<br />
がPHPの5.2.3以降となっているところで、<br />
これより旧いバージョンで運用している<br />
ところが多い（pg_set_client_encodingは<br />
結構古くからある）。<br />
<br />
ということで、仕方なく「SET NAMES」を使う<br />
場合があるのですが、この場合には開発者間<br />
できちんを申し合わせをしておく必要がある。<br />
<br />
実際に問題のあるな実例が<br />
確認されているのは、「SET NAMES sjis」あたり。<br />
（http://wiki.postgresql.org/からすると、<br />
utf8とかならば、安全でしょうか。）<br />
<br />
そして、<br />
http://d.hatena.ne.jp/t_komura/20060122#1137944280<br />
の対策は、SQLインジェクションは防げても、<br />
登録データに変なものが入りやすくなってしまう。<br />
<br />
よって、登録されたデータを活用する際に<br />
セキュリティーのための手間をかけなくては<br />
ならないので、<br />
可能であれば断然「APIで文字コード変更＋<br />
APIでエスケープ」がよい。<br />
<br />
お話をまとめると、上のような感じでしょうか。]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15178</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Sun, 11 May 2008 06:56:55 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15177@http://blog.ohgaki.net/</guid>
			<description>ところで文字エンコーディングベースの攻撃の根本的な対策は「アプリケーション」が全ての入力の文字エンコーディングが正しいかチェックする方法です。&lt;br /&gt;
&lt;br /&gt;
このエントリではデータベースとアプリケーションの間でのセキュリティ対策を解説しているので、&lt;br /&gt;
&lt;br /&gt;
- APIを利用して文字エンコーディングを設定&lt;br /&gt;
- APIを利用して文字列をエスケープ&lt;br /&gt;
&lt;br /&gt;
を対策として紹介しています。多重のセキュリティ対策の意味もあるので、全ての入力の文字エンコーディングをチェックしていてもデータベースとアプリケーション間でもこれらを使って処理すべきです。また条件によっては攻撃可能な状態も発生します。e.g. SJIS文字列をaddslashesでエスケープ&lt;br /&gt;
&lt;br /&gt;
全てのプログラマにどのような状態の時に攻撃可能となるか、解説してもらい、理解して、実践してもらうのは無理があります。&lt;br /&gt;
&lt;br /&gt;
最も確実かつ簡単な方法（APIを利用した文字エンコーディング設定とエスケープ。実装は簡単ではないかもしれませんが）を採用するのが一番良いと思います。</description>
			<content:encoded><![CDATA[ところで文字エンコーディングベースの攻撃の根本的な対策は「アプリケーション」が全ての入力の文字エンコーディングが正しいかチェックする方法です。<br />
<br />
このエントリではデータベースとアプリケーションの間でのセキュリティ対策を解説しているので、<br />
<br />
- APIを利用して文字エンコーディングを設定<br />
- APIを利用して文字列をエスケープ<br />
<br />
を対策として紹介しています。多重のセキュリティ対策の意味もあるので、全ての入力の文字エンコーディングをチェックしていてもデータベースとアプリケーション間でもこれらを使って処理すべきです。また条件によっては攻撃可能な状態も発生します。e.g. SJIS文字列をaddslashesでエスケープ<br />
<br />
全てのプログラマにどのような状態の時に攻撃可能となるか、解説してもらい、理解して、実践してもらうのは無理があります。<br />
<br />
最も確実かつ簡単な方法（APIを利用した文字エンコーディング設定とエスケープ。実装は簡単ではないかもしれませんが）を採用するのが一番良いと思います。]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15177</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Sun, 11 May 2008 06:48:47 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15176@http://blog.ohgaki.net/</guid>
			<description>既に必要十分な対策がある（APIを利用して文字エンコーディングを設定＆エスケープ）ので態々、回りくどい事を考えて安全でないかも知れない手法や対策でなく、このエントリで解説しているように&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- APIを利用して文字エンコーディングを設定&lt;br /&gt;
- APIを利用して文字列をエスケープ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
すれば良いだけです。もし、自分が使っている言語のライブラリにこれらの関数がないなら、セキュリティ上の脆弱性問題としてレポートして対処してもらうのが一番です。&lt;br /&gt;
&lt;br /&gt;</description>
			<content:encoded><![CDATA[既に必要十分な対策がある（APIを利用して文字エンコーディングを設定＆エスケープ）ので態々、回りくどい事を考えて安全でないかも知れない手法や対策でなく、このエントリで解説しているように<br />
<br />
<br />
- APIを利用して文字エンコーディングを設定<br />
- APIを利用して文字列をエスケープ<br />
<br />
<br />
すれば良いだけです。もし、自分が使っている言語のライブラリにこれらの関数がないなら、セキュリティ上の脆弱性問題としてレポートして対処してもらうのが一番です。<br />
<br />]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15176</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Sun, 11 May 2008 06:43:22 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15175@http://blog.ohgaki.net/</guid>
			<description>&gt; 新しく見つけたサイト&lt;br /&gt;
&gt; http://d.hatena.ne.jp/t_komura/20060122#1137944280&lt;br /&gt;
&gt; によると、むしろ「SET NAMES」を&lt;br /&gt;
&gt; 使用して、「SET NAMES binary」と設定&lt;br /&gt;
&gt; して、エスケープを必ず専用エスケープ&lt;br /&gt;
&gt; 関数（mysql_real_escape_stringなど）&lt;br /&gt;
&gt; で行うことで問題を回避する、&lt;br /&gt;
&gt; という手法があるそうです。&lt;br /&gt;
&lt;br /&gt;
これは対策になりません。不正な文字エンコーディングでもデータベースに登録できるようになるだけです。&lt;br /&gt;
&lt;br /&gt;
SQLインジェクションだけ防いでも意味が在りません。不正な文字エンコーディングはHTML/XML/JavaScriptインジェクション等にも利用できるからです。絶対にこのような運用はしてはなりません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
			<content:encoded><![CDATA[> 新しく見つけたサイト<br />
> http://d.hatena.ne.jp/t_komura/20060122#1137944280<br />
> によると、むしろ「SET NAMES」を<br />
> 使用して、「SET NAMES binary」と設定<br />
> して、エスケープを必ず専用エスケープ<br />
> 関数（mysql_real_escape_stringなど）<br />
> で行うことで問題を回避する、<br />
> という手法があるそうです。<br />
<br />
これは対策になりません。不正な文字エンコーディングでもデータベースに登録できるようになるだけです。<br />
<br />
SQLインジェクションだけ防いでも意味が在りません。不正な文字エンコーディングはHTML/XML/JavaScriptインジェクション等にも利用できるからです。絶対にこのような運用はしてはなりません。<br />
<br />
<br />]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15175</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Sat, 10 May 2008 17:11:38 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15174@http://blog.ohgaki.net/</guid>
			<description>Wikiが使えないようだったので以下の対策にてついてのコメントをしていませんでした。現在でもアクセスできないようですが&lt;br /&gt;
&lt;br /&gt;
1. pg_escape_string() (but look for a driver update soon)&lt;br /&gt;
2. PEAR-DB (safe against this exploit, but may be vulnerable to future issues as it uses ad-hoc escaping)&lt;br /&gt;
3. NOT PEAR-MDB2 (according to the PEAR development team, MDB2 is currently using a custom escape routine which is currently unsafe. Expect an update next week.)&lt;br /&gt;
4. PDO&lt;br /&gt;
5. If you're using magic_quotes_gpc, test using magic_quotes_sybase instead (and plan a refactor -- magic_quotes will not be in PHP 6.0)&lt;br /&gt;
&lt;br /&gt;
少なくとも、5の対策は対策と呼ぶには十分とは言えません。sybaseはSQL準拠のエスケープ方式だったのでaddslashesでも'は'', nullは¥nullにエスケープしています。しかし、文字エンコーディングを考慮していないので壊れた文字エンコーディングを作って攻撃する事も可能です。&lt;br /&gt;
# 対策済みのPostgreSQLならこのタイプの壊れた文字エンコーディング&lt;br /&gt;
# をすべて検出できるので、これでも大丈夫とも言えます。スラッシュ&lt;br /&gt;
# でエスケープする変わりに'でエスケープされる様になることは解説&lt;br /&gt;
# してあるのか気になっています。</description>
			<content:encoded><![CDATA[Wikiが使えないようだったので以下の対策にてついてのコメントをしていませんでした。現在でもアクセスできないようですが<br />
<br />
1. pg_escape_string() (but look for a driver update soon)<br />
2. PEAR-DB (safe against this exploit, but may be vulnerable to future issues as it uses ad-hoc escaping)<br />
3. NOT PEAR-MDB2 (according to the PEAR development team, MDB2 is currently using a custom escape routine which is currently unsafe. Expect an update next week.)<br />
4. PDO<br />
5. If you're using magic_quotes_gpc, test using magic_quotes_sybase instead (and plan a refactor -- magic_quotes will not be in PHP 6.0)<br />
<br />
少なくとも、5の対策は対策と呼ぶには十分とは言えません。sybaseはSQL準拠のエスケープ方式だったのでaddslashesでも'は'', nullは¥nullにエスケープしています。しかし、文字エンコーディングを考慮していないので壊れた文字エンコーディングを作って攻撃する事も可能です。<br />
# 対策済みのPostgreSQLならこのタイプの壊れた文字エンコーディング<br />
# をすべて検出できるので、これでも大丈夫とも言えます。スラッシュ<br />
# でエスケープする変わりに'でエスケープされる様になることは解説<br />
# してあるのか気になっています。]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15174</link>
		</item>
				<item>
			<title>amiba [訪問者] in response to: SET NAMESは禁止</title>
			<pubDate>Sat, 10 May 2008 04:15:17 +0000</pubDate>
			<dc:creator>amiba [訪問者]</dc:creator>
			<guid isPermaLink="false">c15173@http://blog.ohgaki.net/</guid>
			<description>ご返事を有難うございます。&lt;br /&gt;
&lt;br /&gt;
&gt;エスケープAPI (libmysql, libpqなど）が想定しているエンコーディング&lt;br /&gt;
&lt;br /&gt;
ということとの関連ですが、&lt;br /&gt;
新しく見つけたサイト&lt;br /&gt;
http://d.hatena.ne.jp/t_komura/20060122#1137944280&lt;br /&gt;
によると、むしろ「SET NAMES」を&lt;br /&gt;
使用して、「SET NAMES binary」と設定&lt;br /&gt;
して、エスケープを必ず専用エスケープ&lt;br /&gt;
関数（mysql_real_escape_stringなど）&lt;br /&gt;
で行うことで問題を回避する、&lt;br /&gt;
という手法があるそうです。&lt;br /&gt;
&lt;br /&gt;
上のような手法が有効なのはやはり、&lt;br /&gt;
binaryならば基本的にどんな状態の&lt;br /&gt;
APIでも想定しているから、&lt;br /&gt;
ということでしょうか？</description>
			<content:encoded><![CDATA[ご返事を有難うございます。<br />
<br />
>エスケープAPI (libmysql, libpqなど）が想定しているエンコーディング<br />
<br />
ということとの関連ですが、<br />
新しく見つけたサイト<br />
http://d.hatena.ne.jp/t_komura/20060122#1137944280<br />
によると、むしろ「SET NAMES」を<br />
使用して、「SET NAMES binary」と設定<br />
して、エスケープを必ず専用エスケープ<br />
関数（mysql_real_escape_stringなど）<br />
で行うことで問題を回避する、<br />
という手法があるそうです。<br />
<br />
上のような手法が有効なのはやはり、<br />
binaryならば基本的にどんな状態の<br />
APIでも想定しているから、<br />
ということでしょうか？]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15173</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Sat, 10 May 2008 03:09:21 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15172@http://blog.ohgaki.net/</guid>
			<description>APIを利用したデータベース接続は現在の文字エンコーディング設定を各接続情報としてメモリ内に保存しています。APIのエスケープ関数はこの情報をエスケープの際に利用します。&lt;br /&gt;
&lt;br /&gt;
SET NAMESによって文字エンコーディングを変更するとC言語などで書かれたエスケープAPI (libmysql, libpqなど）が想定しているエンコーディングと実際のエンコーディングが異なる状況が発生します。この違いにより、環境によっては文字エンコーディングを利用したSQLインジェクション攻撃が可能になります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
つまり、APIによって文字エンコーディング情報を変更しないと接続情報が更新されず、エスケープAPIを利用していても正しくエスケープできない場合発生する、ということです。&lt;br /&gt;
&lt;br /&gt;
SET NAMES, SET CLIENT ENCODINGを利用しないで、mysql_set_charset, pg_set_client_encodingを利用すれば、このような不整合が発生しないので問題も発生しなくなります。&lt;br /&gt;
&lt;br /&gt;
SET NAMES等を使っても安全な場合もあります。それは元々接続がSJISだった場合です。ISO8859-1だった物をSET NAMESでSJISに変更してしまうとmysql_real_escape_stringを利用していてもSQLイジェクションが可能になります。&lt;br /&gt;
&lt;br /&gt;
addslashesによるエスケープは論外です。絶対に行ってはなりません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
			<content:encoded><![CDATA[APIを利用したデータベース接続は現在の文字エンコーディング設定を各接続情報としてメモリ内に保存しています。APIのエスケープ関数はこの情報をエスケープの際に利用します。<br />
<br />
SET NAMESによって文字エンコーディングを変更するとC言語などで書かれたエスケープAPI (libmysql, libpqなど）が想定しているエンコーディングと実際のエンコーディングが異なる状況が発生します。この違いにより、環境によっては文字エンコーディングを利用したSQLインジェクション攻撃が可能になります。<br />
<br />
<br />
つまり、APIによって文字エンコーディング情報を変更しないと接続情報が更新されず、エスケープAPIを利用していても正しくエスケープできない場合発生する、ということです。<br />
<br />
SET NAMES, SET CLIENT ENCODINGを利用しないで、mysql_set_charset, pg_set_client_encodingを利用すれば、このような不整合が発生しないので問題も発生しなくなります。<br />
<br />
SET NAMES等を使っても安全な場合もあります。それは元々接続がSJISだった場合です。ISO8859-1だった物をSET NAMESでSJISに変更してしまうとmysql_real_escape_stringを利用していてもSQLイジェクションが可能になります。<br />
<br />
addslashesによるエスケープは論外です。絶対に行ってはなりません。<br />
<br />
<br />
<br />]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15172</link>
		</item>
				<item>
			<title>amiba [訪問者] in response to: SET NAMESは禁止</title>
			<pubDate>Fri, 09 May 2008 08:16:06 +0000</pubDate>
			<dc:creator>amiba [訪問者]</dc:creator>
			<guid isPermaLink="false">c15171@http://blog.ohgaki.net/</guid>
			<description>有益な情報を有難うございます。&lt;br /&gt;
&lt;br /&gt;
実は、Xoopsのモジュールを作成していて、&lt;br /&gt;
文字コードを「SET NAMES」で指定したい&lt;br /&gt;
場面が生じてしまいました。&lt;br /&gt;
&lt;br /&gt;
そこでもう少し詳しく確認したいのですが、&lt;br /&gt;
よろしいでしょうか。&lt;br /&gt;
&lt;br /&gt;
ご指定のサイト&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.50&lt;br /&gt;
にアクセスしたところ、&lt;br /&gt;
http://wiki.postgresql.org/wiki/Main_Page&lt;br /&gt;
に飛んでしまいました。&lt;br /&gt;
&lt;br /&gt;
そこで、問題の「SET CLIENT_ENCODING」で&lt;br /&gt;
検索したところ、それらしい記事では&lt;br /&gt;
「SET NAMES」とかによる文字コードの設定&lt;br /&gt;
というよりも、「SJIS, BIG5, GBK, GB18030,UHC」&lt;br /&gt;
とかでのエスケープ処理の問題ばかりが&lt;br /&gt;
でてきました。&lt;br /&gt;
&lt;br /&gt;
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_Technical_Info&lt;br /&gt;
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_User%27s_Guide&lt;br /&gt;
&lt;br /&gt;
そして同様の検索ででてきたFAQ&lt;br /&gt;
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_FAQ&lt;br /&gt;
では、正規表現やaddslashes()やmagic_quotesで&lt;br /&gt;
エスケープしても、問題がでてくる、と書いてありました。&lt;br /&gt;
そして解決法として、&lt;br /&gt;
&lt;br /&gt;
1. pg_escape_string() (but look for a driver update soon) &lt;br /&gt;
2. PEAR-DB (safe against this exploit, but may be vulnerable to future issues as it uses ad-hoc escaping) &lt;br /&gt;
3. NOT PEAR-MDB2 (according to the PEAR development team, MDB2 is currently using a custom escape routine which is currently unsafe. Expect an update next week.) &lt;br /&gt;
4. PDO &lt;br /&gt;
5. If you're using magic_quotes_gpc, test using magic_quotes_sybase instead (and plan a refactor -- magic_quotes will not be in PHP 6.0) &lt;br /&gt;
&lt;br /&gt;
が挙げられていて、新しいものならば&lt;br /&gt;
pg_escape_string() で処理しても&lt;br /&gt;
よさそうに読めてしまうのですが・・・。&lt;br /&gt;
&lt;br /&gt;
ですので、yohgakiさんのおっしゃる&lt;br /&gt;
「SET NAMESは禁止」というのは、「一人の&lt;br /&gt;
開発者がaddslashesとかで&lt;br /&gt;
エスケープ処理をしている場合、&lt;br /&gt;
別の開発者が知らないところで、&lt;br /&gt;
「SET NAMES」を使ってSJISとか問題のある&lt;br /&gt;
文字コードに変更するロジックを入れてしまう際に&lt;br /&gt;
問題が生じるので、「SET NAMES」の&lt;br /&gt;
利用には注意すること」と&lt;br /&gt;
いうことで、よろしいでしょうか。&lt;br /&gt;
&lt;br /&gt;
また、上でも書きましたとおり、Xoopsですので&lt;br /&gt;
MySQLなのですが、mysql_real_escape_stringは、&lt;br /&gt;
エンコーディングを考慮したエスケープを&lt;br /&gt;
してくれるそうなのですが、これを&lt;br /&gt;
大丈夫ということで、よろしいでしょうか。</description>
			<content:encoded><![CDATA[有益な情報を有難うございます。<br />
<br />
実は、Xoopsのモジュールを作成していて、<br />
文字コードを「SET NAMES」で指定したい<br />
場面が生じてしまいました。<br />
<br />
そこでもう少し詳しく確認したいのですが、<br />
よろしいでしょうか。<br />
<br />
ご指定のサイト<br />
http://www.postgresql.org/docs/techdocs.50<br />
にアクセスしたところ、<br />
http://wiki.postgresql.org/wiki/Main_Page<br />
に飛んでしまいました。<br />
<br />
そこで、問題の「SET CLIENT_ENCODING」で<br />
検索したところ、それらしい記事では<br />
「SET NAMES」とかによる文字コードの設定<br />
というよりも、「SJIS, BIG5, GBK, GB18030,UHC」<br />
とかでのエスケープ処理の問題ばかりが<br />
でてきました。<br />
<br />
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_Technical_Info<br />
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_User%27s_Guide<br />
<br />
そして同様の検索ででてきたFAQ<br />
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_FAQ<br />
では、正規表現やaddslashes()やmagic_quotesで<br />
エスケープしても、問題がでてくる、と書いてありました。<br />
そして解決法として、<br />
<br />
1. pg_escape_string() (but look for a driver update soon) <br />
2. PEAR-DB (safe against this exploit, but may be vulnerable to future issues as it uses ad-hoc escaping) <br />
3. NOT PEAR-MDB2 (according to the PEAR development team, MDB2 is currently using a custom escape routine which is currently unsafe. Expect an update next week.) <br />
4. PDO <br />
5. If you're using magic_quotes_gpc, test using magic_quotes_sybase instead (and plan a refactor -- magic_quotes will not be in PHP 6.0) <br />
<br />
が挙げられていて、新しいものならば<br />
pg_escape_string() で処理しても<br />
よさそうに読めてしまうのですが・・・。<br />
<br />
ですので、yohgakiさんのおっしゃる<br />
「SET NAMESは禁止」というのは、「一人の<br />
開発者がaddslashesとかで<br />
エスケープ処理をしている場合、<br />
別の開発者が知らないところで、<br />
「SET NAMES」を使ってSJISとか問題のある<br />
文字コードに変更するロジックを入れてしまう際に<br />
問題が生じるので、「SET NAMES」の<br />
利用には注意すること」と<br />
いうことで、よろしいでしょうか。<br />
<br />
また、上でも書きましたとおり、Xoopsですので<br />
MySQLなのですが、mysql_real_escape_stringは、<br />
エンコーディングを考慮したエスケープを<br />
してくれるそうなのですが、これを<br />
大丈夫ということで、よろしいでしょうか。]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15171</link>
		</item>
				<item>
			<title>Yasuo Ohgaki [メンバー] in response to: SET NAMESは禁止</title>
			<pubDate>Sun, 04 Nov 2007 03:24:42 +0000</pubDate>
			<dc:creator>Yasuo Ohgaki [メンバー]</dc:creator>
			<guid isPermaLink="false">c15095@http://blog.ohgaki.net/</guid>
			<description>&gt; 禁止すべきであるという、テストケースを書いてください。&lt;br /&gt;
&lt;br /&gt;
私が書くまでもなく探せば見つかると思いますが、参考になるURLとしては&lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.50&lt;br /&gt;
&lt;br /&gt;
などがあります。PostgreSQLの文書ですがMySQLでも同じです。MySQLの接続構造体にもencodingを保持するメンバがあり、PostgreSQLの文字エンコーディング設定/エスケープAPIで同じような使われ方としています。&lt;br /&gt;
&lt;br /&gt;
テストケースは私もセミナーで話をした事があるので私のスライドも見つかるかも知れませんが上記のURLの方が詳しく解説しているハズなので参考になると思います。&lt;br /&gt;
 </description>
			<content:encoded><![CDATA[> 禁止すべきであるという、テストケースを書いてください。<br />
<br />
私が書くまでもなく探せば見つかると思いますが、参考になるURLとしては<br />
<br />
http://www.postgresql.org/docs/techdocs.50<br />
<br />
などがあります。PostgreSQLの文書ですがMySQLでも同じです。MySQLの接続構造体にもencodingを保持するメンバがあり、PostgreSQLの文字エンコーディング設定/エスケープAPIで同じような使われ方としています。<br />
<br />
テストケースは私もセミナーで話をした事があるので私のスライドも見つかるかも知れませんが上記のURLの方が詳しく解説しているハズなので参考になると思います。<br />
 ]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15095</link>
		</item>
				<item>
			<title>名無し [訪問者] in response to: SET NAMESは禁止</title>
			<pubDate>Fri, 02 Nov 2007 08:30:15 +0000</pubDate>
			<dc:creator>名無し [訪問者]</dc:creator>
			<guid isPermaLink="false">c15094@http://blog.ohgaki.net/</guid>
			<description>禁止すべきであるという、テストケースを書いてください。</description>
			<content:encoded><![CDATA[禁止すべきであるという、テストケースを書いてください。]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15094</link>
		</item>
				<item>
			<title>Tietew [訪問者] in response to: SET NAMESは禁止</title>
			<pubDate>Fri, 31 Aug 2007 02:10:07 +0000</pubDate>
			<dc:creator>Tietew [訪問者]</dc:creator>
			<guid isPermaLink="false">c15048@http://blog.ohgaki.net/</guid>
			<description>&gt; （PostgreSQLも同様のSQL文、SET CLIENT_ENCODINGがあります）この機能はSQLコンソールからは使ってよい機能ですが、&lt;br /&gt;
PostgreSQL でも 7.3 までは psql で使ってはいけないコマンドでした。代わりに psql の \encoding ディレクティブを使います。&lt;br /&gt;
7.4 からは SET CLIENT_ENCODING を psql が認識して内部エンコーディングを変更するようになりました。</description>
			<content:encoded><![CDATA[> （PostgreSQLも同様のSQL文、SET CLIENT_ENCODINGがあります）この機能はSQLコンソールからは使ってよい機能ですが、<br />
PostgreSQL でも 7.3 までは psql で使ってはいけないコマンドでした。代わりに psql の \encoding ディレクティブを使います。<br />
7.4 からは SET CLIENT_ENCODING を psql が認識して内部エンコーディングを変更するようになりました。]]></content:encoded>
			<link>http://blog.ohgaki.net/set_namesa_mcb_asc#c15048</link>
		</item>
			</channel>
</rss>
