php - 如何为用户输入生成的 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();
解决方案
通过 SQL 查询添加字段或添加列没有区别,因为两者都写入数据库,因此 sql-injection 在这两种情况下都是可能的,不仅在添加列时,特别是如果您直接将用户输入传递到 SQL 查询而不转义不需要的字符.
所以只需关心用户输入,正确清理所有输入。
谢谢,
杰基萨拉夫
推荐阅读
- java - Spring使用错误的application.yaml
- c# - 如何将自动映射器与条件语句一起使用
- javascript - 如果路径的最后一部分是变量,如何使我的网页的 URL 工作?
- python - 为什么在 Selenium 中等待元素加载后元素没有出现?
- c# - 使用 GPU 绘制网格
- python - 通过多个条件选择行的惰性方式
- python - 如何使用 AWS_IAM 授权从 lambda 函数访问 Appsync API
- php - 注意:试图获取非对象的属性“项目”
- node.js - 如何在查询中将 $1 添加到 json 路径中?
- r - 如何将多个ggarrange图保存到R中的单个pdf