

# 前提

google AMPページの対応をしています。  
ヘッダに直書きするstyle amp-customを  
sassファイルから自動的にcssファイルを生成している状況で  
gulpにて書き込むか、phpのfile_get_contentsで  
読み込むか、wordpressのwp_remote_getで  
読み込むかというところで迷っています。

* * *

# 迷いが生じた背景

file_get_contentsがセキュリティ脆弱性原因になる場合がある  
という記事を見たことがあるのでセキュアに使うにはどうすればいいかと  
調べていて不明点が出てきました。

* * *

# 疑問点

1．ある書籍にfile_get_contentsをセキュアに使うサンプルが載っていました。

[code]

    $clean = array();
    $html = array();
    
    /*入力($_GET['filename'])をフィルタする*/
    
    $contents = file_get_contents($clean['filename']);
    
    /*入力($contents)をフィルタする */
    
    $html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8');
    echo $html['contents'];
    
[/code]

上記のコメントアウトの部分の意味が解りませんでした。  
4行目の$contents = file_get_contents($clean['filename']);は  
元々$contents = file_get_contents($_GET['filename']);だったものを  
セキュアに変更したという内容なのですがなぜarray()経由で  
読み込むとセキュアになるのでしょうか。  
それとも「入力($_GET['filename'])をフィルタする処理をここに書く」という  
意味のコメントアウトなのでしょうか。  
5行目のコメントアウトも同様に意味が解りませんでした。

2．今回は同サーバ上（同じドメイン）で管理者自らが生成しているファイルを  
読み込むという状況なのですが、こういった状況でも  
file_get_contents、wp_remote_getをサーバ上で動かすことで  
考えられるリスクはあるのでしょうか。

3．色々なサーバを触っている方がいらっしゃいましたら伺いたいです。  
サーバによってはfile_get_contentsが使えないというところもあるようですが  
file_get_contentsが使えないところと使えるところで比べた場合どちらが多いでしょうか。

* * *

# ご指摘アドバイスいただけましたら幸いです。

上記状況を整理してみました。  
【gulpメリット】  
・セキュリティリスクの心配がほぼなくなる。  
・サーバ上でプログラムが作動しないのでサーバ負荷がわずかに減らせる。

【gulpデメリット】  
・サイトごとにgulpタスクを構築（コピー）しなければならない。

【phpメリット】  
・ソース管理が楽。

【phpデメリット】  
・セキュリティに考慮してソースを書かなければならない  
・サーバに少しだけ負荷がかかる。

今回のサイトは小規模コーポレートサイトで  
サーバ移転が発生することも考えられるため  
gulpで対応することも考えていますが  
皆様でしたらどのような判断をするか  
また似たような体験談がありましたら  
是非参考にさせていただきたいです。


CC BY-SA 3.0
2017-05-06T04:51:51.717
34479
2017-05-07T05:54:35.747
2020-06-17T08:14:45.997
-1
19992
question
php wordpress security gulp
file_get_contents、wp_remote_getのリスクについて


問題となるphp file_get_contents()の脆弱性が
ディレクトリ・トラバーサルなら、外部から指定されるファイル名を使用せずに処理を書けばセキュリティに考慮する必要はありません。

wordpressのslugなどを元にしたファイル名でfile_get_contents読み込を行うかrequireを使用するのが、良いのではと思います。

疑問点ですが  
1\. $cleanは、サイタイズ処理ではないかと思います。サイタイズしたいならhtmlspecialchars()を使うと良いでしょう

2.外部から指定されるファイル名は（$_GET、$_PUTからのファイル名）
意図しないパスを指定されるかもしれません。（軽い気持ちで使用したwordpressのプラグインに脆弱性が有こともあります。）

3.file_get_contentsは、ほぼ全てのサーバで使えると思います。ただし、HTTP経由でfileを読み出すことを制限しているサーバ（phpオプションを変更できない）が時々あります。


CC BY-SA 3.0
2017-05-07T05:54:35.747
34505
2017-05-07T05:54:35.747
22793
34479
answer