ローカルファイルインクルードとSQLインジェクション(PHP)からWebサイトをどのように保護しますか?
7 に答える
取るべき対策はたくさんあります。データベースに保存する前に、必ずすべての入力をサニタイズしてください。保存されるすべてのデータにmysql_real_escape_string()を使用することをお勧めします。文字入力を適切な長さに制限し、そのフィールドに期待するタイプのデータを取得していることを確認してください。データの特定の領域を送信するための複数の試行をロックします。アップロードされたファイルのコンテンツをクロールして、悪意のあるパターンを探します。
ウィキブックスにはSQLインジェクションに関する章があります。
リストはどんどん増えていきます。幸い、この分野で少しでも努力すれば、多数の脆弱性にパッチを当てることができます。
SQL 用のプリペアド ステートメント ( を参照PDO::prepare()
) または適切なエスケープ ( PDO::quote()
)。
ローカル パスの場合は、慎重に入力をサニタイズする必要があります (残忍ですが、安全: preg_replace('/[^a-z]/','',$str)
)。または、パスで信頼されていないデータを使用しないようにする必要があります (ID、事前定義された文字列などを使用します)。
SQL インジェクションから保護するために、PDO ( http://us3.php.net/pdo ) の使用をお勧めします。採用をブロックする可能性のある必要な拡張機能などがありますが、それは良いものです。
個人的には、すべてのクエリが通過する自作の DB アクセス レイヤーを使用しています。mysql_real_escape_string()
他の人が言っているようmysql\_real\_escape\_string()
に、SQLインジェクションを防ぐための最も安全な方法です。すべてのSQLにカスタムDBインターフェイスクラスを使用します。これにより、必要なすべての変数がsanitize()
関数を介して渡されます。ご覧になりたい場合に備えて、クラスから削除されたサニタイズ関数を次に示します。
/**
* Sanitize variable for querying
*
* @param mixed $var The variable to sanitize
* @param bool $deep Will inspect the string deeper, converting 'null' to NULL and adding '' around strings
* @param mixed $numstrings Whether or not to treat numbers as strings (ie add quotes)
* @return $var
*/
function sanitize($var, $deep = true, $numstrings = false) {
if (is_array($var)) { //run each array item through this function (by reference)
foreach ($var as $key=>$val) {
$var[$key] = sanitize($val, $deep, $numstrings);
}
}
else if (is_null($var) || ( $deep && preg_match('/^null$/i', $var) > 0 ) ) { //convert null variables to SQL NULL
$var = "NULL";
}
else if (is_bool($var)) { //convert boolean variables to binary boolean
$var = ($var) ? 1 : 0;
}
else if ($numstrings && is_string($var)) {
$var = mysql_real_escape_string($var);
if ($quotes) {
$var = "'". $var ."'";
}
}
else if (!is_numeric($var)) { //clean strings
$var = mysql_real_escape_string($var);
if ($deep) {
$var = "'". $var ."'";
}
}
return $var;
}
「ローカルファイルインクルード」に関しては、2つの異なる方法を使用します。最も安全な方法は、機密ファイルをWebからアクセスできない場所に保管することです。
ファイルだけの場合、または世界に見せたくない場合は、ファイル名に「.ht」を追加するだけです。Apacheは、デフォルトで、「。ht」で始まるファイルへのアクセスを拒否します。ファイルにApache構成ファイル(.htaccess、.htpasswdなど)と同じ名前を付けないように注意してください。
アクセスしたくないファイルが複数ある場合は、それらすべてをサイトのサブディレクトリに保存します(ここでも、機密ファイルは別の場所に配置する必要があります)。次に、サブディレクトリに、ディレクトリへのアクセスを拒否する.htaccessファイルを追加します(これらは引き続きPHP経由でアクセスできます)。
#this is all you need in the file
Order Allow , Deny
Deny from all
SQL インジェクションを回避するには、送信前にパスワードを暗号化してください