0

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

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

4 回答 4

2

我同意 mysqli - 至少在原则上 - 比 mysql 包更好,因为您可以绑定参数,这既更安全,也更适合查询执行。话虽如此,我发现 mysqli 至少有两个严重的问题:

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

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

于 2009-01-26T21:57:49.073 回答
1

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

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

于 2009-01-26T15:03:57.503 回答
0

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

于 2009-01-26T14:44:10.337 回答
0

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

于 2009-01-26T15:43:45.270 回答