首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于PHP的简单问题

关于PHP的简单问题
EN

Stack Overflow用户
提问于 2011-01-20 20:00:12
回答 5查看 227关注 0票数 1

我有一个android应用程序,它连接到一个远程数据库与PHP。好的,我已经做好了,而且还能用,但我需要一些特别的东西。

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

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

有人可以用我需要的检查来完成我的代码吗?参数名称将是"app_password“,参数的正确值将是"sea”

这是我的php代码,我需要检查:

代码语言:javascript
复制
<?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);

?>
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-20 20:07:29

3级答案....

第1部分

您需要的解决方案是检查调用中的查询字符串参数,如下所示:

代码语言:javascript
复制
if ($_GET['app_password'] == 'sea')
{
    .... Do your DB query ....
}

如果您调用以下命令,将会起作用:

代码语言:javascript
复制
http://www.mysite.com/dodbquery.php?app_password=sea

但是如果您调用

代码语言:javascript
复制
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可以被任何中介(在移动设备和你的well服务器之间)看到,因此可以被重用。

如果你使用post而不是get,这同样适用,任何中介都可以看到帖子的内容,因此可以重放它。

有无数可能的解决方案,最简单的IMHO (无需修改脚本等)是使用post传递“密码”并通过SSL完成此操作。这意味着只有客户端和服务器才能看到明文post数据,因此中介无法看到您的“秘密”密钥。作为额外的奖励,你可以使用时间敏感的密钥,所以从凌晨1点到凌晨2点你可以使用'pass1',2am到3am你可以使用'pass2‘等等。你也可以对实际的密钥使用类似的东西(例如app_password)。

您还可以检查发出呼叫的设备是否为移动设备,这很容易被欺骗。

第3部分-更重要的部分

您上面发布的代码示例对SQL注入是无效的。总之,这意味着有人可以向您的代码中注入额外的SQL (即drop table my_really_important表),这将毫无疑问地执行。您应该始终验证脚本的输入,以确保没有人试图“破解”您的脚本。例如,您的脚本似乎指示远程输入是电子邮件地址。因此您代码应该验证这些地址是否确实是电子邮件地址。例如:

代码语言:javascript
复制
$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

票数 2
EN

Stack Overflow用户

发布于 2011-01-20 20:02:55

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

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

代码语言:javascript
复制
<?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
?>
票数 2
EN

Stack Overflow用户

发布于 2011-01-20 20:04:10

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

代码语言:javascript
复制
if(isset($_GET['param']) && $_GET['param'] == 'sea') {
   // rest of your code
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4746841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档