首页 > 解决方案 > 如何为用户输入生成的 mySQL 列添加添加安全性?

问题描述

使用 PHP 7 和 MySQL 8

让最终用户生成一个新列一开始并不是最好的主意,但是在这种情况下(以及其他一些不容易使用常见 PDO 策略的情况),提供针对 SQL 注入的安全性的解决方案是什么?

我正在尝试做的事情:我有一个动态注册表单,它从数据库中获取输入,并且该网站的所有者可以在此表单中添加字段。当然,如果在表单中添加了一个新字段,那么数据库中也必须添加一个新列来存储数据。直接插入没有问题,但如果有人侵入管理系统,他们可以轻松添加 sql 注入。因此,我试图找到一种更安全的方法。

工作(不安全)代码:

  //$fName is the field name and also the column name
  $fName= $_POST['fName'];
  $sql2=$pdo->prepare("ALTER TABLE attendee ADD $fName VARCHAR( 255 )");
  $go2=$sql2->execute();

我已经尝试过:我已经研究过白名单,但我不认为这是最好的选择,因为列可能被命名的可能性是无穷无尽的。

//Tried using named paramater PDO array (also tried unnamed ? version)
  $data2=[
    'fName'=>$fName
         ];
  $sql2=$pdo->prepare("ALTER TABLE attendee ADD :fName VARCHAR( 255 )");
  $go2=$sql2->execute($data2);

//Using PDO Quote indirectly
  $roger=$pdo->quote($fName);
  $sql2=$pdo->prepare("ALTER TABLE attendee ADD $roger VARCHAR( 255 )");
  $go2=$sql2->execute();

//Using PDO Quote Directly with concatenation
  $sql2=$pdo->prepare("ALTER TABLE attendee ADD" . $pdo->quote($fName) . " VARCHAR( 255 )");
  $go2=$sql2->execute();

标签: phpmysqlsecuritypdocode-injection

解决方案


通过 SQL 查询添加字段或添加列没有区别,因为两者都写入数据库,因此 sql-injection 在这两种情况下都是可能的,不仅在添加列时,特别是如果您直接将用户输入传递到 SQL 查询而不转义不需要的字符.

所以只需关心用户输入,正确清理所有输入。

谢谢,
杰基萨拉夫


推荐阅读