0

ユーザーが連絡先のPHPページから電子メールを送信できるようにするためにメールフォームを作成しています。

私はREGEXを使用して電子メールアドレスを検証し、さまざまなフィールドで多くのチェックを実行します。

ユーザーが「間違い」を犯した場合、フォームは2ページ目に偏向され、すべてのフィールド(問題のないフィールドとそうでないフィールド)がエコーされ、問題のある場所が赤で表示されます(「キャプチャを入力するのを忘れた」 、「名前を入力するのを忘れた」など)。<input type='text'>フィールドのエコーは、の値の$_SESSIONのおかげで行われます。

一重引用符を含む電子メールアドレスを入力することを思いつくまで、すべてが見事に機能しました(有効なため)

問題1: 旧友のjim_o'brienは、エコーされるとjim_oになり ます。

問題2: 電子メールの送信を24時間ごとに1つに制限したいので、Ipアドレスまたは...電子メールアドレスが24時間以内にすでに記録されているかどうかをDBでチェックします=> SQLSELECTが失敗する

質問

  • これらの2つの現象の理由は何ですか?
  • 電子メールで一重引用符を受け入れると同時に、必要なチェックを行うことは不可能ですか?
  • 副次的な質問:XSSまたはSQLインジェクションで同時に電子メールアドレスで禁止されている文字は何ですか?

どうもありがとう。

4

2 に答える 2

0

問題 1: 一重引用符を html エンティティに変換する必要があります。一重引用符を に置き換えます&lsquo ;。ただし、最後の文字とセミコロンの間にスペースはありません。

于 2012-10-18T21:53:28.417 に答える
0

問題 1.要素のvalueタグにアドレスを挿入していると思います。<input/>となり<input type='text' value='jim_o'brien'/>ます。そこの引用に問題がありますか?値を終了しています。htmlentities()解決策は、次の関数を使用することです。

echo "<input type='text' value='".htmlentities($_SESSION['email'], ENT_QUOTES)."'/>";

これにより、XSS インジェクションからも保護されます。

問題 2. DB を照会するコードを示していませんが、そこでも引用符を適切に処理していないようです。準備済みステートメントを使用する場合、これは問題にはならず、SQL インジェクションから保護されます。まだ mysql_XXX 関数を使用しているため、準備済みステートメントを使用できない場合は、mysql_real_escape_string()SQL に挿入されるすべてのユーザー入力に対して使用します。

RFC 5322から電子メール アドレスの完全な構文を取得できます。

于 2012-10-18T22:02:21.190 に答える