【问题标题】:Securing a HTML form, before it sends data to a mysqli database在将数据发送到 mysqli 数据库之前保护 HTML 表单
【发布时间】: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,我不知道该怎么做你刚刚告诉我的事情。 :( 什么是输出缓冲?

标签: php mysqli forms


【解决方案1】:

您可能要查找的主要内容是CSLF token。这本质上是表单上随机生成的令牌,作为隐藏输入提交,然后将在表单处理器中进行身份验证。这将有助于解决跨站点伪造攻击。

您实际上是在检查以确保表单来自您,而不是由外部资源提交。

【讨论】:

  • 我不了解风险。 :(
  • 做这样的事情怎么样?
    ">
  • 风险在于我可以在自己的网站上制作自己的表单,然后提交到您的网站。即使它在您端进行了清理,您仍然不希望将我的垃圾放入您的数据库。要使其正常工作,您需要在表单上添加 CSLF token,而不仅仅是处理器。
  • 所以最好使用 CSLF 令牌?
  • 这将使防御跨站点伪造尝试更加安全。这是一个相当不错的表单可能受到攻击的方式列表phpsec.org/projects/guide/2.html
【解决方案2】:

使用 html 字符:

<form method="post" action="<?php echo htmlspecialchars(/*Page name and extension here with root*/);?>"> 

如果需要,请使用表单表单键: 参考(对不起):

http://code.tutsplus.com/tutorials/secure-your-forms-with-form-keys--net-4753

使用 SSL 只需在 Google 上搜索,即可免费获得一份 SSL 证书或付费获得一份。

使用 CSRF 保护 参考(对不起):

http://shiflett.org/articles/cross-site-request-forgeries

更多的只是评论。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2013-02-26
    • 2019-08-02
    • 2019-11-18
    • 1970-01-01
    • 2016-06-21
    • 2011-11-27
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多