有htmlspecialchars mysql查询的问题

时间:2013-08-24 11:20:18

标签: php mysql

这段代码有什么问题......?如果我使用以下代码从mysql检索数据,则会出错。

$sql="select id,
        '" . htmlspecialchars(question, ENT_QUOTES) . "',
        '" . htmlspecialchars(option1, ENT_QUOTES) . "',
        '" . htmlspecialchars(option2, ENT_QUOTES) . "',
        '" . htmlspecialchars(option3, ENT_QUOTES) . "',
        '" . htmlspecialchars(option4, ENT_QUOTES) . "',
        '" . htmlspecialchars(correctAnswer, ENT_QUOTES) . "',
         '" . htmlspecialchars(category, ENT_QUOTES) . "',
          '" . htmlspecialchars(section, ENT_QUOTES) . "',
           '" . htmlspecialchars(chapter, ENT_QUOTES) . "'
           from $user order by id";

4 个答案:

答案 0 :(得分:4)

这里有一些问题......

我的电子钱包问题:有些$$$缺少(对不起,坏双关语,我知道)

$sql="select id,
    '" . htmlspecialchars($question, ENT_QUOTES) . "',
    '" . htmlspecialchars($option1, ENT_QUOTES) . "',
    '" . htmlspecialchars($option2, ENT_QUOTES) . "',
    '" . htmlspecialchars($option3, ENT_QUOTES) . "',
    '" . htmlspecialchars($option4, ENT_QUOTES) . "',
    '" . htmlspecialchars($correctAnswer, ENT_QUOTES) . "',
     '" . htmlspecialchars($category, ENT_QUOTES) . "',
      '" . htmlspecialchars($section, ENT_QUOTES) . "',
       '" . htmlspecialchars($chapter, ENT_QUOTES) . "'
       from $user order by id";

报价问题

看看the answer of @bhawin, and give a +1 for spotting that

单引号'用于包含字符串,而反引号```用于包含SQL对象的名称:列,表等......

使用PHP基本的mysql函数

较新的PHP弃用了它。不要这样做...... Use PDO for fun and profit!

使用字符串连接来汇编查询

SQL注入......以这种方式受到攻击并不好笑。即使使用PDO,您也必须知道如何正确使用预准备语句......

查询中的

htmlspecialchars - 为什么?

这会转义要在HTML页面中安全显示的字符串。不是用于构建查询......这就是mysql_real_escape_string的用途 - 但是再次使用PDO而不是整个考验。

依赖默认编码

使用UTF-8(或您为任务选择的编码)明确且一致地使用字符串进行deailng。像:

htmlspecialchars($correctAnswer, ENT_QUOTES, 'UTF-8')

最后

为什么在地球上你用这种方式指定列名?这没有意义。

如果您的目的是清理查询中的结果,则应在检索结果后执行 ...突然,htmlspecialchars开始有道理!

答案 1 :(得分:2)

  

你试图逃避列名?您转义插入数据库的值,而不是数据库中已有的列名或值。

htmlspecialchars从mysql中的表中选择? htmlspecialchars是fot html而不是sql。当您将它们插入数据库而不是在选择它们时,您将转义值。他们已经在数据库中了,为什么要逃避它们呢?

试试这个

     $sql="select id,
    question,
    option1,
    option2,
    option3, 
    option4, 
    correctAnswer,
     category, 
      section, 
     chapter 
       from $user order by id";

答案 2 :(得分:1)

$sql="select `id`,
    `" . htmlspecialchars(question, ENT_QUOTES) . "`,
    `" . htmlspecialchars(option1, ENT_QUOTES) . "`,
    `" . htmlspecialchars(option2, ENT_QUOTES) . "`,
    `" . htmlspecialchars(option3, ENT_QUOTES) . "`,
    `" . htmlspecialchars(option4, ENT_QUOTES) . "`,
    `" . htmlspecialchars(correctAnswer, ENT_QUOTES) . "`,
     `" . htmlspecialchars(category, ENT_QUOTES) . "`,
      `" . htmlspecialchars(section, ENT_QUOTES) . "`,
       `" . htmlspecialchars(chapter, ENT_QUOTES) . "`
       from $user order by id";

我刚刚在查询中将'更改为'

答案 3 :(得分:0)

我想我明白你要做的是什么,但你完全是错误的做法。当您构建要发送到数据库的SQL查询时,该SQL查询只是一个字符串,并且不包含任何功能。您可以根据需要构建它,但数据库只能看到生成的字符串。

在您的代码中,您有一整行这样的行:htmlspecialchars(question, ENT_QUOTES)正在被PHP 解释为以构建查询。 PHP有一个可疑的功能,如question之类的不带引号的名称可以是常量,但如果不是,则将其视为字符串'question';字符串'question'中没有<>&"'的实例,因此htmlspecialchars不管你传递的选项如何,都会保持不变。简而言之,写htmlspecialchars(question, ENT_QUOTES)与写'question'是一样的。

然后,您将固定字符串与另一个包含一些单引号的固定字符串连接(.):".... '" . htmlspecialchars(question, ENT_QUOTES) . "' ...."

所以你的查询实际上最终会这样:

 $sql="select id,
'question',
'option1',
'option2',
'option3', 
'option4', 
'correctAnswer',
'category', 
'section', 
'chapter'
from $user order by id";

您接下来奇怪的是,您从中选择的表格是用变量指定的。表名通常不会改变,因此通常不需要变量,尽管偶尔配置它们也很有用。如果这就是你正在做的事情,我会建议一个更明确的变量名称,比如$db_table_name_user

但是,查看列名称,它们看起来不像用户的列,所以我想知道您实际尝试做的是从基于某个特定用户的问题表中检索。为此,您需要WHERE子句,或者可能需要JOIN到另一个表。如果您不知道如何工作,请阅读SQL。

假设$user包含数据库表的名称,上面实际上将作为一个成功的SQL查询运行 - 只是不是特别有用的一个,因为它将选择id的{​​{1}}每个用户,以及文字字符串'question''option1'等。您需要删除它们,或者用反向标记替换它们,这是MySQL用来引用列和表名称以避免它们被解释为别的东西。

这将检索user表中所有内容的详细信息,假设它是什么:

 $db_table_name_user = 'user';

 $sql="select id,
 question,
 option1,
 option2,
 option3, 
 option4, 
 correctAnswer,
 category, 
 section, 
 chapter 
 from $user order by id";

现在我们来看看您实际尝试使用htmlspecialchars实现的目标:处理从数据库中返回的内容中的转义。这与您编写查询的方式无关,只与您之后执行的操作有关。您的数据库表应该存储输入的确切文本:当您将其插入数据库时​​,您将使用mysqli_real_escape_string(或参数化准备的查询)来确保数据库不会将其解释为查询的一部分,但是这就是你如何发送它,而不是它是如何存储的。

然后,当您实际上在HTML页面上显示文本时,在您从数据库中检索它之后,您将对其进行转义,以便浏览器不会不能将其解释为标记的一部分。转义通常应该尽可能晚地发生,这样您就不必假设某些字符串是否已被转义。

例如,对于编号的问题列表,代码将是这样的:

 $all_questions = get_all_questions_from_db();
 echo '<ol>';
 foreach ( $all_questions as $question )
 {
      echo '<li>' . htmlspecialchars($question['question']) . '</li>';
 }
 echo '</ol>';