<?xml version="1.0" encoding="UTF-8" ?>
<rss version="0.91">
  <channel>
    <title>安全でないPHPプログラムの作り方</title>
    <description>Insecure PHP Programming</description>
    <link>https://insecurephp.blog.shinobi.jp/</link>
    <language>ja</language>
    <copyright>Copyright (C) NINJATOOLS ALL RIGHTS RESERVED.</copyright>

    <item>
      <title>ログインフォームの脆弱性(4)</title>
      <description>&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; の解説です。ソースコードをまだ見られていない方は、まず、&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; をご覧ください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
この脆弱性を取り除くには、&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER['PHP_SELF']; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
の部分は、以下のようにするのがよいと思います。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
あるいは、$_SERVER['PHP_SELF'] を &lt;a href=&quot;http://www.php.net/manual/ja/function.htmlspecialchars.php&quot;&gt;htmlspecialchars()&lt;/a&gt; でエスケープ処理する方法もあるかと思います。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;&amp;lt;?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
また、以下のユーザ名の入力値を表示する部分は、&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&amp;lt;?php echo $_POST['username']; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下のように、&lt;a href=&quot;http://www.php.net/manual/ja/function.htmlspecialchars.php&quot;&gt;htmlspecialchars()&lt;/a&gt; でエスケープ処理します。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&amp;lt;?php echo htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.php.net/manual/ja/function.htmlspecialchars.php&quot;&gt;htmlspecialchars()&lt;/a&gt; でエスケープ処理する場合は、必ず、第2引数に ENT_QUOTES を指定しましょう。デフォルトでは、シングルクオート(')がエスケープされませんので、シングルクオートでインジェクションできるケースでは脆弱性が残る可能性があります。&lt;br /&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7-4-</link> 
    </item>
    <item>
      <title>このブログの目的</title>
      <description>このブログの目的は、意識的に、自由自在に、効率的に、安全でない(脆弱性のある) PHPプログラムを作成できるようになることです。

無意識に脆弱性のあるプログラムを作るという状態がなくなることを目指しています。意識的に脆弱性を入れられるようになれば、今までと同じ作業時間でも多くの脆弱性を作れるようになるでしょう。

そのような状態になれれば、脆弱性は、すべて意識されたものとなります。もし望むなら、脆弱性のない安全なプログラムを作ることもできるでしょう。そんなことを望む人がいるかどうかはわかりませんが。(笑)

ただし、そのような状態になるのは、正直言って簡単ではありません。
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E3%81%93%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/%E3%81%93%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E7%9B%AE%E7%9A%84</link> 
    </item>
    <item>
      <title>ログインフォームの脆弱性(3)</title>
      <description>&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; の解説です。ソースコードをまだ見られていない方は、まず、&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; をご覧ください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
補足ですが、コメントにあったように URL を&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;http://localhost/this.php?username=%22%3E%3Cscript%20type=&lt;br /&gt;
%22text/javascript%22%3Ealert('xss')%3C/script%3E%3Ca%20name=%22a&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
のように入力したとしても、このログインフォームでは、クロスサイトスクリプティングはできません。実際にそのように入力しても警告は表示されません。&lt;br /&gt;
&lt;br /&gt;
これは、username の表示に、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;$_POST['username']&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
と $_POST を使っているために、GETリクエストで値を送信しても無視されるためです。これを上記のように GET でも攻撃可能にするには、$_POST を $_REQUEST に変更すれば ok です。具体的には、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;ユーザ名: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&amp;lt;?php echo &lt;span style=&quot;color:#FF0000&quot;&gt;$_REQUEST['username']&lt;/span&gt;; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
です。&lt;br /&gt;
&lt;br /&gt;
こうすれば、inputタグは、以下のようになり、スクリプトが実行可能になります。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&lt;span style=&quot;color:#FF0000&quot;&gt;&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;alert('xss')&amp;lt;/script&amp;gt;&amp;lt;a name=&amp;quot;a&lt;/span&gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/15/&quot;&gt;ログインフォームの脆弱性(4)&lt;/a&gt; へ続く。&lt;br /&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7-3-</link> 
    </item>
    <item>
      <title>コメントのタイトル</title>
      <description>いろいろコメントが付くようになったのですが、このブログサービスでは、コメントを記入されるとき、タイトルを入れないと「無題」と付くようです。

ということで、タイトルを入れないと全部「無題」で新しいコメントかどうかの区別が付きにくいです。

コメントをご記入の場合は、できるだけ何かタイトルを入れるようにお願いします。
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E9%9B%91%E8%AB%87/%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB</link> 
    </item>
    <item>
      <title>脆弱性のあるコマンド実行</title>
      <description>exec()関数で、外部コマンドを実行しています。OSコマンドインジェクションを防ぐために「&quot;」をエスケープしています。
&lt;br&gt;&lt;br&gt;
どこが脆弱でしょうか？
&lt;br&gt;&lt;br&gt;

&lt;textarea cols=&quot;60&quot; rows=&quot;8&quot; class=&quot;prettyprint&quot;&gt;
&lt;?php

$cmd = '/usr/bin/wget';

$URI = 'http://' . $_GET['url'];
$safer_URI = strtr($URI, &quot;\&quot;&quot;, &quot; &quot;);
exec($cmd . &quot; \&quot;&quot; . $safer_URI . &quot;\&quot;&quot;, $results, $return);
&lt;/textarea&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89/%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C</link> 
    </item>
    <item>
      <title>ログインフォームの脆弱性(2)</title>
      <description>&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; の解説です。ソースコードをまだ見られていない方は、まず、&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; をご覧ください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
すでにコメントでほぼ明らかになっていますが、このコードの二つ目の脆弱性は、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;&amp;lt;?php echo &lt;span style=&quot;color:#FF0000&quot;&gt;$_SERVER['PHP_SELF']&lt;/span&gt;; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
の $_SERVER['PHP_SELF'] をそのまま表示していることです。$_SERVER['PHP_SELF'] は 現在実行しているスクリプトのファイル名ですが、この値には PATH_INFO も含まれます。&lt;br /&gt;
&lt;br /&gt;
例えば、URL に「http://localhost/this.php&lt;span style=&quot;color:#FF0000&quot;&gt;/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Ca%20name=%22a&lt;/span&gt;」と入力すると、この form タグは、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;/this.php&lt;span style=&quot;color:#FF0000&quot;&gt;/&amp;quot;&amp;gt;&amp;lt;script&amp;gt;alert('xss')&amp;lt;/script&amp;gt;&amp;lt;a name=&amp;quot;a&lt;/span&gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
となります。&lt;br /&gt;
&lt;br /&gt;
実際にやってみるとすぐにわかりますが、この時、警告ダイアログがブラウザの画面に表示されます。入力した JavaScript のコードがブラウザで実行されていることがわかります。&lt;br /&gt;
&lt;br /&gt;
これで、ユーザが自由に JavaScript コードをページに埋め込むことができることがわかります。これも、クロスサイトスクリプティング(XSS)脆弱性です。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/13/&quot;&gt;ログインフォームの脆弱性(3)&lt;/a&gt; へ続く。&lt;br /&gt;
&lt;br /&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7-2-</link> 
    </item>
    <item>
      <title>もっと脆弱性のあるメール送信フォーム</title>
      <description>よくあるメール送信フォームです。
このフォームを使い迷惑メールを送ってみてください。
&lt;br&gt;&lt;br&gt;

なお、表示の関係でソースコード中の textarea タグを textarea_ としています。
&lt;br&gt;&lt;br&gt;

&lt;textarea cols=&quot;60&quot; rows=&quot;42&quot; class=&quot;prettyprint&quot;&gt;
&lt;?php

if ( ! empty($_POST['submit'])) {
    $to      = $_POST['to'];
    $subject = $_POST['subject'];
    $body    = $_POST['body'];
    $from    = $_POST['from'];

    if (mb_send_mail($to, $subject, $body, 'From: ' . $from)) {
        echo &quot;メールを送信しました&quot;;
    }
    else {
        echo &quot;メール送信失敗です&quot;;
    }

    exit;
}
?&gt;

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;メール送信フォーム&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;form method=&quot;POST&quot; action=&quot;&quot;&gt;
名前: 
&lt;input type=&quot;text&quot; name=&quot;username&quot; size=&quot;20&quot;&gt;&lt;br&gt;
メールアドレス: 
&lt;input type=&quot;text&quot; name=&quot;from&quot; size=&quot;20&quot;&gt;&lt;br&gt;
件名: 
&lt;input type=&quot;text&quot; name=&quot;subject&quot; size=&quot;20&quot;&gt;&lt;br&gt;
本文:
&lt;textarea_ row=&quot;5&quot; name=&quot;body&quot; cols=&quot;40&quot;&gt;&lt;/textarea_&gt;
&lt;input type=&quot;hidden&quot; name=&quot;to&quot; value=&quot;kenji@example.jp&quot;&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;送信&quot;&gt;
&lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;
&lt;/textarea&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89/%E3%82%82%E3%81%A3%E3%81%A8%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0</link> 
    </item>
    <item>
      <title>問題のある認証付きページ</title>
      <description>ログイン済みのユーザのみアクセスできるページの処理です。ログインしているかどうか判定する関数 loggedin() の中身は省略しています。ログインしていないユーザはログインページにリダイレクトします。
&lt;br&gt;&lt;br&gt;


このコードのどこが問題でしょうか？
&lt;br&gt;&lt;br&gt;


&lt;textarea cols=&quot;60&quot; rows=&quot;15&quot; class=&quot;prettyprint&quot;&gt;
&lt;?php

function loggedin() {
    // ログインしているかどうか判定
    return FALSE;
}


if (loggedin() == FALSE) {
    // ログインしていない場合はログインページへリダイレクト
    header('Location: http://www.example.jp/login.php');
}

// ログイン済みユーザの処理
... 略 ...
&lt;/textarea&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89/%E5%95%8F%E9%A1%8C%E3%81%AE%E3%81%82%E3%82%8B%E8%AA%8D%E8%A8%BC%E4%BB%98%E3%81%8D%E3%83%9A%E3%83%BC%E3%82%B8</link> 
    </item>
    <item>
      <title>このブログの対象読者</title>
      <description>このブログの対象読者を書いていませんでした。

このブログの対象読者は「PHP初心者〜」です。なので、PHP初心者の方も含まれています。初心者からの疑問やコメントなども歓迎します。

</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E3%81%93%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/%E3%81%93%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E5%AF%BE%E8%B1%A1%E8%AA%AD%E8%80%85</link> 
    </item>
    <item>
      <title>ログインフォームの脆弱性(1)</title>
      <description>&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; の解説です。ソースコードをまだ見られていない方は、まず、&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/2/&quot;&gt;脆弱性のあるログインフォーム&lt;/a&gt; をご覧ください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
すでにコメントでほぼ明らかになっていますが、このコードの脆弱性のひとつは、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;ユーザ名: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&amp;lt;?php echo &lt;span style=&quot;color:#FF0000&quot;&gt;$_POST['username']&lt;/span&gt;; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
の $_POST['username'] をそのまま表示していることです。$_POST['username'] はユーザが POSTメソッドで送信した usernameフィールドの値ですね。&lt;br /&gt;
&lt;br /&gt;
例えば、ユーザ名に「&amp;quot;&amp;gt;&amp;lt;script&amp;gt;alert('xss')&amp;lt;/script&amp;gt;&amp;lt;a name=&amp;quot;a」と入力すると、この inputタグは、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&lt;span style=&quot;color:#FF0000&quot;&gt;&amp;quot;&amp;gt;&amp;lt;script&amp;gt;alert('xss')&amp;lt;/script&amp;gt;&amp;lt;a name=&amp;quot;a&lt;/span&gt;&amp;quot;&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
となります。&lt;br /&gt;
&lt;br /&gt;
実際にやってみるとすぐにわかりますが、この時、警告ダイアログがブラウザの画面に表示されます。入力した JavaScript のコードがブラウザで実行されていることがわかります。&lt;br /&gt;
&lt;br /&gt;
これで、ユーザが自由に JavaScript コードをページに埋め込むことができることがわかります。これは、典型的なクロスサイトスクリプティング(XSS)脆弱性です。&lt;br /&gt;
&lt;br /&gt;
これが何故、危険かわからない人がいましたら、コメントにその旨ご記入ください。&lt;br /&gt;
&lt;br /&gt;
続きは、&lt;a href=&quot;http://insecurephp.blog.shinobi.jp/Entry/10/&quot;&gt;ログインフォームの脆弱性(2)&lt;/a&gt;&lt;br /&gt;
</description> 
      <link>https://insecurephp.blog.shinobi.jp/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7-1-</link> 
    </item>

  </channel>
</rss>