2

良い答えを求めて約1週間探した後、助けを求めなければならないことに気付きました。PHP-mailer を使用するか Swiftmailer を使用するかで 1 週間悩んでいましたが、ドキュメントがより包括的で、より多くの例があると感じたので、PHP-mailer を使用することにしました。コードを調べたところ、PHP-mailer には衛生/検証機能が多数組み込まれていることがわかりました。欠点や穴を見た人はいますか?それらをどのように使用しますか?質問をもう少し具体的にするために、phpmailer を使用して、process.php ファイル内の次のフォーム データをどのように検証/サニタイズするのだろうか。

<form class="form-horizontal" id="contact-form-info" action="func/mail/mail-info.php"    method="post">
<fieldset>

<div class="control-group">
    <label class="control-label" for="name">Namn</label>
    <div class="controls">  
    <input type="text" class="input-xlarge" name="name" id="name" maxlength="50" placeholder="Namn *"/>
    </div>
</div>

<div class="control-group">
  <label class="control-label" for="foretag">Företag</label>
  <div class="controls">  
    <input type="text" class="input-xlarge" name="foretag" id="foretag" maxlength="50" placeholder="Företag" />
    </div>
</div>

<div class="control-group">
    <label class="control-label" for="email">E-post</label>
    <div class="controls">
    <input type="text" class="input-xlarge" name="email" id="email" placeholder="E-post *"/>
   </div>
</div> 
<div class="control-group">
    <label class="control-label" for="subject">Ämne</label>
    <div class="controls">
    <input type="text" class="input-xlarge" name="subject" id="subject" maxlength="5000"   placeholder="Ämne *"/>
    </div>
</div>   
<div class="control-group">
<label class="control-label" for="message">Meddelande</label>
<div class="controls">
    <textarea class="input-xlarge" name="message" placeholder="Meddelande *"  id="message" rows="3"></textarea>
  </div>
  </div>

    <div class="form-actions">
  <input id="submit" name="submit" type="submit" value="Skicka" class="btn btn-custom btn-large"></input>
<input type="reset" class="btn" value="återställ"></input>
</div>    
</fieldset>                 
</form>

phpmailer の内部検証行 338-384 の例

* Adds an address to one of the recipient arrays
* Addresses that have been added already return false, but do not throw exceptions
* @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
* @param string $address The email address to send to
* @param string $name
* @throws phpmailerException
* @return boolean true on success, false if address already used or invalid in some way
* @access protected
*/

protected function AddAnAddress($kind, $address, $name = '') {
if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
  $this->SetError($this->Lang('Invalid recipient array').': '.$kind);
  if ($this->exceptions) {
    throw new phpmailerException('Invalid recipient array: ' . $kind);
  }
  if ($this->SMTPDebug) {
    $this->edebug($this->Lang('Invalid recipient array').': '.$kind);
  }
  return false;
}
$address = trim($address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
if (!$this->ValidateAddress($address)) {
  $this->SetError($this->Lang('invalid_address').': '. $address);
  if ($this->exceptions) {
    throw new phpmailerException($this->Lang('invalid_address').': '.$address);
  }
  if ($this->SMTPDebug) {
    $this->edebug($this->Lang('invalid_address').': '.$address);
  }
  return false;
}
if ($kind != 'Reply-To') {
  if (!isset($this->all_recipients[strtolower($address)])) {
    array_push($this->$kind, array($address, $name));
    $this->all_recipients[strtolower($address)] = true;
    return true;
  }
} else {
  if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
    $this->ReplyTo[strtolower($address)] = array($address, $name);
  return true;
}
}
return false;
}
4

1 に答える 1

11

投稿したコードは使用できません。これは、phpMailer オブジェクトの内部変数を処理する phpMailer の内部関数です。

ただし、このコードは関数であるため、このコードで使用される電子メール アドレス検証ルーチンを呼び出すことができます。ValidateAddress()public static

したがって、コードのどこでも、次のようなものを呼び出すことができるはずです。

$valid = phpMailer::ValidateAddress($email_address);

...有効なアドレスかどうかに応じて、または$validに設定されます。truefalse

ただし、問題のコードのポイントは、これが PHPMailer が内部で電子メール アドレスを設定するコードであり、ValidateAddress()それ自体を使用しているということです。これは、phpMailer にメールアドレスを与えるたびに、すでに検証を行っていることを意味します。とにかくphpMailerがそれを行うので、最初に自分で検証する必要はありません。

行う必要があるのは、検証エラーの結果として phpMailer がスローする可能性のあるエラーをトラップすることです。デフォルトではfalse、関数が失敗した場合に単純に返されるため、それを確認できます。または、例外モードをオンにしてtry...catch、スローする例外をピックアップするために使用することもできます。

いずれにせよ、要点は、phpMailer はデフォルトで安全になるように設計されているということです。不正な電子メール アドレスやその他の無効なデータは受け付けません。したがって、あなたの質問は実際には必要ありません。phpMailer にデータを渡すだけで、検証が行われます。

(それは、phpMailer が完璧なコードであると言っているわけではありません。他のソフトウェアと同じように、誰かがセキュリティ ホールを見つける可能性がありますが、パッチ リリースで最新の状態に保つようにしている限り、問題にすべきではない)

于 2013-04-16T14:46:53.433 に答える