0

簡単な質問ですが、私は PHP の構文に詳しくないので、次のコードが SQL インジェクション攻撃から安全かどうか疑問に思っています:

private function _getAllIngredients($animal = null, $type = null) {
    $ingredients = null;
    if($animal != null && $type != null) {
        $query = 'SELECT id, name, brief_description, description, 
                         food_type, ingredient_type, image, price,
                         created_on, updated_on
                    FROM ingredient
                   WHERE food_type = \'' . $animal . '\'
                     AND ingredient_type =\'' . $type . '\';';
        $rows = $this->query($query);

        if(count($rows) > 0) {

などなど

私は少しグーグルで調べましたが、インジェクションセーフコードは WHERE food_type = \'' とは異なっているようです。$動物。ここでは「\」構文が使用されています。

申し訳ありませんが、ここで使用されている PHP または MySQL のバージョンがわかりません。また、サードパーティのライブラリが使用されている場合は、専門知識をお持ちの方から情報を提供していただけますか?

アップデート

\ はステートメントでどのような目的に使用されますか?:

WHERE food_type = \'' . $animal . '\'  

私のグーグルで、私は多くの参照に出くわしましたmysql_real_escape_string...これはSQLインジェクションやその他の不快感から保護する機能ですか?

クラス宣言は次のとおりです。

class DCIngredient extends SSDataController

mysql_real_escape_stringでは、そこに含まれていると考えられるでしょうか。
SSDataController の実装を確認する必要がありますか?

4

7 に答える 7

1

$animalはい、これは'; drop table blah; --SQLインジェクションに対して脆弱です。

インジェクションが発生しないように、パラメーターをバインドする準備済みステートメントの使用を検討する必要があります。

http://us3.php.net/pdo.prepared-statements

于 2009-07-18T01:24:07.040 に答える
1

はい、このコードは SQL インジェクションに対して脆弱です。

"\" は引用符のみをエスケープします。そうしないと、PHP は引用符が (sql-) 文字列を終了すると見なします。

また、SQL 文字列全体をSSDataControlerクラスに渡すと、準備された文字列が挿入された場合、攻撃を回避することはできなくなります。

そのため、 SSDataControlerクラスは設計上壊れています (脆弱です)。

次のようなより安全なものを試してください。

$db_connection = new mysqli("host", "user", "pass", "db");
$statement = $db_connection->prepare("SELECT id, name, brief_description, description, 
                     food_type, ingredient_type, image, price,
                     created_on, updated_on
                FROM ingredient
               WHERE food_type = ?
                 AND ingredient_type = ?;';");
$statement->bind_param("s", $animal);
$statement->bind_param("s", $type);
$statement->execute();

bindメソッドを使用することで、パラメーターのタイプ (文字列の場合は s、整数の場合は i など) を指定でき、SQL インジェクションについて二度と考える必要はありません。

于 2009-07-18T01:24:47.757 に答える
1

いずれにせよ mysql_real_escape_string を使用して、テーブルをドロップしたり、その他の任意のコードを実行したりする可能性のあるものをすべて取り除くこともできます。

SQL ステートメントのどこに値を入力しても問題ありません。いつでも「;」を使用できます。これにより、ステートメントがすぐに終了し、新しいステートメントが開始されます。これは、ハッカーがやりたいことのほとんどを実行できることを意味します。

安全のために、値を mysql_real_escape_string($variable) でラップするだけです。そう:

WHERE Something='".mysql_real_escape_string($variable)."'
于 2009-07-18T01:27:06.740 に答える
0

それが私的な機能なら、一種の。SQL を挿入するソースにアクセスできる人が心配な場合は、その目的を達成するためのより簡単な方法があります。mysql_real_escape_string()安全のために、使用前に引数を渡すことをお勧めします。このような:

private function _getAllIngredients($animal = null, $type = null) {
        $animal = mysql_real_escape_string($animal);
        $type   = mysql_real_escape_string($type);
        ...
        }

さらに安全にするために、代わりにフラグをhtmlentities()付けて渡すこともできます。これは、これらの DB エントリのコンテンツをタグENT_QUOTESに入れている場合を除き、XSS タイプのものに対する保護にも役立ちます。<script>

しかし、あなたができる最も安全な方法は、独自のサニタイズ関数を作成することです。これにより、さまざまな手法を最大限に活用し、将来発生する可能性のある新しい脅威から簡単に保護することもできます.

于 2009-07-18T01:29:53.447 に答える
0

Re: 更新

\'' は、変数を引用符で囲むのに役立ちます。これにより、変数が SQL を通過するときに、空白によって何も区切られません。IE: Something=Cold Turkey はエラーで終了しますが、Something='Cold Turkey' はエラーになりません。

さらに、クラス拡張は、MySQL ステートメントをまとめる方法には影響しません。

于 2009-07-18T01:33:53.863 に答える
0

脆弱です。私が合格した場合: '\'; DROP TABLE 成分; \'' を $type として選択、プーフ、さようなら成分テーブル。

于 2009-07-18T01:25:17.880 に答える
-2

ユーザーまたはサードパーティが $animal の値をシステムに挿入する場合 (おそらくそうします)、SQL インジェクションに対して脆弱です。

これを回避する方法は、

private function _getAllIngredients($animal = null, $type = null) {
    $ingredients = null;
    if($animal != null && $type != null) {
        $query = 'SELECT id, name, brief_description, description, 
                         food_type, ingredient_type, image, price,
                         created_on, updated_on
                    FROM ingredient
        $rows = $this->query($query);
        if(count($rows) > 0) {
        if($rows['animal'] == $animal && $rows['ingredient_type'] == $type) {

注:SQLからWHEREステートメントを削除し、ループするifステートメントを追加しました

于 2009-07-18T01:28:19.703 に答える