题
我一直在 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.这是很难说的简单,只要你小心逃串等。
我知道,有些缓冲区溢出漏洞已经报道了某些PHP版本。我不知道是哪个版本,虽然。因此,基于这一点,假设输入没有正确过滤,使用的的printf 强>可以比使用的回声强>不太安全。取决于上下文很多虽然。
不隶属于 StackOverflow