关于PHP的简单问题

时间:2011-01-20 12:00:12

标签: php

我有一个Android应用程序,用PHP连接到远程数据库。好的,我已经完成并且正在工作,但我需要一些特别的东西。

我需要将一个参数更多地传递给每个PHP,并且在PHP代码中,我需要检查这个额外参数是否等于这个单词“sea”,并且只有当它相等时,我的php才会执行远程操作DB查询。 ¿我为什么要这样做?为了使我的PHP代码更加安全,因为它们可以通过互联网加入,但我想将这个额外的参数添加到证书中,只有我的应用程序才能查询数据库,因为只有我的应用程序知道这个额外的参数“海”。 / p>

但我不知道该怎么做,因为我的PHP技能为空(我的应用程序的phps是由朋友完成的)

有人可以用我需要的支票完成我的代码吗?参数名称为“app_password”,参数的正确值为“sea”

这是我需要comprobation的PHP代码:

<?php

$link =mysql_connect(("theip","theuser","thepass"););
mysql_select_db("pervasive_locations", $link );

$q=mysql_query("Delete From permission Where 
fk_email1='".$_REQUEST['email1']."' and 
fk_email2='".$_REQUEST['email2']."'",$link );


while($e=mysql_fetch_assoc($q))
        $output[]=$e;

print(json_encode($output));

mysql_close($link);

?>

6 个答案:

答案 0 :(得分:2)

通过限制MYSQL注入更加安全......

我建议使用$ _POST或$ _GET而不是$ _REQUEST($ _POST更安全,但您必须修改您的应用以执行POST请求而不是GET)

<?php
if ($_REQUEST["app_password"]=='sea'){
$link =mysql_connect('localhost','database_user','database_password');
mysql_select_db("pervasive_locations", $link );

$email1=$var=str_replace('"','&quot;',$_REQUEST['email1']);
$email1=str_replace("'",'&#039;',$email1);

$email2=$var=str_replace('"','&quot;',$_REQUEST['email2']);
$email2=str_replace("'",'&#039;',$email2);  

$q=mysql_query("Delete From permission Where fk_email1='$email1' and fk_email2='email2'",$link );


while($e=mysql_fetch_assoc($q))
        $output[]=$e;

print(json_encode($output));

mysql_close($link);

}//end if
?>

答案 1 :(得分:2)

如果你的意思是通过url将参数传递给PHP,你可以从$ _GET超全局中获取它。例如,如果参数名为'param':

if(isset($_GET['param']) && $_GET['param'] == 'sea') {
   // rest of your code
}

答案 2 :(得分:2)

3层答案......

第1部分

您需要的解决方案是检查呼叫上的查询字符串参数,如下所示:

if ($_GET['app_password'] == 'sea')
{
    .... Do your DB query ....
}

如果您致电:

,这将有效
http://www.mysite.com/dodbquery.php?app_password=sea

但如果你打电话

就行不通
http://www.mysite.com/dodbquery.php?app_password=air
http://www.mysite.com/dodbquery.php
http://www.mysite.com/dodbquery.php?foobar=sea

第2部分 - 可能是更重要的部分

上面的'解决方案'一切都很好,但是这不会给你任何真正的安全性 - 任何中间人(在移动设备和你的网络服务器之间)都可以看到并重复使用URL。 / p>

如果您使用post而不是get,则同样适用,任何中间人都可以查看帖子的内容并因此重播。

有无数潜在的解决方案,最简单的恕我直言(没有重新编写脚本等)是使用post传递“密码”并通过SSL执行此操作。这意味着只有客户端和服务器才能看到明文发布数据,因此中间人无法看到您的“秘密”密钥。作为一个额外的奖励你可以做时间敏感的密钥,所以从早上1点到凌晨2点你使用'pass1',凌晨2点到凌晨3点你使用'pass2'等等。你也可以使用类似的实际键(即app_password)

您还可以检查拨打电话的设备是否为移动设备,但很容易欺骗。

第3部分 - 绝对是更重要的部分

您在上面发布的代码示例可以使用SQL注入。总而言之,这意味着有人可以将额外的SQL(即drop table my_really_important)表注入到您的代码中,这将毫无疑问地执行。您应该始终验证脚本的输入,以确保某人没有尝试“破解”您的脚本。作为示例,您的脚本似乎表明远程输入是电子邮件地址。所以你的代码应该验证这些确实是电子邮件地址。例如:

$email1Valid = VerifyEmail($_REQUEST['email1']); 
$email2Valid = VerifyEmail($_REQUEST['email2']);

if ((!$email1Valid) || (!$email2Valid))
{
    ...abort as emails are not valid...
}
else if ($_GET['app_password'] == 'sea')
{
     .... Do your DB query (and SQL escape the input emails)  .... 
} 
else
{
    .... Abort as your secret password was not passed correctly .... 
}

function VerifyEmail($email)
{
    return (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email))
} 

有关SQL注入的更多信息,请访问:

http://php.net/manual/en/security.database.sql-injection.php

答案 3 :(得分:0)

假设我明白你需要什么,你可以这样做:

<?php

// assuming you're posting, but you can change it to $_GET['app_password] if you're not
$pass = $_POST['app_password'];

if($pass == 'sea') {
  $link =mysql_connect(("theip","theuser","thepass"););
  mysql_select_db("pervasive_locations", $link );

  $q=mysql_query("Delete From permission Where 
  fk_email1='".$_REQUEST['email1']."' and 
  fk_email2='".$_REQUEST['email2']."'",$link );


  while($e=mysql_fetch_assoc($q))
        $output[]=$e;

  print(json_encode($output));

  mysql_close($link);
}
?>

答案 4 :(得分:0)

非常容易的人,

如果在这种情况下

,则需要使用控制结构
<?php

/* Here you start the if condition to verify the parameter 
   First, you need to GET your value */

$param = $_GET['app_password'];
if ($param == 'sea') {



$link =mysql_connect(("theip","theuser","thepass"););
mysql_select_db("pervasive_locations", $link );

$q=mysql_query("Delete From permission Where 
fk_email1='".$_REQUEST['email1']."' and 
fk_email2='".$_REQUEST['email2']."'",$link );


while($e=mysql_fetch_assoc($q))
        $output[]=$e;

print(json_encode($output));

mysql_close($link);


}  /* Here you close your IF statement. */

?>

答案 5 :(得分:0)

如果您经过$ _GET:

if ( isset ( $_GET ['secret_word'] ) && $_GET ['secret_word'] == 'sea') {
    // your code 
} 

或 如果你经过$ _POST(大多数是从这三个中获得)

if ( isset ( $_POST ['secret_word'] ) && $_POST ['secret_word'] == 'sea') {
    // your code 
} 

if ( isset ( $_REQUEST ['secret_word'] ) && $_REQUEST ['secret_word'] == 'sea') {
    // your code 
} 

然后去 http://php.net/manual/en/security.database.sql-injection.php 阅读有关SQL注入的内容,因为您的代码就像打开Pandora Box一样