2011-11-12 10 views
1

は、セキュリティの仕事をするために誰かを支払うと、彼らは、これは安全であると言うので、皆さんに確認したい:正直に言うとこの機能は安全ですか?

function mysql_prep($value) { 
    $magic_quotes_active = get_magic_quotes_gpc(); 
    $new_enough_php = function_exists("mysql_real_escape_string"); 
    // i.e. PHP >= v4.3.0 
    if($new_enough_php) { // PHP v4.3.0 or higher 
    // undo any magic quote effects so mysql_real_escape_string can do the work 
    if($magic_quotes_active) { $value = stripslashes($value); } 
    $value = mysql_real_escape_string($value); 
    } else { // before PHP v4.3.0 
    // if magic quotes aren't already on then add slashes manually 
    if(!$magic_quotes_active) { $value = addslashes($value); } 
    // if magic quotes are active, then the slashes already exist 
    } 
    return $value; 
} 
+3

確かに*悪い*コードです。 – CodesInChaos

+0

PHP 4.3.0をチェックする理由 - 2002-12-27にリリースされました – nickb

+1

このコードは、あなたのスクリプトよりもDBに異なるエンコーディングを使用するとマルチバイト文字を悪用する攻撃に対して安全ではありません – knittl

答えて

4

...私はmysql_をスキップし、次のレベルに行くために、あなたをお勧めしますPDOのようなデータベース抽象化レイヤーに行き、準備されたステートメントを使用してください。あなたは新しい機能をたくさん使いますが、あなたの人生はよりシンプルに、より速く、より良く、より強くなります。

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

はい、上記機能が安全です。しかし、変更することができます、私は非常にあなたが5未満のバージョンを持っている疑いがあります。しかし、実際には古いです。

1

私にはうまく見えます - mysql_real_escape_stringだけのため、彼らはSQLクエリの値の周りに小さな引用符を使用していることを確認してください十分ではありません。

の代わりに、たとえば:

"SELECT Forename FROM users WHERE userID = $user_id;" 

それでなければならない:$user_idを想定している

"SELECT Forename FROM users WHERE userID = '$user_id';" 

は、その機能を使用してエスケープされています。

+0

はい私は$値。 –

0

Prepared Statementsを提供するMySQLiを使用すると、手動で文字列をエスケープする必要がなくなります。

また、同じクエリを複数回(異なる引数を指定して)実行する必要がある場合は、文を準備する方がはるかに高速です。

0

この関数は、2つの異なる問題ミックス:入力魔法引用符SQLパラメータ

取り消しのエスケープ

  • を制御することができない環境で値正規化

    • を入力エスケープは、コードの先頭にある単一の関数で行う必要があります。または、環境を制御する場合は、マジック引用符を無効にしてください。

      SQLエスケープは、クエリが形成される場所で実行する必要があります。また、パラメータを手動でエスケープする必要がないプリペアドステートメントや同様のメカニズムを使用することもできます。


      懸念のこの混合は奇妙な効果につながる:あなたが要求から来ているユーザが作成したデータ、および他のソースからの信頼できないデータがある場合

      あなたは違ったそれらを治療する必要があります。そうでなければ、マジッククォートが有効になっているシステムのセキュリティホールにすることができます。