【问题标题】:Escaping Characters in Email with PHP/MYSQL使用 PHP/MYSQL 转义电子邮件中的字符
【发布时间】:2011-04-18 22:48:34
【问题描述】:

当我对 PHP 使用 mail() 函数时,我无法弄清楚字符转义背后的逻辑。我使用的是 PHP 5.2,magic_quotes_qpc 为 ON,runtime/sybase 为 OFF。这就是问题所在。

  1. A 有一个接受文本输入的表单,我使用 mysqli_real_escape 转义特殊字符,以便在 SQL 语句中使用,如下所示:

    $text = mysqli_real_escape_string($dbc, $_GET['text']);
    
  2. 如果我输入以下评论“我不会吃那个!”进入表格,我在数据库中看到以下内容 - “我不会吃那个!”,这是我所期望的。如果我添加回车/换行,我在 phpMyAdmin 的数据库字段中看到的只是回车和换行,没有特殊字符(即没有“\r\n”或类似的东西)。

  3. 当我使用mail 函数发送消息(即mail($to, $subject, $text, $headers))时,我在电子邮件正文中收到了类似这样的奇怪信息:

    I wouldn\\\'t eat that\r\nI couldn\\\'t eat that
    

归根结底,我只是希望电子邮件输出的格式与表单输入完全相同,换句话说:

I wouldn't eat that
I couldn't eat that

我不确定为什么撇号前有三次转义以及为什么我的电子邮件中会出现 \r\n。

【问题讨论】:

    标签: php email escaping mysql-real-escape-string


    【解决方案1】:

    魔术引号不好。不要使用它们。

    http://www.php.net/manual/en/security.magicquotes.whynot.php

    如果您使用魔术引号 mysqli_real_escape_string,那么这就解释了为什么字符串被双重转义。

    $text = mysqli_real_escape_string($dbc, $_GET['text']); // $_GET['text'] is already escaped
    
    ...
    
    mail($to, $subject, $text, $headers); // Now $text contains a doubly escaped string
    

    关闭魔术引号(确保您的应用可以处理)并且仅在插入数据库时​​转义(如果使用参数化查询,即 PDO 或 mysqli,则无需永远转义!) .

    作为最后的手段,您可以尝试在字符串上使用stripslashes

    【讨论】:

    • Webbiedave - 感谢您的建议。我关闭了magic_quotes 并通过phpinfo 确认它已关闭。我知道它已关闭,因为当我尝试在不使用 mysqli_real_escape_string 的情况下在表单中输入撇号时出现错误。我尝试再次打印我的消息,但我仍然看到转义的撇号和换行符/回车符返回符号(正文电子邮件仍然 =“我不会吃那个\r\n\r\n我不能吃那个\r\n\r\n")。我还需要在离开数据库的过程中转换消息吗?
    • 你可以做一个简单的$output = str_replace("\\r\\n", "\r\n", $output);。虽然这可能不是最好的方法,但它会起作用。
    • minitech - 你提出这个建议很有趣,因为我在网络上的其他地方也有类似的东西。我也试过了,它奏效了。我的问题是为什么你必须这样做? \r\n 命令在通过邮件功能时是否被双重转义?我不清楚发生了什么。
    【解决方案2】:

    从 MySQL 数据库中检索结果时,您需要在输出中使用stripslashes(),否则出于某种原因,它们仍会包含转义斜杠。

    编辑:

    然后,您可以使用$theOutput = str_replace("\\r\\n", "\r\n", $theOutput); 来修复换行符。

    【讨论】:

    • 不,你不需要那个。这是一种不好的做法,源于同时使用 magic_quotes 和真正的转义的混淆。您需要准确地将数据插入数据库,而不是在之后尝试清理它。正确插入的数据将按预期从数据库中返回。
    • 我没有打开魔术引号,我仍然需要这样做。
    • 那么您的设置或数据库功能使用可能有其他问题。
    • minitech 和 mario - 感谢您的帮助。请查看我上面的更新评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多