5

したがって、私が書いているこのプログラムでは、実際にフォームを使用してユーザーからSQLクエリを取得します。次に、データベースでそのクエリを実行します。

ユーザー入力を「信頼」しないことを知っているので、入力をサニタイズしたいと思います。使用しようとしてmysql_real_escape_stringいますが、機能させることができませんでした。

入力を前提として、これが私が試していることです。 select * from Actor;

//"query" is the input string: 
$clean_string = mysql_real_escape_string($query, $db_connection); 
$rs = mysql_query($clean_string, $db_connection); 
if (!$rs) 
{ 
    echo "Invalid input!"; 
} 

これは常に私に与えています

"無効入力!"

エラー。

clean_stringパーツを取り出してmysql_queryクエリを実行すると、

"無効入力"

メッセージは出力されません。むしろ、私がこれを行うとき:

$rs = mysql_query($query, $db_connection); 
if (!$rs) 
{ 
   echo "Invalid input!"; 
} 

出力されません

"無効入力"。

ただし、このmysql_real_escape_string関数を使用する必要があります。私は何が間違っているのですか?

アップデート:

入力として与えられ select * from Actor;て、私は以下を見つけました。

echoステートメントを使用すると、サニタイズする前に、文字列が値を保持していることがわかりました select * from Actor; 。これは正しいです。ただし、サニタイズした後は、の値が正しくないselect *\r\nfrom Actor;ため、エラーメッセージが表示されます。なぜ mysql_real_escape_stringこれをしているのですか?

4

6 に答える 6

13

クエリ文字列全体ではなく、クエリの実際の値で使用してください。

例:

$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);
于 2011-04-17T04:32:34.167 に答える
1

古い mysql 拡張機能を使用するのではなく、PDOに切り替えます。プリペアド ステートメントパラメーターは、値をステートメントとは別に保持するため、インジェクションに対して脆弱ではありません。プリペアド ステートメントと PDO には、パフォーマンス、使いやすさ、追加機能など、他にも利点があります。チュートリアルが必要な場合は、「PHP と PDO を使用した MySQL スクリプトの記述」を試してください。

于 2011-04-17T04:37:35.620 に答える
1

mysql_real_escape_string()文字列エスケープ関数です。入力を安全にするわけではなく、文字列だけであり、LIKE 句では使用できず、整数はさらに別の方法で処理する必要があります。

より簡単でより普遍的な例は次のとおりです。

 $post = array_map("mysql_real_escape_string", $_POST);
 // cleans all input variables at once

 mysql_query("SELECT * FROM tbl WHERE id='$post[id]' 
                OR name='$post[name]' OR mtime<'$post[mtime]' ");
 // uses escaped $post rather than the raw $_POST variables

'SQL 文字列では、各変数を一重引用符で囲む必要があることに注意してください。(そうしないと、エスケープは無意味になります。)

于 2011-04-17T04:39:54.593 に答える
0

mysql_real_escape_stringクエリ自体ではなく、パラメータをクエリにエスケープするために使用する必要があります。

たとえば、フォームから受け取った 2 つの変数があるとします。次に、コードは次のようになります。

$Query = sprintf(
    'INSERT INTO SomeTable VALUES("%s", "%s")', 
    mysql_real_escape_string($_POST['a'], $DBConnection),
    mysql_real_escape_string($_POST['b'], $DBConnection)
);

$Result = mysql_query($Query, $DBConnection);
于 2011-04-17T04:34:19.400 に答える
0

手動mysql_real_escape_string()

SQL ステートメントで使用する文字列内の特殊文字をエスケープします。

したがって、クエリ全体をエスケープすることはできず、データだけをエスケープすることはできません...引用符(クエリの有効な部分)などのすべての安全でない文字をエスケープするためです。

そのようなことを試してみると(クエリ全体をエスケープするために)

echo mysql_real_escape_string("INSERT INTO some_table VALUES ('xyz', 'abc', '123');");

出力は

INSERT INTO some_table VALUES (\'xyz\', \'abc\', \'123\');

そして、それはもはや有効なクエリではありません

于 2011-04-17T04:34:43.340 に答える
0

これは私にとってはうまくいきました。ドウルフ (wtec.co)

<?php
// add data to db
require_once('../admin/connect.php');

$mysqli = new mysqli($servername, $username, $password, $dbname);

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$post = $mysqli->real_escape_string($_POST['name']);
$title = $mysqli->real_escape_string($_POST['message']);


/* this query with escaped $post,$title will work */
if ($mysqli->query("INSERT into press (title, post) VALUES ('$post', '$title')")) {
    printf("%d Row inserted.\n", $mysqli->affected_rows);
}

$mysqli->close();


//header("location:../admin"); 
?>
于 2015-07-18T19:14:13.140 に答える