1

1-我有一个表格,其中包含姓名家庭电子邮件生日(这是一个选择)和性别,这是两个不同的单选按钮,一个是男性,另一个显然是女性。现在请有人能解释一下如何防止对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-我刚刚阅读了有关 htmlpurifier 的信息。现在如果我有状态字段,我可以更新哪个用户,我应该使用 html 净化器来获取人员状态和这个注册表单吗?

提前致谢。

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"]}')
    ");
    
    
    ?>
    

注意:使用maleandfemale作为name2 个无线电输入标签的属性值,而不是gender[]数组

于 2012-12-04T09:35:07.900 回答