这是处理PHP表单最安全的方法吗?

时间:2013-02-24 12:51:32

标签: php forms

我只是想知道这是否是处理表单提交的最安全和最好的方法,我正在努力寻找最“最安全”并提供给我的编码视图,

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 个答案:

答案 0 :(得分: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注入

Please, don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial

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

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
    }
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

你可以提高几点!

<强> 1。不要使用PHP_SELF

将action-formtag留空

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

<强> 2。逃避SQL字符

如果要使用数据库,则应该从String中转义SQL-chars。   使用:

[mysql_real_escape_string($string)][1]

检查数据类型的值

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

$number=(int) $value;

答案 3 :(得分:0)

你在那里只有一张表格。它既不安全也不安全。 定义表单是否安全的方法是如何将数据传输到服务器以及如何处理服务器端的输入。

安全登录表单...

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

关于PHP_SELF XSS漏洞利用:

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

*情况

  • 该漏洞不适用于大多数现代PHP框架,即使它们没有保护并真正使用PHP_SELF,因为包含攻击字符串的URL与任何允许的URL路由都不匹配。
  • 浏览器已开始实施XSS保护。例如。该漏洞利用在Chrome / WebKit和IE8 +中不起作用,但在撰写本文时它可以在Firefox中使用。
  • 小型私人网站不太可能成为此类攻击的目标,因为需要花费一些精力来设计一个。目标通常是社交网络和类似网站。