1

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

<?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”中硬编码所有字段是否更好?

4

3 回答 3

4

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

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

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


除此之外:请停止使用古老的 mysql_* 函数编写新代码。它们不再被维护并且社区已经开始了弃用过程。相反,您应该了解准备好的语句并使用PDOMySQLi。如果你想学习,这里有一个相当不错的 PDO 相关教程

于 2012-05-20T12:45:14.893 回答
2

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

转义数据mysql_real_escape_string是您需要做的最低限度的事情,但它并不能保护您免受所有可能的注入攻击。它纯粹是语法,无法检测到对其他语法正确的数据值的篡改。

除此之外,您不应该再使用 ext/mysql。它已过时,将被弃用。使用ext/mysqliPDO并使用准备好的语句

于 2012-05-20T12:42:45.410 回答
0

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

每个 $_POST 参数应检查为:

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

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

于 2012-05-20T12:44:17.373 回答