【发布时间】:2015-05-16 15:14:32
【问题描述】:
我想知道是否有更好或更多的方法/解决方案来确保向公众开放的表单。
我想让它尽可能安全。
<?php
ob_start();
$sub_firstname = trim($_POST["firstname"]);
$sub_lastname = trim($_POST["lastname"]);
$sub_email = trim($_POST["email"]);
$sub_youtube_v = trim($_POST["youtube-v"]);
$sub_youtube_c = trim($_POST["youtube-c"]);
$sub_portfoliolink = trim($_POST["portfolio-link"]);
$sub_picturelink = trim($_POST["picture-link"]);
include('../dbconnect.php');
if (empty($sub_firstname) || empty($sub_lastname ) || empty($sub_email) || empty($sub_youtube_v)
|| empty($sub_youtube_c) || empty($sub_portfoliolink) || empty($sub_picturelink)) {
header ("Location: ../index.php?appform=empty");
exit;
}
$sub_firstname = $mysqli->real_escape_string($sub_firstname);
$sub_lastname = $mysqli->real_escape_string($sub_lastname);
$sub_email = $mysqli->real_escape_string($sub_email);
$sub_youtube_v = $mysqli->real_escape_string($sub_youtube_v);
$sub_youtube_c = $mysqli->real_escape_string($sub_youtube_c);
$sub_portfoliolink = $mysqli->real_escape_string($sub_portfoliolink);
$sub_picturelink = $mysqli->real_escape_string($sub_picturelink);
htmlspecialchars($sub_firstname);
htmlspecialchars($sub_lastname);
htmlspecialchars($sub_email);
htmlspecialchars($sub_youtube_v);
htmlspecialchars($sub_youtube_c);
htmlspecialchars($sub_portfoliolink);
htmlspecialchars($sub_picturelink);
if (!$mysqli->query("INSERT INTO ********* (firstname, lastname, email, youtube_v, youtube_c, portfolio_link, picture_link) VALUES('$sub_firstname', '$sub_lastname', '$sub_email', '$sub_youtube_v', '$sub_youtube_c', '$sub_portfoliolink', '$sub_picturelink')")) {
echo "Insert failed: (" . $mysqli->errno . ") " . $mysqli->error;
die();
}else{
header("Location: ../index.php?appform=success");
exit;
ob_flush();
}
?>
【问题讨论】:
-
如果至少有一个字段为空,则重定向离开是不好的用户体验——然后用户将不得不再次输入他们已经输入的所有其他值。相反,您应该再次显示表单,其中包含用户已经输入值以进行预填充的所有字段(可能还有关于缺失内容的特定错误消息)。在将数据插入数据库之前对数据使用
htmlspecialchars是完全错误的——您在输出数据时这样做,而不是在存储数据时这样做。而且在这里使用输出缓冲似乎是多余的。 -
@CBroe 我删除了 htmlspecialchars,我不知道该怎么做你刚刚告诉我的事情。 :( 什么是输出缓冲?