当前位置: 首页 > 面试题库 >

安全地转义表名/列名

公西英叡
2023-03-14
问题内容

我在php中使用PDO,因此无法使用准备好的语句对表名或列名进行转义。以下是自己实现的简单方法:

$tn = str_replace('`', '', $_REQUEST['tn']);
$column = str_replace('`', '', $_REQUEST['column']);
$sql = "SELECT * FROM `tn ` WHERE `column` = 23";
print_r(
    $pdo->query($sql)->fetchAll()
);

还是仍然存在一些可以被攻击的途径?


问题答案:

您可以通过询问数据库哪些列对于给定的数据库表有效来使用动态白名单。这是一个附加的sql查询,但是安全性很好。

select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA = :databaseName
  and TABLE_NAME = :tableName

获取该结果,然后确保所有动态列名称都在结果集中。

我认为包含在中INFORMATION_SCHEMA.COLUMNS,因此它们应该只是简单的工作。

然后,在组装动态sql时,只需在经过验证的列名周围使用反引号即可(我假设您使用的是纯ascii列名,否则可能有其他注意事项)。



 类似资料:
  • 虽然可以在Java 8中序列化lambda,但强烈建议不要这样做;甚至不鼓励序列化内部类。给出的原因是lambdas可能无法在另一个JRE上正确反序列化。然而,这是否意味着有一种方法可以安全地序列化lambda? 例如,假设我定义一个类如下: 如果像这样声明了类的实例,则不应序列化它: 但如果我创建一个这样的类实例,会怎么样: 现在序列化是安全的吗?我的直觉告诉我,是的,它应该是安全的,因为没有理

  • 问题内容: 我目前正在建立一个查询,其中字段/列和值部分都可能由用户输入的数据组成。 问题是转义字段名。我正在使用准备好的语句来正确地转义和引用值,但是在转义字段名时遇到了麻烦。 mysql_real_escape_string对我们来说需要mysql连接资源,因此被排除在外 PDO :: quote在字段名周围添加引号,这也使它们在查询中无用 加斜杠有效,但不是很安全 任何人都知道最好的方法是在

  • 问题内容: 我有一个CSV导入到我们的数据库。“列”之一包含 应 为INT的数据,但某些行的数字仅落在BIGINT范围内(因为它们是来自我们合作伙伴之一的测试数据)。我们在内部存储INT,不希望更改。 我想从BIGINT安全地转换为INT。安全地说,如果发生算术溢出,则不会出现任何错误。如果转换成功,我希望我的脚本继续进行。如果失败,我希望它短路。我似乎无法弄清楚正确的语法。这就是我得到的: 我曾

  • BECOMING SECURE AND ANONYMOUS 今天,几乎我们在互联网上做的一切都被跟踪。无论是谷歌跟踪我们的在线搜索、网站访问和电子邮件,还是美国国家安全局(NSA)对我们的所有活动进行编目,无论谁在跟踪我们,我们的每一次在线活动都会被记录、编入索引,然后被挖掘出来,以造福他人。普通个人,尤其是黑客,需要了解如何限制这种跟踪,并在网上保持相对匿名,以限制这种无处不在的监视。 在本章中

  • 问题内容: Java中最惯用的方法是验证从转换long为int不会丢失任何信息? 这是我当前的实现: 问题答案: Java 8已添加了一个新方法来完成此任务。 会抛出一个溢出的情况。 看到: Java 8中已添加了其他几种溢出安全方法,它们的结尾是精确。 例子: Math.incrementExact(long) Math.subtractExact(long, long) Math.decrem

  • 问题内容: 我想转换一个从Java中8是这样的: 因为我有一个字符串列表,所以我想创建一个Map,键是列表的字符串,值是Integer(零)。 我的目标是计算字符串列表的元素(在我的代码中稍后)。 我知道以“旧”方式进行转换很容易; 但我想知道是否还有Java 8解决方案。 问题答案: 如前所述,参数必须是函数,因此必须更改为(可以使用任何其他参数名称代替)。 但是请注意,如果中存在重复项,此操作