我有一个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);
?>
答案 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('"','"',$_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
?>
答案 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一样