0

我想知道处理网站插入/删除请求的专业方法是什么?

现在,我<input type = "hidden"/>在每个表单上插入了两个,其中一个隐藏的值对应于它需要的函数,另一个是该函数的参数。因此,当表单提交时,我有一个 post.php 文件来处理所有插入/删除请求,这些请求只是通过call_user_func()PHP 调用隐藏的值。像这样:

<input name = "arg" value = "{$id}" type = "hidden"/>
<input name = "call" value = "delete_member" type = "hidden"/>

call_user_func($_POST['call'], $_POST['arg']);

我怀疑这个解决方案的合理性,因为我发现隐藏部分实际上并没有隐藏在客户端的源代码中。

我的第一个解决方案基本上是有很多条件检查要调用哪个函数,但我真的很讨厌这个,所以我用这个解决方案改变了它。

我想知道有什么更好的方法可以做到这一点,或者专业人士是如何做到的?处理插入/删除查询。

4

2 回答 2

1

我认为这是从客户端调用操作的一种非常糟糕的方式。

一方面,这些数据被放入 HTML 中,客户端始终可以查看和编辑。因此,这意味着您无法信任从客户端收到的数据,因此您无法信任他们正在调用的函数。

再强调一点我之前的想法。你说你运行验证以确保它是一个函数等等,但是你有一个问题。闭包在这些函数上返回 true(因为它们是函数和方法并且它们存在)。因此,用户可以将匿名函数作为隐藏字段的值,并在服务器上实际运行他们想要的任何内容。

正如其他人所说,我建议研究 MVC。查看 Yii/CodeIgniter/Zend/Lithium/Kohana/etc 是如何做到这一点的以及它们是如何路由的。

我最喜欢的框架 Yii 如何为删除等操作进行路由的示例:

class UserController extends CController{
    public function actionDelete($id = null){
       if($id===null){ return false; }
    }
}

然后表单/链接调用/user/delete?id=2使 index.php 路由到userController并使用actionDelete用户控制器内部的函数,运行它的代码。当然,这是一个非常简化的版本,阻止漏洞变得更加复杂。

您可能还希望查看 CSRF 验证。

于 2012-08-26T02:41:31.183 回答
1

最常见的方法是只调用一个函数来处理一个表单,就像这个提交博客消息的例子一样:

博客.php

if(isset($_POST['submit'])) {
  save_message();
} else {
  display_form();
}

function display_form()
{
  ?>
  <form action="blog.php"> etc etc....
  <?php
}

function save_message()
{
  //security checks and inserts etc
  $_SESSION['message'] = 'Form saved succesfully';
  header('location: blog_overview.php');
}

在我看来,这是一种实践,但您可能想要检查 Codeigniter 和 Kohana 等框架,因为上面的代码是功能性的(而且对我来说已经过时了)。阅读一些关于 OOP(面向对象编程)和 MVC(模型视图控制器)的教程。看起来工作量很大,但如果你真的想让它做对,那就值得花时间和精力。

于 2012-08-26T02:41:53.100 回答