2017-02-19 8 views
5

私は個人的なプロジェクトで作業しています。準備されたステートメントを使用する以外に、すべての入力を脅威として使いたいと思います。そのために私は簡単な機能を作った。PHPセキュリティ(strip_tags、htmlentities)

function clean($input){ 
if (is_array($input)){ 
    foreach ($input as $key => $val){ 
     $output[$key] = clean($val); 
    } 
}else{ 
    $output = (string) $input; 
    if (get_magic_quotes_gpc()){ 
     $output = stripslashes($output); 
    } 
    $output = htmlentities($output, ENT_QUOTES, 'UTF-8'); 

} 
return $output; 
} 

これは十分ですか、次のコードを使用する必要がありますか?

 $output = mysqli_real_escape_string($base, $input); 
     $output = strip_tags($output); 

申し訳ありませんが、これはばかげた質問かもしれないが、私はあなたの助け私はあなたの努力を称賛

+0

は十分に安全であり、どのような方法でデータをエスケープする必要はありません。エスケープは、SQLクエリを入力データと連結する場合にのみ必要です。これはPrepared Statementを使用する場合と異なります。 –

+1

DBMSは、予期されたデータ型とエンコーディングに基づいて、プリペアドステートメントで提供されるパラメータを自動的にサニタイズします。手動で文字列をエスケープし、それをプリペイドド・ステートメント・パラメーターとして送信すると、実際にはそれは安全性が低くなります。 – apokryfos

+1

時間があれば、データベースインタラクションを処理するために 'PDO'を使う方法を学んでください。 http://php.net/manual/en/book.pdo.php –

答えて

5

のコード:) おかげで私と一緒にすべての問題を回避したいと思います。 フレンドリーなコミュニティメンバーは、あなたの操作を分離することを検討する必要があります。

)...入力(filter_input_array()strip_tags()str_ireplace()trim()などをフィルタリングするための1つの機能/ルーチン/クラス/メソッドを持っています)。フィルタリングを行うためにループを使用する関数を作成することができます。ダブルエンコーディング、ワンタイムストリップスプーフィングなどのトリックは、strip_tags()のようなものを一回使用すると敗北することがあります。

私のSanitizerクラスのstrip_tags()ラッパーメソッドがあります。 古い値と新しい値を比較して、等しいかどうかを確認します。等しくない場合は、strip_tags()を使用し続けます。ただし、このメソッドを実行する前に予備INPUT_POST/$ _POSTチェックがかなり行われていますが、 trim()を使ったこのバージョンの別のバージョンは、実際にはこの前に実行されます。

private function removeHtml(&$value) 
{  
    if (is_scalar($value)) { 
     do { 
      $old = $value; 
      $value = strip_tags($value); 

      if ($value === $old) { 
       break; 
      } 
     } while(1); 
    } else if (is_array($value) && !empty($value)) { 
     foreach ($value as $field => &$string) { 
      do { 
       $old = $string; 
       $string = strip_tags($string); 

       if ($string === $old) { 
        break; 
       } 
      } while (1); 
     } 
    } else { 
     throw new Exception('The data being HTML sanitized is neither scalar nor in an array.'); 
    } 

    return; 
} 

)入力(filter_var_array()preg_match()mb_strlen、などを検証するための別のものを持っている...)

次に

、あなたのデータはコンテキストを切り替える必要があるとき...

A)データベースの場合は、プリペアドステートメント(PDO、好ましくは)を使用します。

B)/復帰ブラウザにユーザ入力を送信するためには、それに応じてhtmlentities()又はhtmlspecialcharsで出力をエスケープ。

マジッククォートに関しては、php.iniでそれを無効にするだけです。

ここでは、それぞれ独自の責任範囲を持つさまざまな構造を使用して、ハンドラファイル内のロジックとデータの流れを管理するだけです。これには、ユーザーにエラーメッセージを提供し(必要な場合)、エラー/例外を処理することが含まれます。

データが直接HTMLフォームからデータベースに送られる場合は、すぐにhtmlentities()またはhtmlspecialcharsを使用する必要はありません。データをエスケープするポイントは、新しいコンテキスト内で実行可能な命令として解釈されないようにすることです。 SQLクエリエンジンにデータを渡すときに、htmlentities()またはhtmlspecialcharsが解決できるという危険はありません。そのため、入力をフィルタリングして検証し、prepared statement(PDO)を使用しています。しかしながら

、データデータベーステーブルから取得された後は、直接OK、今htmlentities()又はhtmlspecialcharsを使用し、ブラウザのを宛てです。そのシナリオを処理するためにforまたはforeachループを使用するfunctionを作成します。ここで

は、あなたがあなた自身の個人的な好みや状況にあなたのコードを調整する必要があります私のEscaperクラス

public function superHtmlSpecialChars($html) 
{ 
    return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); 
} 

public function superHtmlEntities(&$html) 
{ 
    $html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); 
} 

public function htmlSpecialCharsArray(array &$html) 
{  
    foreach ($html as &$value) { 
     $value = $this->superHtmlSpecialChars($value); 
    } 

    unset($value); 
} 

public function htmlEntitiesArray(array &$html) 
{  
    foreach ($html as &$value) { 
     $this->superHtmlEntities($value); 
    } 

    unset($value); 
} 

からの抜粋です。

注意、あなたがブラウザに送信する前にデータを処理する予定がある場合、最初の処理を行い、その関数をループあなたのハンディダンディhtmlentities()またはhtmlspecialcharsで脱出。

できます。

+0

これはすばらしい答えです。最初の文章はもっと強く言わなければならないと思います。彼らの目的を達成するためには、あなたは異なる場所で起こらなければならないので、あなたの操作を切り離さなければなりません。マジッククォートについては、[それらをサポートするPHPの最新版](http://php.net/manual/en/security.magicquotes.php)は5.3で、2.5年前に正式なセキュリティパッチの提供を停止した](http://php.net/eol.php)*。 – IMSoP

+1

@IMSoPありがとうございます。私は始まり、情報セキュリティを勉強することを覚えています。あなたが何か(フィルタ/検証/エスケープ)をしている理由を知ることは大変重要です。驚くべき答え。 –

+0

ありがとう! – Tiago

0

両方strip_tags() and htmlentities or htmlspecialchars().

1の使用上のシナリオは)あなたから任意のHTML要素を取り除くしたい場合は、データベース 例に挿入する前に strip_tags()機能を使用し、XSS攻撃に対して脆弱である可能性があるフォームを入力してもよいです

$data= strip_tags('<b>Hello</b>'); 

出力は「Hello」となり、これがサーバーに渡されます。

2.)ブラウザまたは画面にデータを印刷する場合は、htmlentities() or htmlspecialchars() を使用することができます。プリペアドステートメントを使用して、

あなたはその後、印刷の$ PICはどこにでもしたいとXSS攻撃から自由にすることができ
//DB PDO Connect.... 
$result2 = $db->prepare('select * from users where uid=:uid'); 
     $result2->execute(array(':uid' =>'1')); 

while ($row = $result2->fetch()) { 


$pic=htmlentities($row['profilepic'], ENT_QUOTES, "UTF-8"); 
} 

....

関連する問題