Php 从表单发布信息时,使用$\u REQUEST还是$\u POST更好?

Php 从表单发布信息时,使用$\u REQUEST还是$\u POST更好?,php,Php,我有一个表单,用户可以输入他们的姓名,然后它会将其添加到$message中,以通过电子邮件发送 使用$\u POST或$\u REQUEST更好吗 下面是使用$\u请求 $message.= "Name: ".$_REQUEST["fname"]." ".$_REQUEST["mname"]." ".$_REQUEST["lname"]."\n"; 不管你用哪一个。只要确保在表单中使用某种形式的安全性。答案是:这取决于您希望如何使用它 如果您使用的是$\u POST,这意味着它只能通过POST

我有一个表单,用户可以输入他们的姓名,然后它会将其添加到$message中,以通过电子邮件发送

使用
$\u POST
$\u REQUEST
更好吗

下面是使用
$\u请求

$message.= "Name: ".$_REQUEST["fname"]." ".$_REQUEST["mname"]." ".$_REQUEST["lname"]."\n";

不管你用哪一个。只要确保在表单中使用某种形式的安全性。

答案是:这取决于您希望如何使用它

如果您使用的是
$\u POST
,这意味着它只能通过POST进入。 如果您使用的是
$\u REQUEST
,这意味着您接受POST、GET(和COOKIE,但这主要是我们感兴趣的前两个)

对于这样的东西,
$\u POST
可能会更整洁,但如果您正在制作一个搜索引擎,允许设置搜索URL可能是一个好主意。但是,您可能希望允许大量特殊参数来缩小搜索范围,如果这会占用大量URL空间,您可能还希望允许POSTDATA


正如Dylan提到的,请记住,两者都不是任何类型安全的替代品。

\u如果数据在某处更新(即,如果操作有副作用),则发布,\u否则请求,如果您不在乎数据是否通过GET、POST、,或者任何其他方法。

我过去的方法是使用$\u REQUEST处理我认为是一个大错误的所有事情。最近,我一直在努力更勤奋地使用GET only进行读取请求,POST only进行写入请求


为此,我认为使用$\u GET进行GET请求和$\u POST进行POST请求会让我的代码更加清晰。

除非你有充分的理由这样做(例如Michael提到的搜索引擎),最好在各自的方法中使用$_GET和$_POST,而不是$_REQUEST,以避免在GET和POST数据中使用相同的参数名时出现任何歧义或混淆。

我刚刚听了第166集,它是关于跨站点请求伪造的,在其中,Steve为表单使用
$\u POST
而不是
$\u REQUEST
提供了一个很好的例子。(间接地说,他没有谈到PHP本身,但确实说不应该同时接受表单的GET和POST。)原因是使用GET请求进行CSRF攻击很容易,但使用POST却不那么容易


使用
$\u POST
本身并不能消除CSRF攻击的可能性,但它确实降低了CSRF攻击的可能性。Steve还建议在请求中使用加密性强的伪随机隐藏字段,以消除“盲”请求的可能性。

我使用$\u请求的唯一时间是需要能够支持来自$\u POST或$\u GET的数据时

例如,如果我有一个表单要修改一条记录,我可能会首先在url中以ID=X的形式传递记录ID。因此,当第一次加载表单时,我可以使用$_GET['ID']来确定我们要修改的记录

但是,在提交修改操作时,应该过帐表单,因为它将更改数据并且不是幂等的。在这种情况下,在处理表单提交时,记录ID可以作为$_POST['ID']访问

但是,如果表单提交中出现错误,并且我需要用一条有用的错误消息重新加载表单,该怎么办?在这种情况下,表单生成代码需要通过查看发布的id(不在URL中)来确定要使用的记录


在这种情况下,我会在表单显示逻辑中使用$_REQUEST['id'],这样它就可以支持任何一种场景。但是对于表单处理,我会使用$_POST['id']进行严格检查。

我能做些什么使我的表单更安全?在电子邮件上下文中,您需要注意电子邮件注入:简短版本是,除了消息本身,您不能允许用户在任何地方使用\r或\n。其他安全措施适用于数据库访问(SQL注入)和将在web浏览器(XSS)中显示的内容。