1

ADODBforPHPを使用するプラットフォームを最適化しています。以前のバージョンの PHP (mysql_escape_string) の sql インジェクションを回避するサニタイズ関数を使用しましたが、これは明らかにサポートも推奨もされていません。

ライブラリを使用していない場合は、次のようになります。

$rs = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id']));

一部の行を更新する場合の例:

$record = array();
$record['name'] = q($_GET['name']);
$record['last_update'] = time();
$rsProfile = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id']));
$sql = $cnn->GetUpdateSQL($rsProfile,$record);
if($sql) $cnn->Execute($sql);                            

この場合、q($string)はサニタイズ関数であり、これを改善しようとしています。このサーバーに PDO をインストールするアクセス権がないため、これはオプションではありません。

現在の q() は、2 番目の引数なしで mysql_real_escape_string を使用します。

function q($data) {
    if(!empty($data) && is_string($data)) {
        $data = str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $data);
        $data = "'".$data."'";
    }
    return $data;
}

誰かが別のフォーラムでfilter_var ($value, FILTER_SANITIZE_STRING) を推奨していましたが、正直なところ、これらの問題にそれを使用したことはありません。

この関数の目的のセキュリティを向上させる方法に関する推奨事項はありますか?

更新 1

function q($data) {
    if(is_string($data)) {
        return "'".mysql_real_escape_string($data)."'";
    } elseif(is_numeric($data) || is_bool($data)) {
        return $data;
    } else {
        return "''";
    }
}
4

2 に答える 2

2

がっかりさせて申し訳ありませんが、あなたのサニタイズ機能は、それが何をするにしても、も「サニタイズ」せず、ここに投稿したコードそのものにインジェクションの可能性があります。
この方法でスクリプトを呼び出すだけです

code.php?id=1 union select password from users where id=1

このコードが何かを「サニタイズ」したかどうかを確認します。

この関数の目的のセキュリティを向上させる方法に関する推奨事項はありますか?

もちろん。
まず最初に、エスケープとは何か、そしてその使い方を理解する必要があります。

次に、プレースホルダーの使用を開始する必要があります。

于 2011-11-01T05:54:36.390 に答える
0

ドキュメントからmysql_escape_string:

この関数は廃止されました。この関数は使用しないでください。代わりに、mysql_real_escape_string() を使用してください。

したがって、mysql を使用している場合は、mysql_real_escape_string.

于 2011-11-01T04:07:37.807 に答える