Php 准备好的陈述和逃避

Php 准备好的陈述和逃避,php,mysql,database,mysqli,Php,Mysql,Database,Mysqli,我已经读了很多遍了,只是想澄清一下(我想我是糊涂了) 今天我切换到mysqli,开始使用准备好的语句 我准备好的陈述的例子 函数读取($table,$var){ 如果($stmt=mysqli\u prepare($link,“SELECT*FROM?WHERE`uid`=?”){ mysqli_stmt_bind_param($stmt,“si”,$table,$var); mysqli_stmt_execute($stmt); 返回mysqli_fetch_assoc($stmt); }否则

我已经读了很多遍了,只是想澄清一下(我想我是糊涂了)

今天我切换到mysqli,开始使用准备好的语句

我准备好的陈述的例子

函数读取($table,$var){
如果($stmt=mysqli\u prepare($link,“SELECT*FROM?WHERE`uid`=?”){
mysqli_stmt_bind_param($stmt,“si”,$table,$var);
mysqli_stmt_execute($stmt);
返回mysqli_fetch_assoc($stmt);
}否则{
回音“警报(“出了问题”);
}
}
$info=read(“用户”,“会话['uid]”);
$char=read(“characters”,会话['uid']);

我还需要逃避什么吗?我知道,我知道,我在任何地方都读到过,当使用准备好的语句时,你不需要逃避,但还有一些问题让我担心。

你查询的唯一问题是你不能将表名作为参数传递。只有值可以参数化。因此,另一种方法是将表名与查询连接起来

"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?"

查询的唯一问题是无法将tableName作为参数传递。只有值可以参数化。因此,另一种方法是将表名与查询连接起来

"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?"

首先,这些代码根本不起作用

所以,实际上有两个问题

  • 我是否需要对绑定参数执行任何其他转义
  • 没有

  • 如何在查询中安全地插入标识符
  • 视情况而定。只要在代码中硬编码了表名,就可以按原样插入。
    但是如果它来自不可信的来源,你必须使用白名单过滤掉它。 我已经在另一个答案中解释过了


    至于你联系到的问题,第二个问题无关紧要,而第一个问题毫无意义。LIKE应该返回许多行,因此,要么根本不用LIKE,要么不用担心它(在安全方面)。虽然在返回正确结果方面,您可能希望转义在LIKE中具有特殊含义的字符,但我根本不会使用LIKE进行搜索。

    首先,这段代码不起作用

    所以,实际上有两个问题

  • 我是否需要对绑定参数执行任何其他转义
  • 没有

  • 如何在查询中安全地插入标识符
  • 视情况而定。只要在代码中硬编码了表名,就可以按原样插入。
    但是如果它来自不可信的来源,你必须使用白名单过滤掉它。 我已经在另一个答案中解释过了


    至于你联系到的问题,第二个问题无关紧要,而第一个问题毫无意义。LIKE应该返回许多行,因此,要么根本不用LIKE,要么不用担心它(在安全方面)。虽然在返回正确结果方面,您可能希望转义在LIKE中具有特殊含义的字符,但我根本不会将LIKE用于搜索目的。

    这是一个注入问题吗?如果downvoter可以解释如何将
    tableName
    参数化,我将删除此答案。很遗憾,请参见和@Wulf,您仍然需要手动对其进行消毒。在表名周围添加反勾号可能有助于防止攻击,但我不能完全保证。@Wulf:它与任何不转义插值数据的查询一样受SQL注入的影响。您可能希望确保表名不包含任何古怪的字符,和/或实际上是表名。(
    mysqli\u real\u escape\u string
    适用于值,但标识符遵循的规则稍有不同。特别是,它们由反勾号分隔,而反勾号
    mysqli\u real\u escape\u string
    不会转义。)这是要注入的吗?如果下行表决器可以解释如何将
    tableName
    参数化,我将删除此答案。请参阅和@Wulf不幸的是,您仍然需要手动对其进行消毒。在表名周围添加反勾号可能有助于防止攻击,但我不能完全保证。@Wulf:它与任何不转义插值数据的查询一样受SQL注入的影响。您可能希望确保表名不包含任何古怪的字符,和/或实际上是表名。(
    mysqli\u real\u escape\u string
    适用于值,但标识符遵循的规则稍有不同。特别是,它们由反勾分隔,而反勾不转义。)我一点也不理解你的最后一段。。。什么是“喜欢”?你是指我贴的问题吗?我一点也不懂你最后一段。。。什么是“喜欢”?你是指我发布的问题吗?