90701
phpでpingを使った疎通確認ができるWebページを作成したんですが、画像のように結果が文字化けします。  
XAMPPを使用しており、php.iniは「default_charset = UTF-8」、「mbstring.language =
Japanese」、「mbstring.internal_encoding =
UTF-8」に設定しなおしましたが治りません。一応、コードも載せておきます。原因と対処法分かる方いたら教えてください。

[![文字化け](https://i.stack.imgur.com/iC1qV.png)](https://i.stack.imgur.com/iC1qV.png)

[![OSのシステム情報](https://i.stack.imgur.com/KJW2E.png)](https://i.stack.imgur.com/KJW2E.png)

```

    <!DOCTYPE html>
    
    <html lang="ja">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Ping Check</title>
    </head>
    
    <body style="text-align:center;">
        <h1>Ping Check</h1>
        <?php
        print "IP address<br>\n";
        ?>
        <form method="post">
            <input type="text" size="30" name="ipaddress" placeholder="8.8.8.8"><br>
            <input type="submit" value="check">
        </form>
    
        <?php
    
        if (!empty($_POST["ipaddress"])) {
            $ipaddress = $_POST["ipaddress"];
            echo exec("ping -n 1 " . $ipaddress);
        }
        ?>
    
    </body>
    
    </html>
    
```
CC BY-SA 4.0
2022-08-22T15:00:24.127
90699
2022-08-23T05:28:09.343
2022-08-23T05:28:09.343
3060
54103
question
php 文字化け
exec での外部コマンドの実行結果を表示すると文字化けが発生する
文字コードを変換してあげると解決すると思います。  
また、execコマンドが最後の1行しか取得できていなかったので、こちらも直してみました。  
これに伴って、少しエラー対策も入れています。  
参考になれば幸いです。

```

    <!DOCTYPE html>
    
    <html lang="ja">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Ping Check</title>
    </head>
    
    <body style="text-align:center;">
        <h1>Ping Check</h1>
        <?php
        print "IP address<br>\n";
        ?>
        <form method="post">
            <input type="text" size="30" name="ipaddress" placeholder="8.8.8.8"><br>
            <input type="submit" value="check">
        </form>
    
        <?php
    
        if (!empty($_POST["ipaddress"])) {
            $ipaddress = $_POST["ipaddress"];
            $output = null;
            $exitcode = null;
            exec("ping -n 1 " . $ipaddress, $output, $exitcode);
            $output = nl2br(mb_convert_encoding(implode("\n", $output), "utf-8", "auto"));
            if ($exitcode == 0){
                echo $output;
            }else{
                echo "PINGの実行に失敗しました。<br>";
                echo $output;
            }
        }
        ?>
    
    </body>
    
    </html>
    
```

参考：  
[文字コードの変換：mb_convert_encoding](https://www.php.net/manual/ja/function.mb-
convert-encoding.php)  
[配列の連結：implode](https://www.php.net/manual/ja/function.implode.php)  
[改行を `<br>` タグに変換する：nl2br](https://www.php.net/manual/ja/function.nl2br.php)
CC BY-SA 4.0
2022-08-22T22:04:58.030
90700
2022-08-22T22:04:58.030
29034
90699
answer
[`exec()`のドキュメント](https://www.php.net/manual/ja/function.exec.php#refsect1-function.exec-
notes)には

> **警告** ユーザーが入力したデータをこの関数に 渡すことを許可する場合、ユーザーが任意のコマンドを実行できるようシステムを欺くことが できないように
> escapeshellarg() または escapeshellcmd() を適用する必要があります。

とあります。気を付けるべきです。

* * *

具体的には

>
```

>     <form method="post">
>       <input type="text" size="30" name="ipaddress"
> placeholder="8.8.8.8"><br>
>       <input type="submit" value="check">
>     </form>
>     <?php
>     if (!empty($_POST["ipaddress"])) {
>       $ipaddress = $_POST["ipaddress"];
>       echo exec("ping -n 1 " . $ipaddress);
>     }
>     ?>
>  
```

とのことなので、IP address として

```

    127.0.0.1 && shutdown /s /t 0
    
```

と入力したら、シャットダウンコマンドが実行されて、PCが停止しませんか？
CC BY-SA 4.0
2022-08-22T22:29:53.703
90701
2022-08-22T22:29:53.703
4236
90699
answer