web-dev-qa-db-ja.com

A PHP SQLインジェクションとXSSを防ぐ関数

私は自分のPHPをできるだけ安全にするために努力しています、そして私が避けようとしている2つの主なことは

  • mySQLインジェクション
  • クロスサイドスクリプティング(XSS)

これは、mySQLインジェクションに対して取得したスクリプトです。

function make_safe($variable) {
$variable = mysql_real_escape_string(trim($variable)); 
return $variable;  }

http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


XSSに対して、私はこれを見つけました:

$username = strip_tags($_POST['username']);

次に、2つを1つの関数に統合します。これはそうするための最良の方法でしょうか? :

function make_safe($variable) {
$variable = strip_tags(mysql_real_escape_string(trim($variable)));
return $variable; }

または、mysql_real_escape_stringはすでにXSSを妨げていますか?そして最後に、他の形式のハッキングを防ぐためにこの機能に追加できるものは他にありますか?

15

mysql_real_escape_string() はXSSを妨げません。 SQLインジェクションを実行できなくなるだけです。

XSSと戦うには、 htmlspecialchars() または strip_tags() を使用する必要があります。 1番目は、<などの特殊文字を&lt;に変換し、<として表示されますが、実行されません。 2つ目は、すべてのタグを取り除くだけです。

それを行うために特別な関数を作成することや、すべてを行うために1つの関数を作成することはお勧めしませんが、指定した例は機能します。私が想定し。

11
daGrevis

この機能:

_function make_safe($variable) 
{
   $variable = strip_tags(mysql_real_escape_string(trim($variable)));
   return $variable; 
}
_

動作しません

SQLインジェクションとXSSは2つの異なる獣です。それぞれに異なるエスケープが必要なため、エスケープ関数_strip_tags_および_mysql_real_escape_string_をそれぞれ別々に使用する必要があります。
それらを結合すると、それぞれのセキュリティが無効になります。

データベースにデータを入力するときは、標準のmysql_real_escape_string()を使用します。
画面に出力する前にデータベースからデータを照会する場合は、strip_tags()を使用します。

2つの関数を組み合わせることが危険な理由
馬の口から: http://php.net/manual/en/function.strip-tags.php

Strip_tags()は実際にはHTMLを検証しないため、部分的なタグまたは壊れたタグにより、予想よりも多くのテキスト/データが削除される可能性があります。

したがって、不正なHTMLをデータベースフィールドに入力することにより、賢い攻撃者は単純な実装を使用して、コンボでmysql_real_escape_string()を無効にすることができます。

13
Johan

実際に調査する必要があるのは、 準備されたステートメント[〜#〜] pdo [〜#〜] を使用して、データベースに対して抽象化レイヤーを提供することと、完全に抽象化レイヤーを提供することですSQLインジェクション攻撃を根絶します。

XSSについては、ユーザー入力を絶対に信頼しないようにしてください。データを保存するとき、またはデータを出力するときに strip_tags または htmlentities のどちらかを実行してください(両方で出力が混乱することはないので)、それで問題ありません。

2
Jon Gjengset