我一直在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."
此方法是否存在安全问题,或者没问题
答案 0 :(得分:2)
我同意mysqli - 至少在原理上 - 比mysql包更好,因为你可以绑定参数,这对于查询执行来说更安全和更好。话虽这么说,我发现至少有两个与mysqli有关的严重问题:
PDO可能是更好的选择。我?我刚回到mysql。只要你小心逃脱字符串等,就很难与简单性争论。
答案 1 :(得分:1)
我不确定当您从数据库中获取数据时,绑定会使您的应用程序更安全,但是当您写入数据库时它会有所帮助,因为您不会有SQL注入的风险。
无论您采用什么方法从数据库中读取数据,如果您不完全确定数据是否完全干净,仍需要使用htmlspecialchars()
来转义输出。正如您在对Ionut的评论中所建议的那样,绑定语句将不会处理此问题 - 您必须以适用于输出数据的方式转义数据。 PHP / MySQL不知道您是否要打印到HTML文档/ shell命令/ json / etc。没有一种魔术转义方法可以使任何数据对任何输出媒体都安全。
答案 2 :(得分:0)
在提供XML / HTML页面时,您应该转义输出。使用htmlspecialchars或htmlentities。无论如何,无论数据源和用于获取数据的API,都应该转义输出。
答案 3 :(得分:0)
我知道某些PHP版本已经报告了一些缓冲区溢出漏洞。我不知道哪个版本。因此,基于此,并假设未正确过滤输入,使用 printf 可能不如使用 echo 安全。在很大程度上取决于上下文。