使用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();
绝对没有要点。
只需将它们命名为extra_column1,extra_column2等。>>对于像您这样的完全自动化的系统,可以的。对于此系统,您将不可避免地需要维护一种映射,在该映射中,列名称链接到某些元数据,例如显示名称等,因此只需将extra_column1作为列名称添加到该映射。
因此,只需要关心用户输入,请正确清理所有输入(不只是添加列)。
谢谢,贾基·萨拉夫