-1

私は魔法の引用符を使い始めましたが、小さな問題に遭遇しました。簡単な問題で、理解できないと思います。

テキストエリアに何かを書き込んだときに削除されないストリップラッシュは使用しません

コード:

<?php
echo "Removed Slashes: ";
// Remove those slashes
if(get_magic_quotes_gpc())
    echo stripslashes($_POST['question']);
else
    echo $_POST['question'];

?>

<form method='post'>
Question: <input type='text' name='question'/><br />
<input type='submit'>

</form>

私も実際に動作するこれを試しました!:

<?php
$str = "Is your name O\'reilly?";

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

しかし今、私はセキュリティ上の理由でウェブサイトに私の入力を使用したいと思います

4

3 に答える 3

2

マニュアルページのcHaoによるこのコメントよりもうまく言えません

マジック クォートが非推奨とされているまさにその理由は、エスケープ/クォートに対する画一的なアプローチは頭がおかしく、実に危険だからです。コンテンツの種類が異なれば、特殊文字やそれらをエスケープする方法も異なります。また、1 つのコンテンツで機能すると、別の場所では副作用が生じる傾向があります。魔法の引用符のように動作するふりをしている、または HTML、SQL、またはその他のものに対して同様の変換を行っているサンプル コードは、ここまたは他の場所で同様に間違っており、同様に危険です。

魔法の引用符はセキュリティのためではありません。彼らは一度も行ったことがありません。これは便利なことです。それらが存在するのは、PHP の初心者が、データの適切なエスケープ/クォートについて学ぶ必要なく、うまく機能する mysql クエリを最終的に書くことができるようにするためです。彼らの仕事と同様に、いくつかの偶発的な構文エラーを防ぎます。しかし、彼らは、悪意のあるある程度知識のある攻撃者が PHP 初心者のデータベースを破壊するのを止めることはできません。そして、その貧しい初心者は、魔法の引用符 (または彼の気の利いた「すべてをエスケープする」機能) が彼に誤った安心感を与えたため、データベースがどのように、またはなぜなくなったのかさえ知らないかもしれません。彼は、信頼できない入力を実際に処理する方法を学ぶ必要はありませんでした。

データは、エスケープする必要がある場合、およびそれが使用されるドメインに対してエスケープする必要があります。(mysql_real_escape_string -- ラッシュを追加しないでください! -- MySQL の場合 (それは、手がかりがあり、準備済みステートメントを使用しない限り)、HTML の htmlentities または htmlspecialchars などです。) それ以外のものは失敗する運命にあります。

本当に、アドバイスを聞いてください。それらを使用しないでください。それらを試しても何の有用性も得られません。ただそれらが存在したことを忘れてください。

この記事http://www.sitepoint.com/magic-quotes-headachesとこれhttp://econsultancy.com/us/blog/2663-web-app-security-basics-filtering-input-をご覧ください。詳細については、and-escaping-outputを参照してください。

于 2012-04-26T18:46:51.210 に答える
1

攻撃するのは簡単ですが、手助けするのは一見もっと努力しているようです。それで、これが役立つことへの私の試みです。

したがって、データをサーバーにポストバックし、ユーザーがポストバックしたものが悪意を持って動作する可能性のある場所に到達しないようにする必要があります。

あなたがそれを採用して大丈夫だと言う素朴な戦略、私は魔法の引用をオンにすることによってデータを一般的にサニタイズします、それはすべての厄介なことから逃れるはずです...

ただし、そうではありません。あなたの仕事は、信頼できないデータを処理するときに、その使用方法に完全に応じて、カスタムのサニタイズ戦略を確実に使用することです。信頼できないデータが特定の場所に入るのを許可する必要がある場所、および信頼できないデータをエスケープする方法を学習するための優れたリソースは、 OWASPにあります。

エスケープされているかどうかにかかわらず、すべての場所が信頼できないデータに適しているわけではないことに気付くでしょう。これは、安全なWebサイトを真に実装するには、信頼できないデータがどこに行くのか、そしてデータがどのようにそこに到達するのかを考慮する必要があるという事実を浮き彫りにします。

この質問は、一般的なエスケープメカニズムを検討している(そしてその使用を攻撃している)ため、より直接的に方法に焦点を当てています。マジッククォートをオンにすることは、信頼できないデータが最終的に発生する可能性のあるすべての場所に送信されるデータをエスケープするための適切な方法であることを意味します。

ベストプラクティスによると、実際には、使用する場所に適したエスケープメカニズムを使用する必要があります。すでに指摘したように、mysql_real_escape_stringの使用は、MySQLクエリで使用するための文字列のエスケープに固有の一般的な関数です。人々はこのメカニズムを使用しますが、このメカニズムを使用してデータを手動でエスケープする必要性は、PHPデータオブジェクト(PDO)の正しい使用によって置き換えられます。(クエリ文字列を手動で作成するのではなく、信頼できないデータをパラメータにバインドします)。

その他の明らかなエスケープメカニズムには、htmlspecialcharsまたはhtmlentitiesを使用したhtml文字のエンコードや、より一般的な引用符エスケープメカニズムのaddslashesおよびaddcslashesが含まれます。コマンドライン引数escapeshellargおよびescapeshellcmdのエスケープメソッドもあります

したがって、データを適切にエスケープすることは、すべての受信データに魔法の引用符を適用するよりもはるかに簡単であることがわかります。また、使用する場所によっては、データを安全にエスケープするための十分に確立されたメカニズムが存在することがよくあります。

于 2012-04-26T23:44:15.417 に答える
-1

問題を簡単に修正するには、DB にアクセスする場合にすべてのデータをプッシュする単純な関数を作成します。次のようにモデル化できます。

function sanitizeString($var)
{

    $var = strip_tags($var);
    $var = htmlentities($var);
    $var = stripslashes($var);

    return mysql_real_escape_string($var);

}//end sanitizeString
于 2012-04-26T19:20:29.203 に答える