2

オンライン誓約コンポーネントを備えた Web サイトを立ち上げましたが、html/javascript を使用する人々によってハッキング/悪用され続け、署名ページでおかしなことが起こります。これを防ぐために、フィールドから非アルファをスクリプト化する方法がわかりません。

以下は、フォームデータをデータベースに記録するために使用しているコードです。preg_replace 関数の実装方法に関する提案はありますか (それが最適な場合)。また、これはエクスプロイトを防ぐのに最適な場所ですか、それとももっと理想的な場所が他にありますか?

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
    $insertSQL = sprintf("INSERT INTO signature (FirstName, LastName, Email, State, Country, `TSDate`, IP) VALUES (%s, %s, %s, %s, %s, %s, %s)",
                   GetSQLValueString(($_POST['FirstName']), "text"),
                   GetSQLValueString(($_POST['LastName']), "text"),
                   GetSQLValueString(($_POST['Email']), "text"),
                   GetSQLValueString(($_POST['State']), "text"),
                   GetSQLValueString($_POST['Country'], "text"),
                   GetSQLValueString($_POST['Date'], "date"),
                   GetSQLValueString($_POST['IP'], "text"));
mysql_select_db($database_petitionscript, $petitionscript);
$Result1 = mysql_query($insertSQL, $petitionscript) or die(mysql_error());
}
4

3 に答える 3

2

すべての $_POST 変数を htmlspecialchars でラップする必要があります

http://php.net/manual/en/function.htmlspecialchars.php

また、PHP5 を使用している場合は、代わりに PDO オブジェクトを使用してデータベースに接続する必要があり、変数を MySQL クエリに直接配置しないでください (これにより、SQL パーサーにユーザーからの SQL コードを挿入できます)。パラメータ化されたクエリを使用する必要があります。 PHPでSQLインジェクションを防ぐにはどうすればよいですか?

(実際、パラメータ化されたクエリを使用していることに気付きました)

于 2012-07-23T03:11:42.917 に答える
1

ですべての出力をサニタイズしますhtmlentities()

たとえば、する代わりに

<?php echo $FirstName; ?>

行う:

<?php echo htmlentities($FirstName); ?>

これにより、あなたが説明したクレイジーな HTML/JavaScript による XSS 攻撃が阻止されます。

さらに、SQL インジェクションを防止してください。入力 ($_POSTデータ) を保存する前にサニタイズする必要もあります。

于 2012-07-23T03:16:25.943 に答える
1

フォームトークンを使用できます。実装には少し時間がかかるかもしれませんが、簡単に:

PHP がフォームを提供するとき、ランダムな文字列を生成し、「トークン」としてデータベースに保存します。そのトークンを持つフォームに非表示フィールドがあります。

ユーザーから送信されたフォーム データを受け取ったら、提供されたトークンがデータベースに存在する場合にのみ処理します。(その後、トークンを削除します)。

これは、フォームを再ロードして毎回トークンを送信する必要があるため、フォームの送信プロセスを自動化するのを防ぐのに役立ちます (ほとんどのスクリプトキディは気にしません)。

トークンをユーザー セッションにバインドし、各セッションに 1 つのトークンのみを許可するなどのことを行うことで、これをさらに進めることができます。

実際には、データベースに触れずにセッションを使用するだけでこれを実行できるように見えますが、少し簡単かもしれません。

于 2012-07-23T03:24:09.810 に答える