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

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

有帮助吗?

解决方案

我不知道该绑定使您的应用程序时,你正在从数据库中的数据更加安全,但是当你正在编写到DB它会帮助你将没有任何SQL注入的风险。

您需要从数据库读取无论方法,你还需要,如果你不完全肯定的是,数据是完全干净的使用htmlspecialchars()逃脱输出。如您在到约努茨您的评论建议的约束语句不会处理这个 - 你要逃避的方式,适用于你在哪里输出的数据。 PHP / MySQL不知道你是否正在打印到HTML文档/ shell命令/ JSON的/ etc。没有使任何数据安全的任何输出介质的神奇逃生方法。

其他提示

我同意)的预是--至少在原则--比mysql包,因为你可以结合参数,这既是更安全和更好地查询执行。这就是说,我发现至少两个严重的问题)的预:

  • 错误46808 是一个严重的问题,已报告在不同的方式 至少三年 并且仍然没有被固定。如果你想使用LONGTEXT列的可能有问题;和
  • 有时候我只得到奇怪的错误在哪里)的预发生故障(与毫无意义的信息中的错误"形式的金丝雀"或somesuch).这是在这一点(结合(1)),我只是不得不放弃)的预.

公设辩护人可能是一个更好的选择。我?我刚回到mysql.这是很难说的简单,只要你小心逃串等。

在提供 XML/HTML 页面时,您应该转义输出。用于该用途 html特殊字符 或者 html实体. 。无论如何,无论数据源和用于获取该数据的 API 是什么,您都应该转义输出。

我知道,有些缓冲区溢出漏洞已经报道了某些PHP版本。我不知道是哪个版本,虽然。因此,基于这一点,假设输入没有正确过滤,使用的的printf 可以比使用的回声不太安全。取决于上下文很多虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top