0

ほとんどの人がこれに眉をひそめることは知っていますが、PDO ステートメントとエスケープ文字列について知る前は、mysql インジェクションをどのように防ぐべきかわかりませんでした。

テキストを取得してフィルターを通過させる関数を作成しました。それが本当にSQLインジェクションを防ぐのか、それとも回避できるのか疑問に思っていますか? 当時の私の目標は、ユーザーがテキストを入力し、入力したとおりに表示できるようにすることでした。

これに加えて、ユーザーがデータベースに対して必要以上のアクセス許可を持っていないことを確認することにも注意を払いました。入力を使用して新しい行などを更新または挿入していたかどうか。しかし、まだ機能していなかったら?:

function filterInput($textToFilter)
{
    if ($textToFilter != null)
{



    //a = a
    //e = e
    //i = i
    //o = o
    //u  = u

    //A = A
    //E = E
    //I = I
    //O = O
    //U = U

    $textToFilter = str_ireplace('insert','ins&#101rt',$textToFilter);
    $textToFilter = str_ireplace('select','s&#101lect',$textToFilter);
    $textToFilter = str_ireplace('values','valu&#101s',$textToFilter);
    $textToFilter = str_ireplace('where','wher&#101',$textToFilter);
    $textToFilter = str_ireplace('order','ord&#101r',$textToFilter);
    $textToFilter = str_ireplace('into','int&#111',$textToFilter);
    $textToFilter = str_ireplace('drop','dr&#111p',$textToFilter);
    $textToFilter = str_ireplace('delete','delet&#101',$textToFilter);
    $textToFilter = str_ireplace('update','updat&#101',$textToFilter);
    $textToFilter = str_ireplace('set','s&#101t',$textToFilter);
    $textToFilter = str_ireplace('flush','fl&#117sh',$textToFilter);
    $textToFilter = str_ireplace("'","&#39",$textToFilter);
    $textToFilter = str_ireplace('"',"&#34",$textToFilter);
    $textToFilter = str_ireplace(';',"&#59",$textToFilter);
    $textToFilter = str_ireplace('>',"›",$textToFilter);
    $textToFilter = str_ireplace('<',"‹",$textToFilter);
$textToFilter = nl2br($textToFilter);
$filterInputOutput = $textToFilter;
return $filterInputOutput;  
}
}
4

3 に答える 3

5

独自の「フィルター」機能を実行しようとしているため、標準的な応答は「はい、そうです」です。「安全な」コードを書くことは非常に難しく、基本的に車輪を再発明しようとしており、悪い方法でそれを行っています.

次のこともできるのに、なぜこのような (無意味な) 面倒なことをするつもりなのですか?

$safe_text = mysql_real_escape_string($badtext);

(または、DB ライブラリが提供する任意のエスケープ関数)、データベースにすべての面倒な作業を任せますか?

于 2012-09-14T20:01:36.580 に答える
2

この種のことは専門家に任せるのが最善です。自分で転がそうとしないでください。この関数をすぐにもっと安全なものにパッチする必要があります。

function filterInput($textToFilter)
{
    return mysql_real_escape_string($textToFilter);
}

後で、へのすべての参照を削除してfilterInput、に置き換えることができmysql_real_escape_stringます。mysql_query次のステップは、非常に危険なので、使用を完全に停止することです。またはPDOに切り替えるとmysqli、特にSQLプレースホルダーを使用してエスケープを実行できるため、大きなメリットがあります。これにより、多大なコストがかかる可能性のある単純なミスを回避できます。

于 2012-09-14T20:07:21.367 に答える
1

str_ireplace はエンコーディングセーフではないため、間違いなく「はい」です ( infosを参照)。

また、「truncate」、「grant」、「create」などを忘れたため、「はい」です。

最善の方法は、それを忘れて準備済みステートメントに移行することです。

于 2012-09-14T20:08:09.103 に答える