寻求Escaping Data for MySQL查询的帮助

时间:2010-05-24 14:58:20

标签: php mysql sql-injection

请不要向我发送一个指向php.net的链接,引用mysql_real_escape_string作为唯一的响应。我已经阅读了这个页面,虽然我理解了一般概念,但是根据我的INSERT语句当前是如何构建的,我遇到了一些麻烦。

今天,我使用以下内容:

$sql = "INSERT INTO tablename VALUES ('', 
                                      '$_SESSION['Member1FirstName'], 
                                      '$_SESSION['Member1LastName'], 
                                      '$_SESSION['Member1ID'], 
                                      '$_SESSION['Member2FirstName'], 
                                      '$_SESSION['Member2LastName'], 
                                      '$_SESSION['Member2ID'] ....)

并且列表会继续显示20个以上的成员,并输入其他一些值。似乎示例中的大多数人已将所有数据存储在数组中。

在我的网站上,我接受表单输入,action =“”设置为self,发生php验证,如果验证通过,数据将存储到第2页的SESSION变量中,然后重定向到流程中的下一页(页面3)(整个过程大约8-10页)。

3 个答案:

答案 0 :(得分:3)

您似乎已经知道应该使用mysql_real_escape_string,但我想您不知道如何使用。您需要将它应用于您插入SQL的每个用户提供的字符串。以下示例应阐明这一点:

$sql = "INSERT INTO tablename VALUES ('', '" .
    mysql_real_escape_string($_SESSION['Member1FirstName']) . "', '" .
    mysql_real_escape_string($_SESSION['Member1LastName']) . "', '" .
    etc..

或者选择prepared statements并绑定参数以获得更简单(更快)的解决方案。

答案 1 :(得分:2)

1)你错过了你的结束单引号,并且vars不会在单引号内被替换。

2)mysql_real_escape_string是答案,但是用sprintf试试吧:

$sql = sprintf("INSERT INTO tablename VALUES ('', '%s', '%s', '%d' )",
               mysql_real_escape_string( $_SESSION['Member1FirstName']),
               mysql_real_escape_string( $_SESSION['Member1LastName']),
               $_SESSION['Member1ID']); // %d forced it as a digit

http://us2.php.net/manual/en/function.sprintf.php

答案 2 :(得分:0)

为什么不能使用mysql_real_escape_string?

您还可以使用正则表达式仅允许名称中预期的某些字符