代码之家  ›  专栏  ›  技术社区  ›  user9050678

PHP pdo mysql的默认字符集是什么

  •  0
  • user9050678  · 技术社区  · 7 年前

    我在这页上读到了关于二阶MySQL注入的内容 Are PDO prepared statements sufficient to prevent SQL injection?

    它带来了许多关于 charset

    在我的代码中,我在进行查询时从不使用字符集,

    我就是这么做的

    $pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD, [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_PERSISTENT => false]);
    $stmt = $pdo->prepare("SELECT * FROM keywords  WHERE keyword_name = ? || keyword_name = ?");
    $stmt->execute(["hello","world"]);
    rows = $stmt->fetchAll();
    // show the data on webpage
    $pdo = null;
    

    我发现有两种不同的方法 set 字符集

    $pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);
    

    $pdo->exec("set names utf8");
    

    PDO准备的语句足以防止SQL注入吗? . 第一种方法应该用来防止二阶SQL注入。。。

    never set 字符集 在我的代码中(如第一个代码所示),所以我有几个问题

    1. 对于我没有设置任何字符集的第一个代码,默认的字符集是什么,安全吗?
    2. ut8_general_ci
    3. utf8 用于二级注入的安全字符集,即 $pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);
    1 回复  |  直到 7 年前
        1
  •  2
  •   Bill Karwin    7 年前

    character_set_client 是MySQL用于客户端发送的查询和数据的字符集。

    MySQL 5.5、5.6和5.7中的默认值是utf8,8.0中的默认值是utf8mb4。

    它也可以在您的应用程序中进行全局更改我的.cnf选项文件,或每个会话 SET NAMES 声明。

    最好在连接时显式设置选项,这样就不必假定它的默认值。


    请回复您的意见:

    字符集风险是由于某些多字节字符集造成的。通常插入反斜杠来转义文字引号字符。但在某些字符集中,反斜杠字节合并到前面的字节中,形成多字节字符。这使得这句话没有被取代。

    它依赖于开发人员相信已经安全地保存到数据库中的数据在某种程度上是“安全的”,可以在没有适当参数化的情况下使用。

    二阶SQL注入的一个例子是,一个人的姓是“O'Reilly”,代码读取这个名字并在随后的查询中使用,这只是偶然的,而不是恶意的。

    $name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
    $sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";
    

    如果名称包含一个文字撇号,则会弄乱该示例中的第二个查询。