1

1-i には、名前、家族、電子メール、誕生日 (選択) と、性別 (1 つは男性用、もう 1 つは明らかに女性用) の 2 つの異なるラジオ ボタンがあるフォームがあります。今、誰かがPHPのこのフィールドへのxss攻撃を防ぐ方法を説明してもらえますか? 私のフォームデータはこのようなものです

<form action="register.php" method="post">
    <div>
        <table>
        <tr><td><?php echo $lang['5']; ?> :</td><td> <input type="text" name="name" maxlength="254" class="required" /></td></tr>
        <tr><td><?php echo $lang['6']; ?> :</td><td> <input type="text" name="family" maxlength="254" class="required" /></td></tr>
        <tr><td><?php echo $lang['59']; ?> :</td><td> <input type="text" name="email" maxlength="254" class="required" /></td></tr>
        <tr><td><?php echo $lang['74']; ?> :</td><td> <input type="text" name="repeat" maxlength="254" class="required" /></td></tr>
        <tr><td><?php echo $lang['60']; ?> :</td><td><input type="password" name="password"/></td></tr>
        <tr>
        <td><?php echo $lang['8'] ?> :</td>
        <td>
        <select name="day">
        <option><?php echo $lang['9'] ?></option>
        <?php 
        for($i=1;$i<=31;$i++){
        echo "<option value=\"{$i}\">{$i}</option>\n"; 
        }
        ?>
        </select>
        <select name="month">
        <?php 
        for($i=0;$i<=12;$i++){
        $i = str_pad($i,2,"0",STR_PAD_LEFT);
        echo "<option value=\"{$i}\">";T(1,$i);echo "</option>\n"; 
        }
        ?>
        </select>
        <select name="year">
        <option><?php echo $lang['11'] ?></option>
        <?php 
        for($i=1300;$i<=1373;$i++){
        if($i == $birthdate['0']){
        echo "<option value=\"{$i}\" selected=\"selected\">{$i}</option>\n"; 
        }else{
        echo "<option value=\"{$i}\">{$i}</option>\n"; 
        }
        }
        ?>
        </select>
        </td>
        </tr>
        </table>
        male : <input type="radio" name="gender[]"  />female : <input type="radio" name="gender[]"  /><br />
        <input type="submit" name="submit" value="<?php echo $lang['63'];  ?>" onclick="formhash(this.form, this.form.password);"/>
    </div>
</form>

名前と家族について、このパターンでhtmlエンティティだけを取得するために、このようなことをしました

$name = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $name);
$family = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $family);

メールの場合は、次のようにしました。

 $email = preg_replace("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,3})$^", "", $email);

この preg_replace は十分に安全ですか、それとも htmlentity または htmlspecailchars を使用する必要があるのでしょうか?

2-そして2番目の質問では、ラジオボタンまたはselectectオプションからの投稿データをエスケープする必要がありますか?必要に応じて、それらをどのようにエスケープする必要がありますか?

3-私は htmlpurifier について読んだところです。ステータス フィールドがある場合、どのユーザーを更新できますか?

前もって感謝します。

4

1 に答える 1

1
  • 送信されたすべての値をエスケープすることをお勧めします
  • HTMLPurifierは非常に優れており、XSS 攻撃を防ぐのに十分です。使用方法は次のとおりです。

    # In register.php page:
    
    require_once 'path/to/HTMLPurifier/library/HTMLPurifier.auto.php';
    
    $config = HTMLPurifier_Config::createDefault();
    $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
    $config->set("HTML.Allowed", ""); // this will NOT allow any html tags
    $purifier = new HTMLPurifier($config);
    
    # hash the provided password (don't apply HTMLPurifier on the password)
    $hash_password = sha1($_POST["password"]);
    
    $data = array();
    
    # apply HTMLPurify on all submitted data
    foreach ($_POST as $key => $value) {
        $data["$key"] = mysql_real_escape_string($purifier->purify($value));
    }
    
    # get birthday
    $data["birthday"] = $data["year"] . "-" . $data["month"] . "-" . $data["day"];
    
    # insert submitted data into your database
    $result = mysql_query("
        INSERT INTO table_name (name, family, email, password, birthday, gender)
        VALUES ('{$data["name"]}', '{$data["family"]}', '{$data["email"]}', '$hash_password', '{$data["birthday"]}', '{$data["gender"]}')
    ");
    
    
    ?>
    

注:配列の代わりに、2 つの無線入力タグの属性の値としてmaleとを使用します。femalenamegender[]

于 2012-12-04T09:35:07.900 に答える