11

私はしばらくの間、小さな問題に苦しんできました。それは何年も前から存在していましたが、深刻な問題ではなく苛立たしい問題でした。しかし今、誰かが私を助けることができるかどうかを知りたい. 私はいくつかのグーグルをしましたが、成功しませんでした。

次のようなphpファイルのhtmlテキストエリアからフォーム投稿を行う場合:

<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>

もちろん、送信ボタンなどもあります。

値が問題です: <a href="http://google.com">google's site</a>textarea の値には、"(引用符) と '(アポストロフィ) の両方があります。

これを mysql_database に保存するには、次のようにします。

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());

そして今、mysqlエラーが発生します:

SQL 構文にエラーがあります。1 行目で near '' site'' を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

4

8 に答える 8

22

SQL 文字列は次のようになります。

INSERT INTO `table` (`row1`) VALUES ('google's site')

これは有効なステートメントではありません。Nanne が書いたように、少なくとも mysql_real_escape_string で文字列をエスケープします: http://php.net/manual/en/function.mysql-real-escape-string.php

SQLインジェクションについて読んで ください http://en.wikipedia.org/wiki/SQL_injection

少し考えてみてください: 誰かがこれを投稿$_POST['text']した場合: 値:');delete from table;....

あなたのデータに別れを告げることができます:)

常に入力をフィルター/エスケープしてください!

編集: PHP 5.5.0 以降、mysql_real_escape_string および mysql 拡張機能は非推奨です。代わりに mysqli 拡張機能と mysqli::escape_string 関数を使用してください

于 2011-01-11T16:30:51.057 に答える
10

ユーザー提供の値をデータベースに追加するときは、少なくとも常に mysql_real_escape_string を使用してください。クエリが次のようになるように、バインディング パラメーターまたは mysqli を調べる必要があります。

INSERT INTO `table` (`row1`) VALUES (?)

と ?入力をサニタイズした後、実際の値に置き換えられます。

あなたの場合、使用:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());

SQL インジェクションについて読んでください。できるだけ早く行う価値があります。

于 2011-01-11T16:27:49.277 に答える
3

文字列をエスケープします:D

http://php.net/manual/en/function.mysql-real-escape-string.php

于 2011-01-11T16:26:19.450 に答える
2

addslashes() 関数を使用できます。文字列をスラッシュで引用します。そのため、フィールドにアポストロフィを追加するときに非常に役立ちます。

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
于 2012-09-26T05:24:14.417 に答える
1

古い mysql* 関数を使用する代わりに、PDO を使用してパラメーター化されたクエリを記述します - http://php.net/pdo

于 2011-01-11T16:27:19.433 に答える
0

mysql でデータを更新していたときも、文字に苦労していました。

しかし、私は最終的により良い答えにたどり着きました。

$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm

また、データベースを更新する場合、MySQL REAL Escape String を使用しない限り、システムはデータベースを更新しません。ここ:

$lastname = mysql_real_escape_string($_POST["lastname"]);  // This Works Always.

その後、クエリは確実に更新されます。

Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.

詳細については、MYSQL_REAL_ESCAPE_STRINGを確認してください。

お役に立てれば

于 2015-10-09T09:48:24.137 に答える