从mysql转换为mysqli - 输出变量

时间:2009-01-26 14:33:36

标签: php mysql mysqli

我一直在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."

此方法是否存在安全问题,或者没问题

4 个答案:

答案 0 :(得分:2)

我同意mysqli - 至少在原理上 - 比mysql包更好,因为你可以绑定参数,这对于查询执行来说更安全和更好。话虽这么说,我发现至少有两个与mysqli有关的严重问题:

  • Bug 46808是一个严重的问题,已经以不同的方式报告至少三年,但仍未修复。如果您想使用LONGTEXT列,可能会出现问题;和
  • 有时我只是得到了mysqli失败的奇怪错误(关于“金丝雀形式”或其他一些错误的无意义消息)。在这一点上(与(1)相结合)我不得不放弃mysqli。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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