如何为用户输入生成的mySQL列添加安全性?

问题描述 投票:0回答:2

使用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();

php mysql security pdo code-injection
2个回答
0
投票
根据用户输入命名额外的列时,

绝对没有要点。

只需将它们命名为extra_column1,extra_column2等。>>

对于像您这样的完全自动化的系统,可以的。对于此系统,您将不可避免地需要维护一种映射,在该映射中,列名称链接到某些元数据,例如显示名称等,因此只需将extra_column1作为列名称添加到该映射。

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

因此,只需要关心用户输入,请正确清理所有输入(不只是添加列)。

谢谢,贾基·萨拉夫


0
投票
您添加字段或通过SQL查询添加列都没有区别,因为两者都写入数据库,因此,不仅在添加列时,而且在两种情况下sql-injection都是可能的,特别是如果您将用户输入直接传递到SQL查询而不进行转义不需要的字符。
© www.soinside.com 2019 - 2024. All rights reserved.