0

コードとSQ​​LアーキテクチャをSQLインジェクションから防ぐ方法..??

コーディングにPHPを使用しています。

ログイン用のフォームがあります。私はいくつかのSQLインジェクションクエリを読みました

string sql = "SELECT * FROM table_name WHERE smth='" + UserInput + "'";
ExecuteSql(sql);

SELECT fieldlist
  FROM table
 WHERE field = 'steve@unixwiz.net'';

データベースからデータを取得するためのコーディングとクエリが正しくないためにSQLインジェクションが発生していることはわかっています。SQLインジェクションからプロジェクトを保護するためにグーグルを実行しましたが、適切な情報が得られませんでした。

私はコーディングにもcakephpフレームワークを使用しましたが、cakephpではクエリをサニタイズするためSQLインジェクションが非常に難しいという知識があります。本当ですか?

私はそのためにこの情報を手に入れました:-

CakePHP already protects you against SQL Injection if you use CakePHP's ORM methods (such as find() and save()) and proper array notation (ie. array('field' => $value)) instead of raw SQL. For sanitization against XSS its generally better to save raw HTML in database without modification and sanitize at the time of output/display.

誰かが私をそのために案内してくれますか?

ありがとう !!

4

4 に答える 4

2

@Learnerは、一般的なインジェクションではなく、CakePHPフレームワークのクエリについて具体的に話します(ただし、それについても知っておくことが重要です。

CakePHPが言うとき

CakePHPは、生のSQLの代わりにCakePHPのORMメソッド(find()やsave()など)と適切な配列表記(つまり、array('field' => $ value))を使用する場合、SQLインジェクションから既に保護されています。XSSに対するサニタイズの場合、一般に、生のHTMLを変更せずにデータベースに保存し、出力/表示時にサニタイズする方が適切です。

あなたがする必要があるのはそれが言うことです。データベースに対して任意のクエリを実行している場合は保護されません。CakePHPをバイパスしているため、保護できません。それがあなたを保護するとき、あなたはフレームワークを通して実行されているクエリです:

$result = $this->Article->find(
    'first', array(
    'conditions' => array('Article.id' => $articleIDtoFind)));

この例では、どこ$articleIDtoFindから来たのかは関係ありません。クエリは安全です。(がらくたでいっぱいの場合は機能しない可能性があります)

于 2012-05-21T09:15:22.997 に答える
2

注入を防ぐために、入力はすべて適切にサニタイズする必要があります。

$UserInput = mysql_real_escape_string($_REQUEST['inputfield']);
$sql = "SELECT * FROM table_name WHERE smth='". $UserInput ."'";
ExecuteSql(sql);

入力はいつでもサニタイズできます。実際のコードがある場合は、確認すると役立ちます。クエリに追加する前に、関数「mysql_real_escape_string」を任意の文字列に適用するだけです。

アップデート:

私はあなたのコメントからこれを正しく読んだとは思いませんが、これはあなたのコードがどのように見えるべきかです:

<?php 
$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']);
$query = "SELECT * FROM users WHERE user='".$username."' AND password='".$password."'";
echo $query;
if($result = mysql_query($query)) {
    // matching user + password found
    $row = mysql_fetch_assoc($result);
    print_r($row); //This will show you the results of the query.
}
else {
    // no matching user and password -- login not granted
    echo "you fail.";
}
?>

「mysql_real_escape_string」関数を追加したので、「」や「」などの文字はエスケープされ、データベースがそれらをクエリの一部として扱わないようにします。

于 2012-05-21T06:43:55.237 に答える
1

可能なSQLインジェクション方法の1つは、さまざまな条件でデータを入力することです。例:次の文字列を入力すると、aboueクエリがハッキングされる可能性があります。

 a' or '1=1

この注入を回避するには、次のメソッドを使用できます1.mysql_real_escape_string(); 例:クエリを実行する前

使用、$ user_data = mysql_real_escape_string($ user_data); 2. addlashes()

eg : $user_data=addslashes($user_data)
于 2012-05-21T13:35:58.957 に答える
-1

100%完全に証明できる方法はありません、私見。ただし、入力をサニタイズし、フォームデータを正しく処理する(攻撃の99%が発生する場所であり、注意し忘れたテキストボックス)と、発生が減少します。

データベースにデータを入れることになると、ほとんどの人は文字列をサニタイズし、エスケープする文字を探します。インターネット上で「LittleBobby;DROPTABLES;」についてのジョークがあります。これはこの問題を浮き彫りにします。私の個人的な方法は、データベースに入る文字列をbase64でエンコードし、データベースを離れるときにbase64でデコードすることです。ビルトインを使ってみませんか?あなたはできるし、おそらくそうすべきだ。ただし、私の場合は、異なるデータベース/ファイル形式を使用して多くの作業を実行しており、base64はそれらのいずれかを処理するときに役立ちます。

潜在的な攻撃者に対処する際の楽しみの一部であるフォームについては、可能な限りPOST/SESSIONを使用することをお勧めします。なんで?一般に、攻撃者にWebサイト/データベースの内部に関する情報をできるだけ少なくしたいからです。Getリクエストを受け取り、そこから直接取得したパラメータを実行したページ「accounts.php?ACCOUNTID=2347289」を想像してみてください。怠惰なプログラマーは、テーブル内に、その変数に一致するフィールドを文字ごとに持つことになります。しかし、多くの人が指摘しているように、この部分はSQLインジェクション攻撃を厳密に扱っているわけではありませんが、これらすべてに慣れていないように見えるので、取り上げる価値があると感じました。

于 2012-05-21T06:43:20.780 に答える