2011-07-28 10 views
11

私は可能な限り安全なとしての私のPHPを作るためにトリング午前、と私は避けるようにしようとしている二つの主なものは、MySQL注射 A PHPのSQLインジェクションを防ぐための機能とXSS

  • クロスサイドスクリプティング

    • です(XSS)

    これは私がMySQLの注射剤に対して得たスクリプトです:

    function make_safe($variable) { 
    $variable = mysql_real_escape_string(trim($variable)); 
    return $variable; } 
    
    XSSに対する

    http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


    、私はこれが見つかりました:今、私は、単一の関数に2を統一したい

    $username = strip_tags($_POST['username']); 
    

    を。これが最善の方法でしょうか? :

    function make_safe($variable) { 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; } 
    

    それともmysql_real_escape_stringのはすでにXSSを防ぐのですか?最後に、他の形式のハッキングを防ぐためにこの機能に追加できるものは何ですか?

  • +3

    マジックワンドはありません。 –

    +3

    あなたと[PDO](http://php.net/manual/en/book.pdo.php)は友人になるはずです! – Jacob

    +0

    私はあなたの二人が何を言っているのか本当に理解していない;) – LonelyWebCrawler

    答えて

    11

    mysql_real_escape_string()はXSSを防ぎません。 SQLインジェクションは不可能です。

    XSSと戦うには、htmlspecialchars()またはstrip_tags()を使用する必要があります。 1stは<のような特殊文字をのように表示されますが、実行されない&lt;に変換します。 2番目のタグはすべてのタグを削除します。

    これを行うには特別な機能を持たせたり、すべての機能を実行するための機能を追加することはお勧めしません。私が想定し。

    +0

    なぜ機能ではないのですか? – LonelyWebCrawler

    +0

    そして、strip_tags()だけを使用して、htmlspecialchars()を冗長にすることはできませんか? – LonelyWebCrawler

    +0

    #1の質問 - すべてに合ったものはありません。 #2の質問 - そうです。 – daGrevis

    13

    この機能:

    function make_safe($variable) 
    { 
        $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
        return $variable; 
    } 
    

    は動作しません

    SQLインジェクションやXSSは、二つの異なる獣です。それぞれ異なるエスケープが必要なので、各エスケープ関数strip_tagsmysql_real_escape_stringを個別に使用する必要があります。
    それらに参加すると、それぞれのセキュリティが脅かされます。

    データをデータベースに入力するときは、標準mysql_real_escape_string()を使用してください。
    strip_tags()を使用して、データベースに項目を照会してから、画面に出力します。

    2つの機能を組み合わせること馬の口から
    危険である理由:http://php.net/manual/en/function.strip-tags.php

    strip_tags()が実際にHTMLを検証しませんので、部分的または壊れたタグが複数のテキストの除去につながることができます/予想以上のデータ。スマート攻撃者があなたのコンボでmysql_real_escape_string()を倒すためにあなたの素朴な実装を使用することができ、データベースのフィールドに不正なHTMLを入力することにより、だから、

    +0

    データベースにデータを追加するときにmysql_real_escape_string()を使用しますが、ログイン入力時などのユーザ入力をデータベースエントリと比較するときは使用しません。 – LonelyWebCrawler

    +0

    @user、すべてのクエリに対して、mysql_real_escape_string() '** ** **を使用します。選択、更新、削除、または挿入します。 – Johan

    2

    実際に調べる必要があるのは、prepared statementsPDOを使用して、データベースに対する抽象化レイヤーを提供するだけでなく、SQLインジェクション攻撃を完全に根絶することです。

    XSSについては、ユーザー入力を信頼しないようにしてください。データを保存するとき、または出力するときにstrip_tagsまたはhtmlentitiesを実行してください(両方とも出力で混乱することはありません)。大丈夫です。

    +0

    私はPDOについて聞いたことがありません。それは何ですか? – LonelyWebCrawler

    +0

    PDOは、PHPに含まれるデータベース抽象化レイヤーです。はじめにここをクリックしてください:http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ –

    関連する問題