2

我不是 PHP/SQL 专家,我刚刚发现我必须应用 mysql_real_escape_string 来保护我的 SQL INSERTS。

我使用网上找到的几个建议做了一个函数,这里是:

function secure($string)
{
if(is_numeric($string)) 
    { $string = intval($string); }
    elseif (is_array($string)) 
    {
        foreach ($string as $key => $value) {
            $string[$key] = secure($value);
        }
    } 
    else if ($string === null) 
    {
        $string = 'NULL';
    }
    elseif (is_bool($string)) 
    {
        $string = $string ? 1 : 0;
    } 
    else 
    {
        if (get_magic_quotes_gpc()) { $value = stripslashes($string); } 
        $string = mysql_real_escape_string($string);
        $string = addcslashes($string, '%_');
    }
    return $string;
}

事情是,当我查看我的表格内容时,它包含反斜杠。然后从逻辑上讲,当我检索数据时,我必须对其应用带斜杠以删除这些反斜杠。

魔术行情已关闭。

问题 1) 现在我认为即使我在插入 SQL 之前使用 mysql_real_escape_string 来保护我的数据,反斜杠也不应该出现在我的内容中?你能证实这一点吗?

问题 2) 如果不正常,为什么这些反斜杠出现在我的 phpMyAdmin 内容和检索中?我做错了什么?

问题 3) 我的猜测是 mysql_real_escape_string可以应用两次,不是吗?如果是这样,有什么功能可以防止 mysql_real_escape_string 多次应用于同一个字符串,导致许多 \\ 到同一个可转义字符?

非常感谢您的投入!

4

4 回答 4

1

您的 stripslashed$string存储到错误的变量$value中,而不是$string

if (get_magic_quotes_gpc()) { $value = stripslashes($string); } 

应该

if (get_magic_quotes_gpc()) { $string = stripslashes($string); }
于 2011-02-12T19:28:26.410 回答
1

哦,多么无意义的功能。我知道这不是你的错,而是那些在愚蠢的文章和答案中写下它的人。

摆脱它,只使用 mysql_real_escape_string 来转义字符串

你把一切都搞混了。

  • 首先,数据库转义函数中不应出现任何魔术引号。
    如果您想摆脱魔术引号,请在所有脚本的最顶部集中进行,无论它们是否处理数据库。

  • 此功能中的大多数检查都是无用的。is_bool 例如。PHP 将以相同的方式对其进行转换,无需为此编写任何代码。

  • LIKE 相关的转义是完全不同的事情,与安全无关。

  • 数字检查是完全没用的,因为它无济于事。

请注意转义字符串与安全性无关。
我只是一个语法规则——所有字符串都应该被转义。不管它的起源或任何其他的东西。只是一个严格的规则:每次将字符串放入查询中时,都应该引用和转义。(当然,如果你只逃避它而不引用它,那将无济于事)

只有当我们谈到查询的其他部分时,才会涉及到 SQL 注入问题。要了解有关此问题的完整指南,请参阅我之前的回答:在 PHP 中,当向数据库提交字符串时,我应该使用 htmlspecialchars() 处理非法字符还是使用正则表达式?

于 2011-02-12T19:39:01.373 回答
0

您确定您没有多次调用 mysql_real_escape_string 吗,每次使用可转义字符调用它时,您最终都会添加越来越多的斜杠。你只想调用它一次。另外,你为什么还要调用 addcslashes?mysql_real_escape_string 应该足够了。如果您只调用一次,则从数据库中检索数据后,您永远不必对数据调用 stripslashes。

您无法确定是否多次应用 mysql_real_escape_string,我建议您返回并仔细重新阅读您的代码,尝试在将值插入数据库之前调试打印这些值,看看它们是否看起来“过度”削减'。

顺便说一句,如果您使用准备好的语句(例如通过 mysqli),您不需要转义字符串,数据库引擎会为您执行此操作,这也可能是问题所在。

于 2011-02-12T19:29:33.007 回答
0

从您的所有代码中完全删除 addlashes。这是将斜杠插入数据库的主要原因。

function escape($string) {
    if (get_magic_quotes_gpc()) {
        $string = stripslashes($string);    
    }
    return mysql_real_escape_string($string); 
}

始终检查是否启用了magic_quotes_gpc,是否执行了stripslashes 并转义数据。

Escaped = "不要使用加斜线"

当它进入数据库时​​,“\”被删除。

于 2011-02-12T19:36:48.073 回答