2011-06-03 45 views
0

我在第x.php页?user = john中使用swfobject嵌入了flash播放器。玩家调用xml文件content.php来获得结果。在content.php我有$ _GET ['user']。我试图从网址ID获取用户名并根据此结果获取结果。然而,我得到了500错误。我不认为content.php能够访问user变量。如果我只是把用户名“约翰”,而不是$ _GET ['用户'],那么它的作品。我怎样才能得到这个与$ _GET [ '用户']

XML文件content.php看起来像这样

$sql = 'SELECT a.videote as videote, b.user_name as user_name'. 
' FROM '.$video.' as a,'.$users.' as b'. 
' where b.user_name=$_GET['user'] and... //if i replace $_GET['user'] with john then it works 

在x.php闪光灯内嵌这样

<script type="text/javascript"> 
    var flashvars = {}; 
    var so = new SWFObject("play2.swf", "sotester", "1000", "400", "8", "#000000"); 
    so.addParam("allowFullScreen", "true"); 
    so.addParam("scale", "noscale"); 
    so.addParam("menu", "false"); 
    so.write("flashcontent"); 
</script> 

工作我的播放器脚本当然指向content.php这不是问题

xmlData.load("contentp.php"); 
+0

你可以发布相关的代码位?另外,加载x.php或content.php时是否返回服务器错误? – GargantuChet 2011-06-03 01:58:31

+0

@GargantuChe检查更新的文章 – Pinkie 2011-06-03 02:09:26

+0

@GargantuChe也500错误是由content.php而不是x。php – Pinkie 2011-06-03 02:10:07

回答

2

Pinkie,感谢您发布的代码。

$sql = 'SELECT a.videote as videote, b.user_name as user_name'. 
    ' FROM '.$video.' as a,'.$users.' as b'. 
    ' where b.user_name=$_GET['user'] and... //if i replace $_GET['user'] with john then it works 

这里有几个问题,但我们可以通过它们。

更改字符串时会引入语法错误。你有正确的想法$video$users。但是,在添加$_GET['user']时,PHP认为第一个撇号正在结束当前字符串。

考虑以下因素:

' where b.user_name=$_GET['user'] and...' 

看起来像两个字符串,由单词 “用户” 分隔:

' where b.user_name=$_GET[' user '] and...' 

这不是正确的语法,所以返回500错误。我猜,如果你想你的错误会消失:

' where b.user_name=' . $_GET['user'] . ' and...' 

下一个问题是,如果用户要发送一个精心制作的价值,为“用户”的参数,它们可能会导致查询的行为以你不打算的方式。

试试这个:创建一个名为的login.php文件,包含以下内容:

<?php 
    // Just display the output; no HTML formatting needed 
    header("Content-Type: text/plain"); 

    // This must succeed, or mysql_real_escape_string() won't have any effect 
    mysql_connect('mysql_host', 'mysql_user', 'mysql_password') 
     OR die(mysql_error()); 

    $safeQuery = 'SELECT count(*) FROM users WHERE user=\'' . mysql_real_escape_string($_GET['username']) . '\' AND pass=\'' . mysql_real_escape_string($_GET['password']) . '\';'; 
    echo " safeQuery is: $safeQuery\n"; 

    $unsafeQuery = 'SELECT count(*) FROM users WHERE user=\'' . $_GET['username'] . '\' AND pass=\'' . $_GET['password'] . '\';'; 
    echo "unsafeQuery is: $unsafeQuery\n"; 
?> 

负载login.php?username=bob&password=sample。输出看起来合理的:

safeQuery is: SELECT count(*) FROM users WHERE user='bob' AND pass='sample'; 
unsafeQuery is: SELECT count(*) FROM users WHERE user='bob' AND pass='sample'; 

现在尝试加载login.php?username=bob&password=sample' OR 'hello'='hello"

safeQuery is: SELECT count(*) FROM users WHERE user='bob' AND pass='sample\' OR \'hello\'=\'hello'; 
unsafeQuery is: SELECT count(*) FROM users WHERE user='bob' AND pass='sample' OR 'hello'='hello'; 

的安全查询将返回零,除非你有一个叫鲍勃其密码真的是sample' OR 'hello'='hello"用户。

但是,不安全的版本将返回数据库中用户的总数。 WHERE子句现在是:

WHERE user='bob' AND pass='sample' OR 'hello'='hello' 

OR 'hello'='hello'将在所有情况下,条件为真,即使bob不存在或具有比其他sample密码。

部分查询甚至可能被注释掉。尝试login.php?username=bob' --

safeQuery is: SELECT count(*) FROM users WHERE user='bob\' --' AND pass=''; 
unsafeQuery is: SELECT count(*) FROM users WHERE user='bob' --' AND pass=''; 

password参数现在被忽略,因为它嵌入在SQL注释中。

因此,即使您只是执行SELECT语句,如果其输入未被转义,结果也可以由聪明的用户操纵。

您可以使用mysql_real_escape_string来防止这些不良值。此功能将在必要时添加反斜杠,以防止输入数据作为SQL执行。

$sql = 'SELECT a.videote as videote, b.user_name as user_name'. 
    ' FROM '.$video.' as a,'.$users.' as b'. 
    ' where b.user_name=\'' . mysql_real_escape_string($_GET['user']) . '\' and...'; 

实施例1从php.net page for mysql_real_escape_string具有使用sprintf的一个很好的例子:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
    mysql_real_escape_string($user), 
    mysql_real_escape_string($password)); 

每个%s被替换为参数(在它们的顺序依次指定)。这样可以更轻松地保持查询的可读性,同时防止错误的输入数据。

+0

太好了。你说对了。连锁是绝对的问题。随着我做的其他事情,它现在起作用。 – Pinkie 2011-06-03 18:52:51

+0

很高兴帮助!感谢您的反馈。 – GargantuChet 2011-06-03 18:59:11

+0

我只是想知道为什么我需要使用mysql_real_string_escape知道我只选择和不插入。你能澄清一下吗? – Pinkie 2011-06-04 01:06:59

1

所以,如果我正在读这个相关当用户访问x.php?user = john页面时,服务器正在返回包含Flash对象的页面。该flash对象反过来尝试加载content.php中的xml页面。你是正确的,content.php不能访问x.php中的任何$ _GET变量,因为它们是两个完全不同的请求。

有两件事情你可以做:

  1. 放$ _GET [“用户”]内容到页面作为<PARAM>,然后让Flash对象添加到其请求。
  2. 让Flash使用技术from this other article从查询字符串中获取信息。

虽然我觉得这个值得警告,但请记住在使用前仔细检查查询字符串的内容,以免最终导致CSS或SQL注入漏洞。

+0

@JoshuaRogers你能澄清你的答案吗?我如何将我的$ _GET作为以及我如何将flash对象添加到请求中。我不会问是否知道答案。 – Pinkie 2011-06-03 02:18:09

+0

在x.php中,添加so.addParam(“user”,“<?php print urlencode($ _ GET ['user'])?>”);在你的.as文件中,你可以改变代码来加载,如下所示:var user:String = swfobject.getQueryParamValue(“user”); xmlData.load(“content.php?user =”+ user);但是,您应该知道,上面的代码易受SQL注入的影响。用户是否应该添加?user =“Jim”;从用户删除,你可能会发现用户表擦干净。 [http://php.net/manual/en/function.addslashes.php/]我建议PHP的addslashes。 – JoshuaRogers 2011-06-03 02:34:52

+0

此外,看起来content.php失败了,因为应该在SQL中的$ _GET ['user']周围引用引号。 – JoshuaRogers 2011-06-03 02:37:08

1

所以约书亚绝对有正确的想法,但让我看看我是否可以澄清和扩大一点。

本质上你应该通过GET变量闪光使用闪光变量参数(你可以阅读它的一个很好的教程here)。一旦闪存有变量,它应该追加content.php的查询与?yourNewGetVariable=ValuePassedOnToFlash,约书亚就在你传递该值之前,你应该肯定sanitize它和encode它的URL。然后你的content.php文件应该没有问题访问yourNewGetVariable

+0

您引用我的链接不使用swfobject。根据@JoshuaRogers的帮助,我增加了so.addParam(“user”,“<?php打印urlencode($ _ GET ['user'])?>”);'作为一个swfobject参数,并添加到我的.as文件中'var user:String = swfobject.getQueryParamValue(“user”);'并修改'xmlData.load(“content.php?user =”+ user);'在我的sql查询中我有'b.user_name = \'$ _GET [“user”] \''现在当我运行播放器查看请求日志时,我看到'http://domain.com/contentp.php?user = undefined'。没有得到结果。任何想法,为什么我得到undefined。 – Pinkie 2011-06-03 03:40:50

+0

@Pinkie,对不起,不好的链接,只要你的新问题,我相信(但我不是专家),变量应该通过使用flashvars通过书面[这里](http://stackoverflow.com/问题/ 2899765/how-to-pass-php-variable-as-flashvars-via-swfobject)和[here](http://www.flashmagazine.com/tutorials/detail/passing_parameters_to_flash_using_javascript/) – Tomas 2011-06-03 11:08:22