【问题标题】:How to protect variable table names against SQL injection in PHP如何在 PHP 中保护变量表名免受 SQL 注入
【发布时间】:2014-06-02 19:16:54
【问题描述】:

我正在构建一个严重依赖数据库的网络应用程序。这是我经常使用的查询类型的示例:

CREATE TABLE item$userenteredname$username

基本上每次创建新项目时,都会有一个表格存储每次添加内容的信息。所以我需要表名保持不变。

我最近花了很长时间更新我的代码以使用 PDO。我了解如何准备语句和绑定值,但您不能使用表名来执行此操作。无法找到我的问题的正确答案,需要澄清的是......

当我因为变量在表名中而无法使用 prepare 或 mysql_real_escape_string 时,如何清理用户输入以防止 sql 注入?

【问题讨论】:

  • 这是一个愚蠢的设计。最好花一些时间创建适当的架构,而不是处理数千张表
  • 如果你有超变量表名,那么你的数据库设计是错误的。
  • 去这个链接你会得到想法stackoverflow.com/questions/60174/…
  • @Shurik,可能是这样,但你可以更有建设性一点——我们都必须在某个时候学习。 user1973975,Shurik 的观点是您的架构可能是错误的。如果您为每个用户存储自定义数据,请考虑使用两表架构,其中一个提供键(或自定义列名),另一个存储值(用户自定义数据 - 特定于键)。
  • 好的,我认为你们有一个很好的观点。基本上这是我编写的第一件事,我才刚刚开始,我想做的就是完成一个项目。该应用程序已完成并正在运行,但现在我正在添加安全性,所以我只是不顾一切地完成它。下次我会更仔细地设计数据库。

标签: php mysql security pdo


【解决方案1】:

我对这个用例的策略是去掉非字母数字字符。

    $usereneteredname = preg_replace('/[^0-9a-zA-Z_]/', '', $usereneteredname);
    $username = preg_replace('/[^0-9a-zA-Z_]/', '', $username);

    // then "CREATE TABLE item$userenteredname$username"

这种策略称为白名单。 preg_replace 调用将替换不是 0-9a-zA-Z_ 的任何内容。

进一步考虑:

您可能还希望在输出后验证字符串长度,并确保您操作的是字符串而不是数组。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2013-02-19
    • 2016-06-16
    • 2020-05-06
    • 1970-01-01
    • 2016-05-31
    • 2011-12-22
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多