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净化器的人状态和这个注册表格可能?
提前感谢。
答案 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"]}')
");
?>
注意:
使用male
和female
作为2个无线电输入标记的name
属性的值,而不是gender[]
数组