2

重複の可能性:
究極のクリーン/セキュア機能

コーディングのいくつかでいくつかの問題に遭遇しました。スクリプトで sql インジェクションの可能性を不本意ながら発見しましたが、問題を解決できないようです。

スクリプトのコーディングは問題なくできていると言えますか。データベース インジェクションがどのように発生するのか、どのように機能するのか、どのように防止するのかまったくわかりませんが、クリーニング機能が意図したとおりに機能しないことは明らかです。

問題のあるコードのチャンクは次のとおりです。id の後に次を追加する、MySQL エラーが吐き出されます。これは、私のコードが脆弱であることを意味することについてよく読んでいます。

&id=369';

そのため、コンマとセミコロンを追加するだけで MySQL クエリが壊れてしまい、望ましくありません。クエリを処理してデータを表示するコードは次のとおりです。

$id = $this->clean($_GET['id']);
#$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_STRING);
$pm_query = mysql_query("SELECT * FROM `staff_pm` WHERE `id` = '{$id}' AND `status` IN(0, 1)") or die(''.mysql_error());

だから私はPHP内の統合関数の1つを試しましたが、それは同じSQLエラーを吐き出します.これは私が事前に言われた私のクリーニング関数です:

function clean( $str )
{
return mysql_real_escape_string( htmlspecialchars( trim( $str ) ) );
}

この問題に関するあなたの意見を本当に知りたかったのですが、私のコーディングがこの種の脆弱性を探している人に利用されるのではないかと常に心配しています.それをよりよく保護するためのいくつかのテクニック。

PDO に変換するように言われましたが、変換するのは大変な作業のように思えます。その前に、アプリケーションを再作成するまで待ってから、よりオブジェクト指向のアプローチに移行します。

私が受け取るSQLエラーはこれです:

SQL 構文にエラーがあります。「\」の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。1 行目のAND statusIN(0, 1)'

助けてくれてありがとう、本当に感謝しています。

よろしく

4

3 に答える 3

2

この男が言ったこと: 準備されたステートメントとパラメーター化されたクエリを使用します。

PHPでSQLインジェクションを防ぐにはどうすればよいですか?

于 2012-08-02T14:16:36.960 に答える
1

私には、あなたのid列は整数型のように見えますが、それを比較しようとしてい'369\''ますか?

id列の比較は'369'(少なくとも mysql では) 有効ですが、整数と非整数文字列の比較は有効ではありません。

于 2012-08-02T14:17:54.017 に答える
1

また、廃止されたmysql_*関数を使用せず、代わりに PDO を使用することをお勧めします。

ただし、既存のコードを修正するには、intval.

$id = intval($_GET['id']);
于 2012-08-02T14:15:17.010 に答える