关于PHP的简单问题
我有一个android应用程序,可以用PHP连接到远程数据库。好的,我已经完成并开始工作了,但我需要一些特别的东西 我需要向每个PHP多传递一个参数,在PHP代码中,我需要检查这个额外的参数是否等于这个单词sea,只有当它等于时,我的PHP才会执行远程DB查询。我为什么要这么做?为了使我的php代码更安全,因为它们可以通过internet访问,但我想将这个额外的参数添加到只有我的应用程序才会对数据库进行查询的证书中,因为只有我的应用程序知道这个额外的参数 但是我不知道怎么做,因为我的PHP技能是空的,我的应用程序的PHP是由一个朋友完成的 有人能用我需要的支票填写我的代码吗?参数名称为app_password,参数的正确值为sea 这是我需要压缩的php代码:关于PHP的简单问题,php,Php,我有一个android应用程序,可以用PHP连接到远程数据库。好的,我已经完成并开始工作了,但我需要一些特别的东西 我需要向每个PHP多传递一个参数,在PHP代码中,我需要检查这个额外的参数是否等于这个单词sea,只有当它等于时,我的PHP才会执行远程DB查询。我为什么要这么做?为了使我的php代码更安全,因为它们可以通过internet访问,但我想将这个额外的参数添加到只有我的应用程序才会对数据库进行查询的证书中,因为只有我的应用程序知道这个额外的参数 但是我不知道怎么做,因为我的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);
?>
通过限制MYSQL注入更安全 我建议使用$\u POST或$\u GET代替$\u REQUEST$\u 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
?>
通过限制MYSQL注入更安全 我建议使用$\u POST或$\u GET代替$\u REQUEST$\u 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
?>
如果您的意思是通过url将参数传递给PHP,那么可以从$\u GET superglobal获取该参数。例如,如果参数名为“param”:
if(isset($_GET['param']) && $_GET['param'] == 'sea') {
// rest of your code
}
如果您的意思是通过url将参数传递给PHP,那么可以从$\u GET superglobal获取该参数。例如,如果参数名为“param”:
if(isset($_GET['param']) && $_GET['param'] == 'sea') {
// rest of your code
}
假设我了解您需要什么,您可以这样做:
<?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);
}
?>
假设我了解您需要什么,您可以这样做:
<?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);
}
?>
三层答案
第一部分
您需要的解决方案是检查调用中的查询字符串参数,如下所示:
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可以被移动设备和Web服务器之间的任何中介看到,因此可以被重用
如果您使用post而不是get,同样的情况也会发生,任何中间人都可以看到帖子的内容,并因此重播它
有无数种潜在的解决方案,最简单的IMHO无需重新编写脚本等,就是使用post传递密码,并通过SSL进行传递。这意味着只有客户机和服务器才能看到明文post数据,因此中介无法看到您的“机密”密钥。作为额外的奖励,您可以使用时间敏感的密钥,因此从凌晨1点到凌晨2点,您可以使用“pass1”,凌晨2点到凌晨3点,您可以使用“pass2”等。您也可以使用与实际密钥类似的东西,即app_密码
您还可以检查拨打电话的设备是否是移动设备,尽管这很容易被欺骗
第3部分-明确地说是更重要的部分
您上面发布的代码示例对SQL注入是无效的。总之,这意味着有人可以向代码中注入额外的SQL,即删除表my_really_importable,这将毫无疑问地执行。您应该始终验证脚本的输入,以确保没有人试图“黑客”您的脚本。例如,您的脚本似乎表明远程输入是电子邮件地址。因此,您的代码应该验证这些确实是电子邮件地址。例如:
$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注入的更多信息可在此处找到:
三层答案
第一部分
您需要的解决方案是检查调用中的查询字符串参数,如下所示:
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可以被移动设备和Web服务器之间的任何中介看到,因此可以被重用
如果您使用post而不是get,同样的情况也会发生,任何中间人都可以看到帖子的内容,并因此重播它
有无数种潜在的解决方案,最简单的IMHO无需重新编写脚本等,就是使用post传递密码,并通过SSL进行传递。这意味着只有客户机和服务器才能看到明文post数据,因此中介无法看到您的“机密”密钥。作为额外的奖励,您可以使用时间敏感的密钥,因此从凌晨1点到凌晨2点,您可以使用“pass1”,凌晨2点到凌晨3点,您可以使用“pass2”等。您也可以使用与实际密钥类似的东西,即app_密码
您还可以检查拨打电话的设备是否是移动设备,尽管这很容易被欺骗
第3部分-明确地说是更重要的部分
您上面发布的代码示例是vune
可扩展到SQL注入。总之,这意味着有人可以向代码中注入额外的SQL,即删除表my_really_importable,这将毫无疑问地执行。您应该始终验证脚本的输入,以确保没有人试图“黑客”您的脚本。例如,您的脚本似乎表明远程输入是电子邮件地址。因此,您的代码应该验证这些确实是电子邮件地址。例如:
$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注入的更多信息可在此处找到:
很容易的人
如果在这种情况下,您需要使用控制结构
<?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. */
?>
很容易的人
如果在这种情况下,您需要使用控制结构
<?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. */
?>
如果您通过$\u获得: if ( isset ( $_GET ['secret_word'] ) && $_GET ['secret_word'] == 'sea') { // your code } 或 如果你路过$\u POST,这三个选项中的大部分都是节省 if ( isset ( $_POST ['secret_word'] ) && $_POST ['secret_word'] == 'sea') { // your code } 或 去
阅读SQL注入,因为如果您经过$\u GET,代码就像打开潘多拉盒子一样: if ( isset ( $_GET ['secret_word'] ) && $_GET ['secret_word'] == 'sea') { // your code } 或 如果你路过$\u POST,这三个选项中的大部分都是节省 if ( isset ( $_POST ['secret_word'] ) && $_POST ['secret_word'] == 'sea') { // your code } 或 去
阅读SQL注入,因为您的代码就像打开潘多拉盒子一样,我不认为使用$\u请求是一个好主意,因为它有点过于通用。您应该准确地指定您将接收的部分安全性请求类型-$\u POST/$\u GET/$\u Cookie我不认为使用$\u请求是一个好主意-它有点过于通用。您应该准确地指定您将接收的部分安全性请求类型-$\u POST/$\u GET/$\u cookiess,但您确实需要在SQL语句中的所有不受信任的变量周围使用mysql\u real\u escape\u字符串。否则,您的代码将容易受到SQL注入攻击。有关此主题和其他相关主题的讨论,请参阅现有问题。我在PHP上使用它,这些PHP具有用户可以插入的参数,但在本例中,此PHP仅由java代码调用,用户不能编写任何内容。?如果用户无法在此php中编写任何内容,则易受SQL注入攻击?如果上述代码在互联网上,则发现URL只是时间问题。因此,您需要确保它不会受到SQL注入的影响。这是很容易修复的,虽然有点离题,但您确实需要在SQL语句中的所有不可信变量周围使用mysql\u real\u escape\u字符串。否则,您的代码将容易受到SQL注入攻击。有关此主题和其他相关主题的讨论,请参阅现有问题。我在PHP上使用它,这些PHP具有用户可以插入的参数,但在本例中,此PHP仅由java代码调用,用户不能编写任何内容。?如果用户无法在此php中编写任何内容,则易受SQL注入攻击?如果上述代码在互联网上,则发现URL只是时间问题。因此,您需要确保它不会受到SQL注入的影响。这么说来,修复起来很简单。有中间人吗?谁能看到哪个php URL和参数正在发送我的android应用程序的内部代码?+1非常详细,并提到SQL注入。作为将来的参考,这里有一个很好的资源,以问题的形式。当你打电话给一个网站时,你没有直接连接到服务器,你的请求通过许多不同的节点。因此,任何中介都是移动用户和服务器之间的任何系统,可能是ISP、路由器、交换机等。还有一个问题:我只保护PHP上的SQL注入,这些PHP有用户可以插入的参数,但在这种情况下,这个PHP只由java代码调用,用户不能写任何东西。?如果用户无法在此php中写入任何内容,则易受SQL注入攻击?由于用户无法访问调用的代码,因此无法从您的应用程序中进行攻击。然而,该脚本是在互联网上,因此它可以调用任何人从任何地方与互联网连接。这是你注射的地方。有中间人吗?谁能看到哪个php URL和参数正在发送我的android应用程序的内部代码?+1非常详细,并提到SQL注入。作为将来的参考,这里有一个很好的资源,以问题的形式。当你打电话给一个网站时,你没有直接连接到服务器,你的请求通过许多不同的节点。因此,任何中介都是移动用户和服务器之间的任何系统,可能是ISP、路由器、交换机等。还有一个问题:我只保护PHP上的SQL注入,这些PHP有用户可以插入的参数,但在这种情况下,这个PHP只由java代码调用,用户不能写任何东西。?如果用户无法在此php中写入任何内容,则易受SQL注入攻击?由于用户无法访问调用的代码,因此无法从您的应用程序中进行攻击。然而,该脚本是在互联网上,因此它可以调用任何人从任何地方与互联网连接。这 就是你注射的地方。