【问题标题】:converting from mysql to mysqli - outputting variables从 mysql 转换为 mysqli - 输出变量
【发布时间】:2009-01-26 14:33:36
【问题描述】:

我一直在 PHP 中使用 mysql api,现在正在转换为 mysqli 以提高安全性。我看到的示例语法使用 printf,我想知道这是否有必要。目前我使用echo,像这样:

echo "<h1>".$row['ARTICLE_NAME']."</h1>
<div id='leftlayer' class='leftlayer'>
<p><strong>Username: </strong>".$row['USERNAME']."
<p><strong>Article Number: </strong>".$row['ARTICLE_NO']."
<p><strong>Subtitle: </strong>".$row['SUBTITLE']."
<p><strong>Auction Start: </strong>".$row['ACCESSSTARTS']." 
</div>";

由于使用 mysqli 你必须将变量绑定到结果,我这样做是这样的:

$getRecords->bind_result($ARTICLE_NO, $ARTICLE_NAME, $SUBTITLE$, $CURRENT_BID, $START_PRICE, $BID_COUNT, $QUANT_TOTAL, $QUANT_SOLD, $ACCESSSTARTS, $ACCESSENDS, $ACCESSORIGIN_END, $USERNAME, $BEST_BIDDER_ID, $FINISHED$, $WATCH$$, $BUYITNOW_PRICE, $PIC_URL, $PRIVATE_AUCTION, $AUCTION_TYPE, $ACCESSINSERT_DATE, $ACCESSUPDATE_DATE, $CAT_DESC$, $CAT_PATH, $ARTICLE_DESC, $COUNTRYCODE, $LOCATION$, $CONDITIONS, $REVISED$, $PAYPAL_ACCEPT, $PRE_TERMINATED, $SHIPPING_TO, $FEE_INSERTION, $FEE_FINAL$, $FEE_LISTING, $PIC_XXL$, $PIC_DIASHOW, $PIC_COUNT, $ITEM_SITE_ID); 

并且想知道我是否可以简单地将我对 $row 的引用替换为绑定变量,例如:

  <p><strong>Username: </strong>".$USERNAME."

这种方法是否存在安全问题,或者是否可以

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    我同意 mysqli 至少在原则上比 mysql 包更好,因为您可以绑定参数,这对于查询执行来说更安全且更好。话虽如此,我发现 mysqli 至少存在两个严重问题:

    • Bug 46808 是一个严重的问题,至少三年以不同的方式报告了它,但仍未解决。如果你想使用 LONGTEXT 列,你可能会遇到问题;和
    • 有时我会在 mysqli 失败时遇到奇怪的错误(关于“金丝雀形式”或类似错误的无意义消息)。正是在这一点上(结合(1)),我才不得不放弃mysqli。

    PDO 可能是更好的选择。我?我刚回到mysql。只要您小心转义字符串等,就很难与简单性争论。

    【讨论】:

    • 至于这个奇怪的错误,它(仍然)存在真是太神奇了......我一直在忙于设置所有内容,并从上周开始将所有内容重写为 MySQLi,直到我来跨越这个 LONGTEXT 问题。现在我回到第一方。
    【解决方案2】:

    我不确定当您从数据库中获取数据时绑定是否会使您的应用程序更安全,但是当您写入数据库时​​它会有所帮助,因为您不会有 SQL 注入的风险。

    无论您采用何种方法从数据库中读取数据,如果您不能完全确定数据是否完全干净,您仍然需要使用 htmlspecialchars() 转义输出。绑定语句不会像您在对 Ionut 的评论中建议的那样处理此问题 - 您必须以适用于输出位置的方式转义数据。 PHP/MySQL 不知道您是否正在打印到 HTML 文档/shell 命令/json/等。没有一种神奇的转义方法可以使任何数据对任何输出介质都安全。

    【讨论】:

    • 数据库中的信息都不是用户输入的结果,我在一个字段上调用 ​​htmlentities。我想知道是否使用类似 printf("%s %s\n", $col1, $col2);比 echo $col1; 更安全; ?
    • 那不会更安全了。如果您信任输入,请不要转义它,但请注意,它很可能曾经被用户输入过
    • 实际上“最有可能”可能并不准确,但我只是想确保您不会因为用户没有输入数据而假设数据是安全的
    【解决方案3】:

    在提供 XML/HTML 页面时,您应该转义输出。为此使用htmlspecialcharshtmlentities。无论如何,无论数据源和用于获取该数据的 API 如何,您都应该转义输出。

    【讨论】:

    • 为什么?数据不是 html 或有特殊字符,我正在使用绑定语句为我处理?
    • 如果您的应用程序接受用户输入,而且很可能这样做,您应该转义输出。不转义输出可能会导致 XSS 攻击 (en.wikipedia.org/wiki/Cross-site_scripting) 或无效的 HTML,这可能会显示与您想要的不同的数据。边界不能解决这个问题。
    • 如果数据在存入数据库之前已经过适当过滤,则无需对输出进行过滤。
    • Jacco 是对的,但在将数据存储到数据库之前,不应对其进行转义。这些数据并不总是要显示在 HTML 页面中。您也可以生成 Excel 文件,此时您的数据将不会以您想要的方式显示。
    • 有时将转义的数据存储到数据库中是最好的解决方案。它可以防止您每次要显示数据时都必须对其进行转义。
    【解决方案4】:

    我知道某些 PHP 版本报告了一些缓冲区溢出漏洞。虽然不知道是哪个版本。因此,基于此,假设输入未正确过滤,使用 printf 可能不如使用 echo 安全。不过很大程度上取决于上下文。

    【讨论】:

    猜你喜欢
    • 2013-12-06
    • 2012-05-18
    • 2014-07-02
    • 1970-01-01
    • 2019-02-25
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多