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 に関する少なくとも 2 つの深刻な問題を発見しました。

  • バグ 46808は深刻な問題で、少なくとも 3 年間さまざまな方法で報告されており、まだ修正されていません。LONGTEXT 列を使用する場合、問題が発生する可能性があります。と
  • mysqli が失敗する奇妙なバグが発生することがあります (「カナリア形式」などのエラーに関する無意味なメッセージが表示されます)。この時点で ((1) と合わせて) mysqli をあきらめなければなりませんでした。

おそらく PDO の方が適しています。自分?私はちょうどmysqlに戻りました。文字列のエスケープなどに注意している限り、単純さについて議論するのは難しいです。

于 2009-01-26T21:57:49.073 に答える
1

データベースからデータを取得するときにバインドによってアプリケーションがより安全になるかどうかはわかりませんが、SQL インジェクションのリスクがないため、DB に書き込むときに役立ちます。

DB からの読み取りにどのようなアプローチをとってもhtmlspecialchars()、データが完全にクリーンであると完全に確信できない場合は、出力をエスケープする必要があります。Ionut へのコメントで提案されているように、バインドされたステートメントはこれを処理しません。データを出力する場所に適用できる方法でデータをエスケープする必要があります。PHP/MySQL は、HTML ドキュメント/シェル コマンド/json/etc に出力しているかどうかを認識していません。どの出力メディアに対してもデータを安全にする魔法のエスケープ方法はありません。

于 2009-01-26T15:03:57.503 に答える
0

特定のPHPバージョンで、いくつかのバッファオーバーフローの脆弱性が報告されていることを知っています。でも、どのバージョンかはわかりません。したがって、これに基づいて、入力が適切にフィルタリングされていないと仮定すると、printfを使用する方がechoを使用するよりも安全性が低い可能性があります。ただし、コンテキストに大きく依存します。

于 2009-01-26T15:43:45.270 に答える
0

XML/HTML ページを提供するときは、出力をエスケープする必要があります。そのためにはhtmlspecialcharsまたはhtmlentitiesを使用します。とにかく、データソースとそのデータを取得するために使用される API に関係なく、出力をエスケープする必要があります。

于 2009-01-26T14:44:10.337 に答える