3

PHP を学習しようとしていますが、SQL インジェクションからフォームを保護する機能を使用したいと考えています。しかし、どういうわけか、'"=)/()/*/ のような特別な文字を含むすべてのデータをデータベースに記録します

私のフィルター機能:

function filter($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

ページを登録して POST データを取得します。

foreach($_POST as $key => $value) {
    $data[$key] = filter($value);
}

次に、特殊文字を試してフォームを保存します! 私は何を間違っていますか?

4

4 に答える 4

4

SQL インジェクションから保護したい場合、最善の方法はPDOと準備されたクエリを使用することです。この場合、次のように、すべてのユーザー提供データが 経由execute()で渡されます。

$stmt = $pdo->prepare("INSERT INTO foo (a_column, b_column) VALUES (:a, :b)");
$stmt->execute(array(':a' => $a, ':b' => $b));

$aまたはを操作する必要はありません$b。PDO は、使用しているデータベースに関係なく、パラメーターを正しい方法でバインドします。

于 2012-07-24T00:29:40.223 に答える
2

ええと... SQL インジェクションを防止するポイントは、サーバーや他のユーザーを危険にさらすことなく、ユーザーが好きなように入力できるようにすることです。htmlspecialcharsHTML タグのように見えるものを取り、それらを無害にレンダリングするため、開始するのに適した場所です。stripslashes最新バージョンの PHP ではマジック クォートが削除されていますが、使用したものは適切です。mysql_real_escape_string合理的な安全性を備えた文字列の形式で、データベースに何でも挿入できます。

したがって、フィルター関数は次のようになります。

function filter($data) {
    if( get_magic_quotes_gpc()) $data = stripslashes($data);
    return trim(mysql_real_escape_string(htmlspecialchars($data));
}

ここで、特定の文字のみを許可するフィルターなど、実際にフィルターが必要な場合は、 などの正規表現関数を使用しpreg_matchます。

于 2012-07-24T00:31:49.187 に答える
0

非推奨になったため、mysql_* 関数の使用を停止します。代わりにPHP データベース オブジェクト (PDO)を使用してください。PDO では、SQL インジェクションから保護するパラメーター バインディングが可能です。

ここでPDO の使用について読むことができます

于 2012-07-24T00:31:26.127 に答える
0

フレームワークを使用していない場合は、正規表現をチェックすることも検討してください。例: http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks

于 2012-07-24T00:34:02.140 に答える