-2

重複の可能性:
PHP でアポストロフィが私の mysql クエリを壊している

Android アプリがサーバーにメッセージを送信しています (PHP スクリプト) PHP スクリプトがメッセージを MySQL に書き込んでいます。

これは問題なく動作しますが、アポストロフィ ' を含むすべてのメッセージ (たとえば、彼は学校に行く) はデータベースに書き込まれません。

ここにphpスクリプト:

function deq($s)
{
    if($s == null)
        return null;
    return
        get_magic_quotes_gpc() ?
        stripslashes($s) : $s;
}

  if(md5(deq($_REQUEST['blub']).deq($_REQUEST['blub'])."blabla") == $_REQUEST['hash']){
    mysql_connect("localhost", "blub", "blub") or die(mysql_error());
    mysql_select_db("blub") or die(mysql_error());

   // mysql_set_charset('UTF8');  // does not work as too old php
   mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION = 'utf8_unicode_ci'");

    $mysqldate = gmdate( 'Y-m-d H:i:s');

    $language = (int) $_REQUEST['language'];

    $device = $_REQUEST['device'];

    $ipaddress = $_SERVER['REMOTE_ADDR'];


    mysql_query("INSERT INTO test(username, text, language, rating, checked, date)
    VALUES('".$_REQUEST['username']."', '".$_REQUEST['text']."', '".$language."', '0' , 'false', '".$mysqldate."') ")
    or die(mysql_error());

    mysql_close();
4

4 に答える 4

2

'以下のようにエスケープする必要があるすべて

$_REQUEST['text'] = mysql_real_escape_string($_REQUEST['text']);
于 2012-11-04T13:59:51.223 に答える
1

Don't use magic quotes. use mysqli_real_escape_string or mysql_real_escape_string if you don't want to use mysqli.

于 2012-11-04T14:02:40.503 に答える
1

You have discovered SQL injections: The apostrophe in the input "gets out" of the apostrophe you put in the query. This causes some of the input to be considered part of the query. You can use mysql_real_escape_string to secure the input before you use it in a query. But in general, there are better solutions for this (e.g. prepared statements).

You are, by the way, using the outdated mysql_ functions in PHP (see the big red warning on http://php.net/mysql_query)

于 2012-11-04T14:03:28.977 に答える
1

上記の説明を見ると、mysql_real_escape_string関数を使用してスラッシュで入力データをエスケープする必要があります

SQLクエリで使用される場合の入力データのアポストロフィは、SQLクエリを中断し、SQLインジェクションになります

したがって、SQLクエリに利用する前に、必ずmysql_real_escape_string()関数を使用して入力データをサニタイズしてください。

mysql_real_escape_string()関数の詳細については、以下のURLに記載されているドキュメントを参照してください。

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

于 2012-11-04T14:20:10.597 に答える