私はしばらくの間、小さな問題に悩んでいます。それは何年もそこにありましたが、それは単に苛立たせる問題であり、深刻な問題ではありませんでした、そして私はちょうどそれを回避しました。しかし、今私は誰かが私を助けることができるかどうかを知りたいです。私はいくつかグーグルをやっていますが、成功していません。
次のようなphpファイルのhtml textareaからフォーム投稿を行う場合:
<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構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、「の近くのサイト」を使用するための正しい構文を1行目で確認してください
あなたの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関数を使用してください
ユーザー指定の値をデータベースに追加するときは、常に少なくとも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インジェクションについて読んでください。できるだけ早く行う価値があります!
addlashes()関数を使用できます。スラッシュで文字列を引用します。そのため、フィールドにアポストロフィを追加する場合に非常に役立ちます。
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
古いmysql *関数を使用する代わりに、PDOを使用してパラメーター化されたクエリを記述します- http://php.net/pdo
Mysqlでデータを更新しているときにも、文字について苦労していました。
しかし、私はようやくより良い答えに到達しました、ここに:
$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm
また、データベースを更新する場合、MySQL REALエスケープ文字列を使用しない限り、システムはデータベースを更新しません。ここに:
$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 を確認してください
お役に立てれば
準備されたステートメントを使用するだけで、エスケープやSQLインジェクションを心配する必要はありません。
$con = <"Your database connection">;
$input = "What's up?";
$stmt = $con->prepare("insert into `tablename` (`field`)values(?)");
$stmt->bind_param("s",$input);
$stmt->execute();