0

データベースへのすべての入力を保護したいと考えています。フォロー機能を書きました:

function mysql_real_escape_array($t){
    return array_map("mysql_real_escape_string",$t);
} 

私が書いたすべての私のphpデータによってロードされるファイルで:

$_POST=mysql_real_escape_array($_POST);

私は、この汚いコードを介して不利な点はないと思いますし、悪意のあるクエリは不可能です。それとも、このコードには欠点があると誰かが考えていますか?

フィードバックをいただければ幸いです。それが最善の解決策ではないことはわかっていますが、このようにして、何かを逃れることを忘れることはできません。

ありがとう!

4

2 に答える 2

2

インジェクションから確実に保護する唯一の方法は、適切にパラメータ化されたクエリを使用することです。クエリのすべてのパラメーターには脆弱性があり、適切にエスケープする必要があります。これは、悪意のあるインジェクションを防ぐためだけでなく、偶発的なインジェクションを防ぐためでもあります。たとえば、次のようにすることができます。

SELECT value FROM t1
$value = $result; //$value is now "o'connel"
// SQL error caused by apostrophe in string
SELECT col FROM t2 WHERE value = '$value'

このデータは内部データであるため安全であると考えることができますが、適切にエスケープされていないために問題が発生する可能性があります。

の上書きについて$_POSTは、未加工の投稿本文と$_POSTからの値を引き続き取得できる$_REQUESTため、データが適切にエスケープされていることを保証する方法がないことに注意してください。さらにmysql_real_escape_string、使用する必要があるときに有効な mysql 接続がない可能性があります。これにより、問題や脆弱性が発生する可能性があります。 $_POST値は配列にすることもできるため、関数も再帰的である必要があります。

これらすべての考慮事項を忘れて、orでパラメーター化されたクエリを使用する方がはるかに簡単です。準備済みステートメントを使用するだけでは十分ではないことに注意してください。クエリを適切にパラメータ化する必要があります。PDOmysqli

于 2013-10-29T17:31:42.713 に答える