我有一个android应用程序,它连接到一个远程数据库与PHP。好的,我已经做好了,而且还能用,但我需要一些特别的东西。
我需要向每个PHP多传递一个参数,并且在PHP代码中,我需要检查这个额外的参数是否等于这个单词"sea",并且只有当它相等时,我的php才会执行远程DB查询。我为什么要这样做?为了更安全,我的php代码,因为他们可以通过互联网访问,但我想添加这个额外的参数证书,只有我的应用程序会做查询数据库,因为只有我的应用程序知道这个额外的参数“海”。
但是我不知道怎么做,因为我在PHP上的技能是空的(我的应用程序的PHP是由一个朋友完成的)
有人可以用我需要的检查来完成我的代码吗?参数名称将是"app_password“,参数的正确值将是"sea”
这是我的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);
?>发布于 2011-01-20 20:07:29
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可以被任何中介(在移动设备和你的well服务器之间)看到,因此可以被重用。
如果你使用post而不是get,这同样适用,任何中介都可以看到帖子的内容,因此可以重放它。
有无数可能的解决方案,最简单的IMHO (无需修改脚本等)是使用post传递“密码”并通过SSL完成此操作。这意味着只有客户端和服务器才能看到明文post数据,因此中介无法看到您的“秘密”密钥。作为额外的奖励,你可以使用时间敏感的密钥,所以从凌晨1点到凌晨2点你可以使用'pass1',2am到3am你可以使用'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
发布于 2011-01-20 20:02:55
通过限制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('"','"',$_REQUEST['email1']);
$email1=str_replace("'",''',$email1);
$email2=$var=str_replace('"','"',$_REQUEST['email2']);
$email2=str_replace("'",''',$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
?>发布于 2011-01-20 20:04:10
如果您的意思是通过url将参数传递给PHP,您可以从$_GET超级全局中获取它。例如,如果参数名为'param':
if(isset($_GET['param']) && $_GET['param'] == 'sea') {
// rest of your code
}https://stackoverflow.com/questions/4746841
复制相似问题