6

重複の可能性:
mysql_real_escape_string()は、addslashes()が実行しないことを実行しますか?

PHPのaddslashes関数がSQLインジェクションに対してどのように/なぜ脆弱であるかについての記事をレビューしてきました。私が読んだすべてのことは、特定のmysqlエンコーディングタイプ(default-character-set = GBK)に問題がある、またはmagic_quotesが有効になっている場合に問題があると言っています。ただし、このシナリオでは、addslashes()関数から抜け出して、管理者としてログインするなど、悪意のあることを行うことができませんでした。

    $user = addslashes($_POST['user']);
    $pass = sha1($_POST['pass']);
    $sql = "SELECT * FROM admins WHERE user = '".$user."' AND `pass` = '".$pass."'";

    $nums = mysql_num_rows(mysql_query($sql));

    if($nums==1){
    $_SESSION['admin_user'] = $user;
    $_SESSION['admin_pass'] = $pass;

これはクライアントの(マイナーな)セキュリティ監査であり、PDOを利用することをお勧めしますが、現在の脆弱性を表示する必要があります。

参照:

4

4 に答える 4

3

PHPのaddslashesはSQLインジェクション攻撃に対して脆弱ですか?

はい。あなたがリンクした記事に記載されている条件で。

現在の脆弱性を表示する必要があります。

クライアントのエンコーディングは有名なGBKではないように思われるため、これを表示できるとは思えません。

ただし、エスケープ機能を誤用して誤用する傾向があるという理由だけで、他の脆弱性が存在する可能性があります。

ただし、クライアントがシングルバイト1またはUTF-8のいずれかをエンコードしている限り、またこの関数が適切に使用されている限り(投稿したコードのように)、インジェクションは不可能です。

于 2011-12-01T10:36:45.610 に答える
3

あなたの特定のケースでは、SQLインジェクションを実行するのは簡単ではないようですが、一般的に試してみるのは、Unicodeのnull変数を入力した場合のようなものです。のように\0?スクリプトを壊してすべてを返しますか?ほとんどの場合、そうではありません。

つまり、SQLインジェクションを実行するために常にスラッシュが必要なわけではありません。一部のSQLは非常にひどく間違って記述される可能性があります、ここに例があります

"SELECT * FROM admins WHERE id = $id"

が数値の場合$id、その完全に有効なSQLであり、addslashes$ idで実行します(とにかく誰がそれを実行しますか?)。しかし、この特定のケースでは、SQLインジェクションに必要なのは1 OR 1=1、クエリを次のようにすることだけです。

"SELECT * FROM admins WHERE id = 1 OR 1=1"

そのような愚かさからあなたを守る方法はありませんし、そうすることaddslashesもできません。magic_quotes

手元の質問に戻るために、なぜ彼らの正しい心の誰かがまたはのGBKようなものを使用するのでしょうUTF-8UTF-16

于 2011-12-01T10:37:05.817 に答える
3

Shiflettは、彼のブログエントリで完全に機能するエクスプロイトを示しています。上に示したコードは、脆弱性を示す文字セットを使用していないため、その例に従っていないようです。それでも、穴は確かに存在します。

特定のシナリオで安全である場合でも、使用方法addslashes()は危険であり、エクスプロイトに必要な状況は非常に難解であり、完全に些細なことではありませんが、Shiflettの記事は議論するのに十分な資料を提供するはずです。再現します。

クライアントが特定のシステムで実際のエクスプロイトを確認せずに危険を受け入れない場合、セキュリティ監査を行う価値はありません。

于 2011-12-01T10:46:12.463 に答える
-4

mysql_real_escape_string()に対してaddslashesを使用する理由はわかりませんが、それは完全にあなたの選択だと思います。

addlashes()はそれが言うことを正確に行います:スラッシュ付きの引用文字列

Example #1 An addslashes() example
<?php
$str = "Is your name O'reilly?";

// Outputs: Is your name O\'reilly?
echo addslashes($str);

ただし、一部のSQL攻撃は引用符なしで実行できます(特定のシェルインジェクションと一部のブラインドSQLインジェクション)。

このため、この場合、データを保護するために、addslashes()ではなくmysql_real_escape_string()を個人的に使用します。

また、SQLクエリにsprintf()を使用することを検討してください。これにより、セキュリティが少し向上します。

$query = sprintf("SELECT `username`,`password`
        FROM admins 
        WHERE user = '%s' 
        AND `pass` = '%s'", 
    $user, $pass);

指定したデータ型以外のデータ型を許可しないため、より安全になります。

%d =数字%s=文字列など。

これがお役に立てば幸いです。

于 2011-12-01T10:35:57.703 に答える