-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

不要使用魔术引号。如果您不想使用 mysqli,请使用mysqli_real_escape_stringmysql_real_escape_string 。

于 2012-11-04T14:02:40.503 回答
1

您已经发现了SQL 注入:输入中的撇号“脱离”了您在查询中输入的撇号。这会导致某些输入被视为查询的一部分。mysql_real_escape_string在查询中使用输入之前,您可以使用它来保护输入。但总的来说,对此有更好的解决方案(例如准备好的语句)。

顺便说一句,您正在使用 PHP 中的过时mysql_函数(请参阅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 回答