MySQL/PHP:允许特殊字符并避免 SQL 注入

Posted

技术标签:

【中文标题】MySQL/PHP:允许特殊字符并避免 SQL 注入【英文标题】:MySQL/PHP: Allow special characters and avoid SQL injection 【发布时间】:2013-09-16 19:13:34 【问题描述】:

如何使用下面的代码在不打开 SQL 注入的情况下允许特殊字符,如 " ' \ / : ; 等:

$opendb = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);

$text = $_POST['text'];

mysql_query("UPDATE table SET text='" . $text . "' WHERE 
id='" . $_GET['id'] . "'");

mysql_close($opendb);

$text 包含来自 html 文本区域的句子。当我尝试在引号中输入文本时,它只需在引号之前插入文本。

【问题讨论】:

你需要使用prepared statements,看这里***.com/questions/60174/… 请注意页面右侧的相关栏。相信我,你不是第一个遇到这种问题的人。 好的,谢谢!我会调查的。 【参考方案1】:

好吧,也许最简单的解决方案是像这样使用 mysql_real_escape_string() 函数:

$opendb = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);

$text = $_POST['text'];

mysql_query("UPDATE table SET text='" . mysql_real_escape_string($text) . "' WHERE 
id='" . $_GET['id'] . "'");

mysql_close($opendb);

编辑: 使用此代码,您可以允许将 $text 变量中的特殊字符保存到数据库中。

你也应该转义 $_GET['id']。

【讨论】:

这不是最简单也不安全的。您还需要真实链接在 cmets 中的答案。 嗯,我认为这是最简单的,在这种情况下它是安全的。如果您有其他证据,请分享。 @StefanEroteev 真正的转义字符串是史前的......使用准备好的语句,它以最安全的方式解决问题。【参考方案2】:

准备好的陈述

这是最安全的方法。查看此链接了解更多信息:How can I prevent SQL injection in php?

您可能还需要关闭魔术引号,具体取决于您运行的 PHP 版本。

<?php

if( isset($_POST['text']) && isset($_GET['id']) && 
    is_int($_GET['id']) && $_GET['id']>0 )

     $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

     /* check connection */
     if (mysqli_connect_errno()) 
         printf("Connect failed: %s\n", mysqli_connect_error());
         exit();
     

     $query = 'UPDATE table SET text = ? WHERE id = ?';

     /* prepare your statement safely */
     $stmt = $mysqli->prepare($query);

     /* bindes variables after statement is prepared */
     $stmt->bind_param('si', $_POST['text'], $_GET['id']);

     /* execute prepared statement */
     $stmt->execute();

     /* close statement */
     $stmt->close();

     /* close connection */
     $mysqli->close();
else
     echo 'Error: ID and/or Text are invalid';
?>

【讨论】:

@Treps 询问他如何“使用下面的代码”允许特殊字符。你没有使用他的代码,所以没有回答他的问题。此外,您的代码是错误的。您是否认为 $_GET['id'] 可能类似于 'si3920sd923'?如果是这种情况,您的代码将根本无法工作。 @StefanEroteev 显然 id 是主键,但如果不是,他可以删除 is_integer ...并将绑定更改为“ss”。使用他的代码,您不能确定 SQL 注入不会成为问题。最安全的方法是准备好的语句。使用转义字符串函数,不是一个好的解决方案。我在他的代码中使用了所有相同的变量,他还在他的问题 cmets 中提到他会研究准备好的语句,所以我向他展示了一个使用他的变量的变量。我不明白,你对准备好的陈述有什么看法?

以上是关于MySQL/PHP:允许特殊字符并避免 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式特殊符号及用法

正则表达式仅允许某些特殊字符并限制下划线

避免对 Node.js 中的存储过程进行 SQL 注入

SQL 注入

在 MySQL / PHP 中匹配相似的字符串

在sql server 2005中保存其他国家特殊字符