5

これはばかげた質問かもしれません。あるいは、私のハッキングスキルは限られているかもしれません(私はそれらをまったく練習していません)。

次のようなクエリがあります。

<?php
$query =<<<eot
    SELECT      table_x.field1,
                table_x.field2,
                table_y.*,
                table_z.field4
    FROM        (
                    SELECT ...
                ) as table_y
    LEFT JOIN   table_x
    ON          table_x.field1 = table_y.field_x
    LEFT JOIN   table_z
    ON          table_z.field1 = table_y.field_z
    WHERE       table_x.field3 = '$something'
    AND         table_z.field4 = '1'
    AND         table_z.field5 = '2'
eot;
?>

$something使用する前に他にもたくさんのテストを行っています。たとえば、 $something = explode(' ',$something);(後で文字列になります)いずれもインジェクションを防ぐつもりはありませんが、実際のクエリに対して特定のインジェクションをそのまま取得するのは困難です。ただし、方法はいくつかあります。スペースをまだ有効なものに置き換えるのがいかに簡単かは誰もが知っています。

したがって、潜在的に有害なSQLの一部をそこに到達させることは実際には問題で$somethingはありません...しかし、元のクエリ文字列が複数行である場合、残りのクエリ文字列にコメントを付ける方法はありますか?

AND table_z.field4 = '1'使用してコメントする;--ことはできますが、以下をコメントすることはできませんAND table_z.field5 = '2'

複数行のコメント/*を閉じずに開くこと、またはそのように見えるものを開いて、インジェクションが複数行のクエリを無視できるようにすることは可能ですか?

4

4 に答える 4

5

安全ではありません。残りをコメントアウトできない場合でも、プレフィックスとしてSELECT * FROM my_table WHERE 1=1を付けることができます。

于 2010-06-01T17:37:02.107 に答える
5
$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1";
于 2010-06-01T17:37:44.847 に答える
3

安全のために準備されたステートメントを使用します。

http://www.php.net/manual/en/pdo.prepare.php

入力が十分にクリーンアップされていない場合、文字列補間には常にコードインジェクションのリスクがあります。

任意のコードが実行される可能性を排除することは、より簡単で安全な方法です。

于 2010-06-01T17:45:37.030 に答える
2

@Techpriester:それは準備されたステートメントが何であるかではありません。

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html(古いバージョン、同じもの)

PDOは「ステートメントを準備する」データベース抽象化レイヤーですが、準備されたステートメントはまったく異なるものです。

于 2010-06-01T19:41:31.287 に答える