- ベストアンサー
inputタグに入力された数値を安全にするには?
- inputタグに入力された数値や数式を安全に処理する方法を教えてください。
- 悪意のあるコードを防ぐために、入力情報をチェックする仕組みを実装する必要があります。
- ウイルスなどの被害を防ぐためには、信頼できる入力情報のみを正しく処理する必要があります。
- みんなの回答 (34)
- 専門家の回答
質問者が選んだベストアンサー
>回答No.32 amanojaku1 訂正です、括弧に対応していませんでした。 正規表現は下記の方が適切です。 超簡易式の処理です、要点は(式として成立しているかではなく)コマンドが実行されないようになっているか?、が重要です。 (断定はできませんが)これならJavaScriptのマクロのような構文も実行できないと思われます。 JavaScriptのマクロのような構文については分かりませんので、別の質問にしてみたら どうでしょうか? 「四則演算子、数字、括弧」以外は削除されます。<br> また式として成立しない文字列は計算できません。<br> <input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> <script type="text/javascript"> <!-- function Calculator(a, kcode){ var r; if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 r = a; r = r.replace(/[ ]*([\-\/\*\+])[ \-\/\*\+]*/g, '$1'); r = r.replace(/^([ ]*[\/\*\+][ \-\/\*\+]*)/g, ''); r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([ ]+)/g, ' '); try{ alert(r+' = '+eval(r)); }catch(ex){ alert(ex.message+' : '+r); } } // --> </script>
その他の回答 (33)
- amanojaku1
- ベストアンサー率54% (265/488)
>evalを使って、自由に入力した計算式を起算するJSを作ったのですがこれがJSのみでも危険という事でしょうか? >inputに<script>alert('aaa');</script>と入れても何も実行されませんでしたので問題ないでしょうか? 「<script>alert('aaa');</script>」ではなく「alert('aaa');」で試してみて下さい。 >もし問題があればアラートがでるのですよね? evalでググると「ソースコードを動的に実行できる」と出てきます。 >この部分だけは公開と取りやめないとボットにやられるでしょうか? ボットがとかではなく、ユーザー(人間)に悪意かあったらどうするんでしょうか?、と言う事です。
- amanojaku1
- ベストアンサー率54% (265/488)
>1日に発見される新しいマルウェアは35万件 >https://the01.jp/p0005584/ とは言っても、当方も長年 無料HPなどにサイトをアップしていますが、まだマルウェア(悪意のあるコード)を仕込まれたことはありません。 マイナーなサイトなら、あまり気にしなくて良いかと…。
- amanojaku1
- ベストアンサー率54% (265/488)
>>ユーザー入力を直接的にJSのコードとして利用する >これは絶対に やってはイケナイ事です。 >ユーザーが悪意のあるコードを入力したらどうするんでしょうか? ボットがとかではなく、ユーザー(人間)に悪意かあったらどうするんでしょうか?、と言う事です。
お礼
下記にある通りという認識でよいということですかね? https://sp.okwave.jp/qa/q4957775.html?a_open=true javascriptはクライアント側のブラウザーで実行されているものであり、そもそもローカルなリソースにはアクセス出来ないし、ましてサーバー側に影響を及ぼすようなjavascriptとはどんなものなのでしょうか? クッキーを盗むといっても、本人のクッキーを盗んでも仕方ないし、他人のクッキーはみれないでしょう。XMLHttpRequestで他のサイトにポストするコードを実行されても、サーバー側で困る事はないと思うのですが。 つまりサーバサイドのファイルをいじれないのでサイトにウイルスを仕込まれるやクラッキングされる事はないのですね XSSというのはサイトへの攻撃というよりは 他のユーザーへの攻撃になります XSSによる被害はサイトよりは 主にユーザーに及びます と聞いたのですが 他の閲覧者のクッキーが盗まれたり、ウイルスサイトに誘導されたりするリスクがあるのですかね? ただサーバサイドのjsかhtmlを改ざんしないと無理ではないのですか? 他の閲覧者のhtmlとjsはいじれないし
- amanojaku1
- ベストアンサー率54% (265/488)
訂正です >ああevalで「数値や数式を計算する」程度なら、通常 問題ないハズなのですが evalは数式だけだと思ってましたが、通常のコードも実行できるようですm(_ _)m
- amanojaku1
- ベストアンサー率54% (265/488)
>https://okwave.jp/qa/q9366264_2.html?by=agree#a_area > >>ユーザー入力を直接的にJSのコードとして利用する > >これは絶対に やってはイケナイ事です。 >ユーザーが悪意のあるコードを入力したらどうするんでしょうか? ああevalで「数値や数式を計算する」程度なら、通常 問題ないハズなのですが、ブラウザにセキュリティホールが存在する可能性があり、evalに悪意のあるコードを入力して異常な動作が引き起こされる可能性を考慮した方が良いでしょう。 どこかにセキュリティホールは必ずあると考えて下さい。
お礼
function escapeHtml(str) { str = str.replace(/&/g, '&'); str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); str = str.replace(/"/g, '"'); str = str.replace(/'/g, '''); return str; } このようにエスケープしておけば大丈夫ですか? これを自由に計算ができるソースの前で実行すればよいのでしょうか ただこれだと無限にあるのでできればこの文字記号だけ許可するとしたいです
補足
下記を参考に、これしか入力できないすればevalを使って計算する入力欄も作って大丈夫と教えていただいたのですが、 具体的な作り方が難しくてわかりません。 >>> /^[\d\+\-\*\/\(\)]+$/ 単純に+-*/()と数字以外受け付けないならこんな感じでしょうが しかしこれでは数式として正しいかは判定できません /^([0-9]+[\+\-\*\/])+[0-9]$/ 四則演算のみカッコとかもなしって感じならこんな正規表現になるでしょうか カッコなしも許容しつつそれぞれのカッコが入れ子のものを含めて ちゃんと閉じられているかというのを 正規表現で書くと結構長くなりそうなので割愛します <>^&|とかのビット演算子は許容していいもんなのかちょっと判断しかねます アルファベットはないとは言っても剰余演算子%も許容していいのか微妙です
- amanojaku1
- ベストアンサー率54% (265/488)
https://okwave.jp/qa/q9366264_2.html?by=agree#a_area >ユーザー入力を直接的にJSのコードとして利用する これは絶対に やってはイケナイ事です。 ユーザーが悪意のあるコードを入力したらどうするんでしょうか? >jsのみでも危ない? 全く関係ありません。 例えばサーバーに下記のようなページがアップされていたとします。 <html> <body> 私はPiyoです。<br> </body> </html> ハッカーがサーバーをハッキングし、上記のソースを改ざんし、下記のように【マルウェア(悪意のあるコード)】を仕込んでも、(表示とか動作とかがオカシイと変だと感づかれる場合があるので)表示とか動作とかは(基本的に)正常のように振舞います。 マルウェア(悪意のあるコード)には、当然JavaScriptなども使われます。 <html> 【マルウェア(悪意のあるコード)】 <body> 私はPiyoです。<br> </body> </html>
お礼
evalを使って、自由に入力した計算式を起算するJSを作ったのですがこれがJSのみでも危険という事でしょうか? inputに<script>alert('aaa');</script>と入れても何も実行されませんでしたので問題ないでしょうか? もし問題があればアラートがでるのですよね? この部分だけは公開と取りやめないとボットにやられるでしょうか?
補足
ただJSはサーバにあるjsを実行しているのではなく、あくまでローカルにダウンロードしたJSを実行しているのに、なぜサイトが改ざんされる可能性があるのですか? 改ざんできてもそれは閲覧者さんダウンロードしたファイルなのでサーバ上のファイルは一切影響を受けないと思うのですが
- amanojaku1
- ベストアンサー率54% (265/488)
1日に発見される新しいマルウェアは35万件 https://the01.jp/p0005584/
- amanojaku1
- ベストアンサー率54% (265/488)
>>自分のサイトにウイルスが仕込まれていたり、する可能性が既に0ではないのですか? >基本的にメジャーなサイトが標的にされますね。 Facebookメッセンジャーを介して拡散するマルウェア発見 http://news.mynavi.jp/news/2017/08/25/179/
補足
jsのみでも危ない?
- Proof4
- ベストアンサー率78% (151/192)
'悪意のあるコードを入れられるとサイトがクラッキングされて、ウイルスが仕込まれる危険性が'あるとお聞きしたとのことですが、おそらくそれはXSS(クロスサイトスクリプティング)のことを指すと思われます。 XSSは動的なWebページにおいて発生する脆弱性です。過去にもTwitterにXSS脆弱性があると話題になったことがありました。 さて、質問者様の場合ですが入力値の処理にサーバーサイドプログラム(サーバー上で動作するプログラム)を使用していなければ問題はないように思います。 Javascriptはクライアントサイドで動作し、サーバーにデータを保存するといったことができません。そのため、サイト上におけるJavascriptの処理によってほかのユーザーが被害を受けるというのは考えられないです。 プログラムが正常に動作するのなら現行のままでも危険性はないでしょう。ただ、入力されたものが期待されるものなのかの検証は実装したほうがよろしいかと思います。プログラムのエラー減少につながります。
お礼
phpなどが絡んでいないJS単体ならevalを使ってもクロス再度スクリプティングの問題は起きないといってよいのですね。 それならフロントJSのみの場合は特に考えずに使って問題ないのですね。
- amanojaku1
- ベストアンサー率54% (265/488)
>回答No.3 amanojaku1 >>自分のサイトにウイルスが仕込まれていたり、する可能性が既に0ではないのですか? >基本的にメジャーなサイトが標的にされますね。 >マイナーなサイトのページにマルウェア(悪意のあるコード)が仕込まれたと言う話は聞いた事はありませんが、無いとも言い切れないかもしれません。 当方も無料HPなどにサイトをアップしていますが、まだマルウェア(悪意のあるコード)が仕込まれたことはありません。 >それであれば確認する必要があるのです 何か無料のアンチウイルス・ソフトを入れてみては? 当方は「avira antivirus free」を入れてますが、マルウェア(悪意のあるコード)が仕込まれたページを開くとブロックして悪意のあるコードが どうとかみたいなメッセージを表示してくれます。
お礼
https://okwave.jp/qa/q9366264_2.html?by=agree#a_area こちらでinputの入力内容をJSに渡して処理する場合、エスケープしないとevalを使っているとなおさらの事危険性があるといわれたので、そう思ったのですが、全く心配しないで公開しても大丈夫なのでしょうか?
お礼
確かにalert('aaa');で実行できたのでこの部分だけ明日コメントアウトしておきます。 ただ先程も言った通りダウンロードしたjsでクラッカーが危険なソースを記載してもクラッカーのpcで実行されるので自分がやられるだけでわないのですか