【问题标题】:Is it wise to write superglobal $_POST directly to a database?将超全局 $_POST 直接写入数据库是否明智?
【发布时间】:2012-05-20 12:33:48
【问题描述】:

我想要一个适用于不同形式的提交代码,例如:

<?php 
 $type = $_GET['type'];
 if(isset($_SESSION['id']))
  handle_form();
 else 
  include 'form_'.$type.'.php'; // different fields based upon type
?>

所以我想知道循环通过超全局 $_POST 将所有键和值写入数据库是否明智。比如:

<?php 
 function handle_form() {
 $query = "";
 foreach($_POST as $key => $value) {
  $query .= mysql_real_escape_string($key)."='".mysql_real_escape_string($value)."' AND ";
 }
 mysql_query("UPDATE ".$_POST['type']." SET ".substr($query,0,-4)."WHERE `id` = $_SESSION['id']");
 }
?>

或者这是处理表单的一种非常不安全的方法,是否最好对相应的“form_type.php”中的所有字段进行硬编码?

【问题讨论】:

  • 通过连接来自用户输入的字符串来构建查询从来都不是安全的。如果$_POST['id'] 设置为“0 OR id IS NOT NULL”怎么办?
  • 好吧,我在写这个 sn-p 时犯了一个错误,实际上 id 来自会话。 (将对其进行编辑。)但我认为这会更安全,因为如果有人弄乱了表单,mysql_error 会阻止提交,对吗?

标签: php forms security post


【解决方案1】:

这是一个非常糟糕的主意,因为任何与列不对应的额外 POST 字段都会破坏查询。您自己的代码使用$_POST['type'] 来确定您正在更新哪个表,除非您事先取消设置,否则它也会中断。

此外,您没有对实际发送到数据库的数据进行任何验证。将您自己的姓名/权限更改为管理员?当然。将其他用户的电子邮件更改为您自己的?前进。让您的账户余额+100,000 美元?没问题。将产品标记为“价格 1 美元”?是的。

拥有某种Active Record 会更聪明。如果您正在编写更大的应用程序,请查看 Yii 或 Cake PHP 等框架,它们内置了此类功能。


除此之外:请停止使用古老的 mysql_* 函数编写新代码。它们不再被维护,社区已经开始deprecation process。相反,您应该了解准备好的语句并使用PDOMySQLi。如果你想学习,here is a quite good PDO-related tutorial

【讨论】:

  • 好的,我也可以将类型添加到会话中。至于验证,它用于编辑用户页面上的多个文本框。所以用户可能会弄​​乱他自己的文本。感谢您提供有关查询的信息:)
【解决方案2】:

来自不受信任的外部来源的所有内容都不能安全地插入数据库或其他任何地方,因为您有Code Injection 的风险。如果是数据库,您将面临SQL Injection 的风险。你必须清理输入。这适用于任何Superglobals 以及您无法控制的任何其他数据,例如网络服务。

使用mysql_real_escape_string 转义数据是您需要做的最少操作,但it does not protect you from all possible injection attacks。它是纯粹的语法,无法检测到对其他语法正确的数据值的篡改。

除此之外,您不应该再使用 ext/mysql。 It is outdated and will be deprecated。使用ext/mysqliPDO 并使用prepared statements

【讨论】:

  • 在使用 mysql_real_escape_string() 时是否仍然可以进行 sql 注入?
【解决方案3】:

这是一场潜在的噩梦。 永远不要相信你的用户。

每个 $_POST 参数都应检查为:

  • 它是接受参数白名单的一部分吗?
  • 是否有正确的数据类型或值范围?

那么,请务必使用 Prepared Statements 而不是普通的 mysql_query() 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多