0

我只是想知道这是否是处理表单提交的最安全和最好的方式,我正在尝试找到最“安全”并为我的编码视图呈现的方式,

PHP

<?php
if(isset($_POST['submit'])) {
 //Handle the form here with many $_POST['namehere']
}
?>

HTML

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<label>Email</label>
     <input name="email" type="text">
<label>Password</label>     
     <input type="password" name="password">
<label>Submit</label>     
     <input type="submit" name="submit">
</form>

这会被认为是唯一可行且最安全的方法吗?

4

4 回答 4

1

为了增强表单的安全性,您应该考虑使用 XSRF 密钥/令牌。这些将使来自域外站点的请求更难成功调用您的脚本。

http://en.wikipedia.org/wiki/Cross-site_request_forgery

http://query7.com/preventing-csrf-in-php

于 2013-02-24T13:05:37.783 回答
1

可以提高几点!

1. 不要使用 PHP_SELF

将 action-formtag 留空

<form action='' method='post'>

2. 转义 SQL 字符

如果您想使用数据库,您应该从字符串中转义 SQL 字符。利用:

[mysql_real_escape_string($string)][1]

检查数据类型的值

如果您有一个只需要完整数字的 from 字段,您应该删除所有字母。您可以通过在变量前面的括号中写入所需的类型来更改 PHP 变量的类型,如下所示:

$number=(int) $value;
于 2013-02-24T13:26:49.003 回答
1

这很难回答,因为没有太多代码可以通过,但是:

不要使用PHP_SELF

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

不要这样做,或者至少清理值,因为使用原始值会使站点容易受到 XSS 攻击!发布给自己可以像这样简单地完成:

<form action="" method="POST">

或者,使用绝对(和静态)URI 作为表单目标。

附录

不要让其他人说服您认为您受到某种神奇的保护,因为您正在托管一个小型站点,使用某些框架 xyz 或者某些浏览器会阻止它。自己找出来并采取适当的行动。

在 SSL 上

如果您提交敏感数据,您应该使用 SSL!相比之下,其他任何事情都是笑话。

在 CSRF 上

导致站点状态更改并使用 cookie 使会话永久化的表单应受 CSRF 令牌保护;令牌必须是表单提交的一部分,并在使用后重新生成。

关于 SQL 注入

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

花絮(实际上与安全性无关)

if(isset($_POST['submit'])) {
 //Handle the form here with many $_POST['namehere']
}

此代码假定您的表单上始终有一个名为 的提交按钮submit。更通用的方法是使用此条件:

if ($_SERVER['HTTP_METHOD'] === 'POST') {
    // something was submitted
    if (isset($_POST['email'], $_POST['password']) {
        // email and password submitted
        // you may still wish to verify whether a "valid" email was given
    }
}
于 2013-02-24T13:02:28.807 回答
1

你所拥有的只是一种形式。它既不安全也不不安全。定义表单是否安全的是您如何将数据传输到服务器以及如何处理服务器端的输入。

一个安全的登录表单...

  • 通过 HTTPS (SSL) 将其内容发布到服务器
  • 正确验证所有输入服务器端
  • 不允许 SQL 注入
  • 使用带有正确验证的反 CSRF 令牌的隐藏字段
  • 使用具有强化 Apache/PHP 安装的服务器

关于PHP_SELFXSS 漏洞利用:

  • 杰克在他的评论中链接的文章建议了一个实际上不起作用的字符串
  • 在某些情况下*存在这种 XSS 攻击的可能性,问题是,它有多容易被利用?该漏洞是客户端,因此无法直接利用,您需要围绕它设计一些东西(反射攻击),例如一个虚假的电子邮件操作,我假装是您的网站,并提供一个链接供您登录,同时让您发布您对我的网站的凭据。或者存储攻击,但如果我能够做到这一点,那么您的网站比 PHP_SELF XSS 存在更大的问题。
  • 当然,最好的办法是避免使用 PHP_SELF 并将其替换htmlspecialchars($_SERVER['SCRIPT_NAME'])为例如。

* 情况

  • 该漏洞利用不适用于大多数现代 PHP 框架,即使它们没有保护并真正使用PHP_SELF,因为包含攻击字符串的 url 不会匹配任何允许的 url 路由。
  • 浏览器已经开始实施 XSS 保护。例如,在撰写本文时,该漏洞在 Chrome/WebKit 和 IE8+ 中不起作用,但在 Firefox 中起作用。
  • 小型私人站点极不可能成为此类攻击的目标,因为要设计一个站点需要付出一些努力。目标通常是社交网络和类似网站。
于 2013-02-24T13:04:10.533 回答