アカウント名:
パスワード:
二十年ぐらい前からSQLインジェクションやhtmlでのscripインジェクションなどが話題になってて入力文字列をそのままシステムで扱うのは禁止って初歩的な常識ができている。それなのにいまだにたびたびこういう問題が、しかも大企業のシステムで出てくるのは不思議でならない。わざと穴を作っていつでも侵入できるようにしてるとか陰謀論を考えたくなる。
型指定とか暗黙の型変換とかプログラム言語的な問題でしょ。
'true' という文字列だけを true に変換してしまうならそうかもだけど、暗黙の型変換のある言語でも大抵は、空文字列 => false, 空でない文字列 => trueの変換じゃない? そう考えると原因は違うところにあるような気がする。
Perlだと、空文字列、文字列の「0」、数値の「0」は「偽」と扱われる。なので、入力がなかったらエラーにしようと思ってif (!$param{"Nickname"}) { &error("ニックネームがありません。") }などとやると「0」を入力すると、入力があるのに、無い旨のエラーメッセージが表示されるというバグを作り込むことになる。
ただ、昔から知られたバグだけどね。
そういう誤った処理を防ぐために標準で汚染チェックモードを備えていて外部由来の入力文字列からは正規表現を使って取り出されるべき値を取り出せ!
っていう言語仕様なってるのに
かもだけど、
どこの方言ですか?
そういうのはソースコードに直接文字を書き込むときにしか起きないから、適当なエンコードかけておくだけで起きない問題だし意図しない変換がおきないようにそれをしておくのが普通だよ。
暗黙の型変換は普通変数内の値に対して起こるものだからソースコードに直接文字を書き込むときに起きるわけではないし、文字列変数内部の値をわざわざエンコードかけて保持しておくなんてめったにしないよ。じゃないと文字列操作や検索が面倒になる。
型変換は普通変数内の値に対して起きるのではなく、変数に文字列を代入するときに起きる(どちらも同じようだけどまったく違い)。ソースコードは文字列だから代入される値も文字列で型変換が起きる。jsonへの書き出しなども同じ。エンコードは、文字列を代入するときに起きるから文字列をエンコードかけて代入時に変換されないようにしてしまう。変数内では型変換が起きないから一度読み込んだ後はデコードして扱う(エンコード値を保持するわけではない)。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
吾輩はリファレンスである。名前はまだ無い -- perlの中の人
どうしてこんな問題が起きるんだろう (スコア:0)
二十年ぐらい前からSQLインジェクションやhtmlでのscripインジェクションなどが話題になってて入力文字列をそのままシステムで扱うのは禁止って初歩的な常識ができている。
それなのにいまだにたびたびこういう問題が、しかも大企業のシステムで出てくるのは不思議でならない。
わざと穴を作っていつでも侵入できるようにしてるとか陰謀論を考えたくなる。
Re:どうしてこんな問題が起きるんだろう (スコア:0)
型指定とか暗黙の型変換とかプログラム言語的な問題でしょ。
Re: (スコア:0)
'true' という文字列だけを true に変換してしまうならそうかもだけど、
暗黙の型変換のある言語でも大抵は、空文字列 => false, 空でない文字列 => true
の変換じゃない? そう考えると原因は違うところにあるような気がする。
Re: (スコア:0)
Perlだと、空文字列、文字列の「0」、数値の「0」は「偽」と扱われる。
なので、入力がなかったらエラーにしようと思って
if (!$param{"Nickname"}) { &error("ニックネームがありません。") }
などとやると「0」を入力すると、入力があるのに、無い旨のエラーメッセージが表示されるというバグを作り込むことになる。
ただ、昔から知られたバグだけどね。
Re: (スコア:0)
そういう誤った処理を防ぐために標準で汚染チェックモードを備えていて
外部由来の入力文字列からは正規表現を使って取り出されるべき値を取り出せ!
っていう言語仕様なってるのに
Re: (スコア:0)
どこの方言ですか?
Re:どうしてこんな問題が起きるんだろう (スコア:1)
Re: (スコア:0)
そういうのはソースコードに直接文字を書き込むときにしか起きないから、適当なエンコードかけておくだけで起きない問題だし意図しない変換がおきないようにそれをしておくのが普通だよ。
Re: (スコア:0)
暗黙の型変換は普通変数内の値に対して起こるものだからソースコードに直接文字を書き込むときに起きるわけではないし、
文字列変数内部の値をわざわざエンコードかけて保持しておくなんてめったにしないよ。じゃないと文字列操作や検索が面倒になる。
Re: (スコア:0)
型変換は普通変数内の値に対して起きるのではなく、変数に文字列を代入するときに起きる(どちらも同じようだけどまったく違い)。ソースコードは文字列だから代入される値も文字列で型変換が起きる。jsonへの書き出しなども同じ。
エンコードは、文字列を代入するときに起きるから文字列をエンコードかけて代入時に変換されないようにしてしまう。変数内では型変換が起きないから一度読み込んだ後はデコードして扱う(エンコード値を保持するわけではない)。