阻止输入字段上的xss?

时间:2012-11-28 17:51:22

标签: php escaping preg-replace htmlpurifier

1-i有一个表格,其名称为家庭电子邮件生日(这是一个选择)和性别,这是两个不同的单选按钮,一个用于男性,另一个显然是女性。 现在请有人解释我如何防止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 - 第二个问题是有必要从单选按钮或选择选项中删除发布的数据,如果必要的话我应该如何逃避它们?

3-i刚刚阅读了关于htmlpurifier ..如果我有状态字段,用户可以更新它,如果我使用html净化器的人状态和这个注册表格可能?

提前感谢。

1 个答案:

答案 0 :(得分: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"]}')
    ");
    
    
    ?>
    

注意: 使用malefemale作为2个无线电输入标记的name属性的值,而不是gender[]数组