我找到了一些惯用的PHP代码,但我想要一种更清晰(更易于维护)的方式

时间:2009-09-19 07:39:12

标签: php forms

我正在使用PHP

  1. 实现HTML表单和
  2. 用于验证表单提交的数据。
  3. 有两个脚本。为了让第二个脚本知道第一个脚本分配的值,我使用的POST方法包含以下代码:

    foreach (${"_".$_SERVER["REQUEST_METHOD"]} as $k => $v) $$k = $v;
    

    检索POST(或GET)关联数组的每个(key => value)元素,并使用这些名称和值创建变量。

    我不记得我在哪里找到了这段代码,但是一旦我弄清楚它是如何完成它的,我对它印象深刻。

    它运作良好,但我知道如果我在几个月内回到它,我将不记得它是如何工作的,除非我添加广泛的评论,我更喜欢使用我可以立即理解和适合的东西以及我的非惯用风格。

    有人有任何建议吗?

    结论:

    我喜欢extract()的想法,我可能会使用它。谢谢你们。

    我应该解释一下为什么以下答案中提出的一些观点不会打扰我:

    • 表单仅在公司内部网上可见。用户无法找出点击的按钮,更不用说“如何攻击它了?”
    • 用户在表单字段中输入简单值:x和y坐标,度量,批号。验证很简单。如果它不起作用,我在现场,他们会问我原因。
    • 这些值最终出现在只有我的应用访问的数据库中。我不允许任何可能构成SQL注入的内容。
    • 我不必担心其他开发者。 我是唯一的开发者,我只是想在简单的网络应用程序可以做到的时候,尝试克服使用臃肿的Windows应用程序的企业文化。前几天我与一位高级工程师讨论了为什么我使用MySQL数据库,当你可以使用Access& Excel中。

    但我不应该让自己开始......

5 个答案:

答案 0 :(得分:4)

这样做是一种潜在的安全风险,因为攻击者可以轻松更改其他变量。

您是否考虑过使用$_REQUEST超全球?

答案 1 :(得分:3)

错误的方式。只需使用:

extract($_POST);
or
extract($_GET);

答案 2 :(得分:3)

提取请求变量不是安全方面的最佳实践,至少可以说......

考虑到这一点,这里有一些代码:

<?php    
// $req = ${"_".$_SERVER["REQUEST_METHOD"]}
if ($_SERVER["REQUEST_METHOD"] == 'GET') {
    $req = $_GET;
else {
    $req = $_POST;
}

extract($req);
?>

或简单地说:

<?php 
extract($_REQUEST);
?>

请查看extract的文档页面,您可以添加有助于最大程度降低安全风险的额外选项。

答案 3 :(得分:0)

是的,这样做的惯用方法较少。您可以从php.ini启用“register_globals”设置。

然而,在你做之前,请确保你谷歌“php register_globals安全”,以获得一个暗示,为什么它可能不是一个如此出色的想法。

答案 4 :(得分:0)

一般来说,依靠以这种方式发送给你的东西并不好。 A正如其他人所建议的那样,如果这是你想要的方式,请使用extract(),但我会建议:

作为表单的每个脚本都应该包含它接受的字段列表:

$fields = array('name', 'age', 'city');

然后做:

$form = array();
foreach ($fields as $field) {
  $form[$field] = $_POST[$field];
}

如果您只是根据客户端决定发送给您的内容创建全局变量,您可能会无意中覆盖您希望存在的内容,但会被客户端的任意值替换。这可能会造成漏洞。只接受你期望的东西是一种更安全的做法。