php - ctype_alnum 对抗 SQL 注入(inject)

标签 php sql security sql-injection

准备好的语句不允许参数化表名。为了确保无法插入任何代码,我想使用 ctype_alnum 来验证进入数据库模块的所有表名(删除下划线后),以保护应用程序免受其他部分错误的影响。

function insert($table) {
    if(!ctype_alnum(str_replace("_", "", $table)))
        throw new Exception("Invalid table name");
    $sql = "INSERT INTO $table VALUES value=:value";
    #... prepare and execute
}

是否存在这不足以抵御的攻击?我在想例如multibyte character exploits

最佳答案

我不知道在这种情况下会发生什么攻击,但我不会像你那样做,因为 $table 也可以包含可能不存在的表。

你应该有你接受的 $tables 的白名单,所以我宁愿这样做:

function insert($table)
{
    $table = trim($table);

    if (!ctype_alnum(str_replace("_", "", $table))
        || !in_array($table, $this->tables)
    ) {
        throw new Exception("Invalid table name");
    }


    $sql = "INSERT INTO $table VALUES value=:value";

    echo $sql;
    #... prepare and execute
}

它将确保您的代码安全,如果有人拼错了表名,您甚至不会尝试执行代码。事实上,在这种情况下,您可以在检查值是否存在于白名单数组中时从条件中删除 ctype_alnum

关于php - ctype_alnum 对抗 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747875/

相关文章:

javascript - CSS 的这种使用会使我的网站受到攻击吗?

php - 在数据库表中搜索电话号码

php - SQL 结果作为 PHP 数组

java - ResultSet.getBlob() 在 ojdbc8 上非常慢

sql - 使用查询结果更新现有表 SQL Server 2012

php - 访问 https 资源时,PHP 的 fopen() 是否可以防止典型的攻击?

security - 我们是否需要 X-Pack 来启用 Elasticsearch 和 kibana 中的安全性?

php - Paypal SandBox IPN 总是返回 INVALID

php - 强制下载 CSV 文件

php - Django 唯一 URL 重定向问题