首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现“可配置”连接系统,安全

问实现“可配置”连接系统,安全
EN

Stack Overflow用户
提问于 2012-06-07 03:22:02
回答 2查看 230关注 0票数 5

背景

你好,我正在用PHP和MySQL开发一个实验/教育工具。我对SQL很陌生,但我想从一开始就以正确的方式做事情。我正在为所有变量替换使用PDO准备语句,并尽可能地回拨(因此,据我所知,它不会移植到非MySQL数据库)。关于我的问题,我有一个关于如何前进的想法,但我要花几个小时才能实现(我对SQL的语法还不熟悉),所以同时我想先提出一个问题,以防有人大喊:“这不是我要做的!”省去我几个小时的努力。

问题

我想创建一个用户从下拉菜单中选择的界面:

  1. a table A,
  2. 表上的一个或多个字段,例如A.x和A.y,
  3. a table B,H 214H 115该表上的一个或多个字段,例如B.z和B.y,H 218G 219

提交后,代码将执行内部连接,分别匹配每个字段,例如A.x = B.z、A.y = B.y等,并返回所有匹配的行。

我的计划只是生成一个INNER JOIN SQL语句,遍历字段并插入占位符(?),绑定相应的参数,最后执行语句。

有更简单的方法吗?有更好的方法吗?这会不会有什么可利用的?

非常感谢,提前。如果没有人在我完成(怀疑)时作出回应,我将张贴我的解决方案。

Misc.

假设我将验证

用户在

  • etc.

和A之间选择相同数量的字段的

  1. ,以及存在字段和表的
  2. ,

而且字段名不一定是相同的:它们将按顺序进行匹配。(请指出我可能不知道的任何其他细节!)

最终,目标是将这些选择保存在“设置”表本身中。实际上,用户在每次返回时都会创建他们希望看到的“视图”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-07 06:09:11

你做的太多了,我觉得很内疚,指出你做错了什么!:)

您只能使用准备好的语句来参数化字段值,而不能使用SQL标识符(如列名或表名)。因此,您将无法通过准备好的语句参数将A.x、B.z等传递到您的JOIN条件中:您必须执行错误的操作,并将它们直接连接到您的string中。

然而,并不是所有的东西都丢失了。在某种模糊的偏好顺序中,您可以:

  1. 为用户提供了一个选项列表,随后您将从该列表中重新组装SQL:

X,y,z,y

然后您的表单处理程序:

开关($_POST' JOIN _a') { case 1:$acol = 'x';坏;例2:$acol = 'y';中断;默认:死(‘无效输入’);}开关($_POST'join_b') { $bcol = 'z';情况2:'y';中断;默认:die(‘无效输入’);} $sql .=。

这种方法的优点是,在不影响PHP的情况下(在这种情况下,您的关注点要比SQL注入大得多),任意SQL绝对无法进入您的关系数据库管理系统。

  • 确保用户输入符合预期值之一:

X,y,z,y

然后您的表单处理程序:

如果(!in_array($_POST' JOIN _a','x','y')或!in_array($_POST'join_b','z',‘y’)死(‘无效输入’);$sql .=“从A连接B ON A.$_POSTjoin_a = B.$_POSTjoin_b";

为了安全起见,这种方法依赖于concern).

  • Perform的in_array函数(并且还向用户公开了您的底层列名,但考虑到您的应用程序,我怀疑这是一个in_array输入清理,例如:

mb_regex_encoding($charset);// charset数据库连接$sql .=‘从A连接B到A.' . mb\_ereg\_replace(',', $\_POST['join\_a']) . '`' . ' = B.`' . mb\_ereg\_replace('`', ',$_POST' JOIN _b')。'' Whilst we here quote the user input and replace any attempt by the user to escape from that quoting, this approach could be full of all sorts of flaws and vulnerabilities (in either PHP'smbereg_replace`函数或MySQL处理引用标识符中巧尽心思构建的字符串)。

如果可能的话,最好使用上述方法之一,以避免将用户定义的字符串完全插入SQL .中。

票数 2
EN

Stack Overflow用户

发布于 2012-06-07 06:06:48

假设用户输入仅限于选择表和字段(即没有附加条件),您应该可以使用您的方法;听起来很有趣:)

我想补充的一点是,某些连接比其他连接更好。例如,使用两个表的主键(或其他索引)连接两个表将比两个不相关的列的性能要好得多,而对于两个不相关的列,需要进行完整的表扫描。

这一切首先取决于桌子有多大;对于少于几千张记录,你应该没问题;任何超出严肃思考范围的事情都已经到位:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10925263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档