2012-01-27 11 views
0

私のPHPコードでは、私はPHP $ _GETメソッドでデータを取得できます。ここでは、このようなコードを見ては..ですPHPクエリ文字列の検証

<?php 
<a href='userprofile.php?uname=$uname'>$uname</a> 
?> 

私はそれがショーのユーザーのプロファイルページとなるようuserprofile.phpページのURLは次のようになりますリンクをクリックした場合。

http://localhost/evantechbd1/userprofile.php?uname=shibbir 

私の質問は、このURLがSQLインジェクションやその他の攻撃からどのように守られないかです。

私が書く場合:

http://.......uname=shibbir'OR'='-1-' 

それはショーだ:

SHIBBIR%27OR%27%3D%27-1-%27'S PROFILE. 

しかし私はそれがだそのリンクに提供されるものは何でもテキストたくは有効なユーザ名のプロフィールページのみが表示されなければなりません。

答えて

0

あなたが攻撃を試みるのを防ぐことはできません。攻撃が成功するのを防ぐことができます。しかし、予防策が実際にどのようなものになるかは、データベースをどのように使用するかによって決まります。多くの「墨塗り」機能は、他の使用事例で必要なデータを破壊するため、すべてのデータをすべてのケースで安全にする「魔法の弾丸」機能はありません。

悪いデータが決してSQLクエリで使用されない場合は、mysql_real_escape_string()でSQLインジェクション攻撃防止を行うことに意味がありません。文字列がHTMLコンテキストで使用されない場合は、htmlspecialchars()を実行すると同様に役に立たなくなります。

0

SQLで$unameを使用する前に、それをエスケープしてください。例えば
は、あなたが古いが金PHP MySQL拡張を使用する場合:

$uname = mysql_real_escape_string($uname); 
$res = mysql_query("SELECT * FROM users WHERE name = '$uname'"); 

$unameshibbir'OR'='-1-'ある場合は、私が書いた機能を使用した後、それはshibbir\'OR\'=\'-1-\'だろう、それはあなたのクエリを破ることができません。

もっとここで読む:

http://php.net/manual/en/function.mysql-real-escape-string.php
http://www.php.net/manual/en/security.database.sql-injection.php

+0

ありがとう@ lorenzo-s – user1161867

1

最良の方法は、私が正常にでもあるデータにいくつかのデータの検証を行うものの、examples hereを参照してください、準備されたステートメントを使用することです準備された声明で使用される予定です。

例えば、誰かが登録すると、特定の文字だけがユーザ名に許可され、誰かがフェッチするユーザ名を入力したときに同じチェックを使用します。

0

その他の問題は、クロスサイトスクリプティングの悪用です。これを扱うにはいくつかの方法がありますが、通常は、$ _GET ['uname']がhtmlブロックで使用する前にデータベースのユーザ名として存在することを確認することです。