首页 > 后端开发 > php教程 > 准备好的语句可以参数化 SQL 中的表名吗?

准备好的语句可以参数化 SQL 中的表名吗?

Barbara Streisand
发布: 2024-12-24 21:17:37
原创
308 人浏览过

Can Prepared Statements Parameterize Table Names in SQL?

参数化语句可以处理表名称吗?

您在尝试在准备好的语句中参数化表名称时遇到了问题。分隔旨在防止 SQL 注入的变量会导致错误。

您提供的代码包含函数 insertRow,该函数尝试将新表名绑定为问号语句。

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
    $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}
登录后复制

不幸的是,在准备好的语句中参数化表名是不可能的。准备好的语句仅允许将参数绑定到 SQL 语句的“值”元素。表名不是运行时值,会改变语句的有效性,从而可能改变其含义。

即使像 PDO 这样的数据库接口允许在任何地方进行占位符替换,表占位符的值也将是包含在SQL,导致无效的 SQL。

为了防止 SQL 注入,必须使用表白名单并根据此列表检查用户输入。您的代码应类似于以下内容:

if (in_array($mytable, $whitelist)) {
    $result = $db->query("SELECT * FROM {$mytable}");
}
登录后复制

以上是准备好的语句可以参数化 SQL 中的表名吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板