ホームページ  >  記事  >  バックエンド開発  >  ウェブサイトに問題があります。抜け穴があります。今日は csdn 兄弟に解決を依頼するためにここに来ました。

ウェブサイトに問題があります。抜け穴があります。今日は csdn 兄弟に解決を依頼するためにここに来ました。

WBOY
WBOYオリジナル
2016-06-23 13:54:18893ブラウズ

ヘルスケア製品の Web サイト http://www.bjp51.net を作成しましたが、過去 2 日間でいくつかの問題が発生しました。360 でスキャンしたところ、リスクが高く、わずか 49 ポイントであることがわかりました。



最初の問題は非常に深刻な問題です。今日は最初の問題を解決したいと思います。
360 から寄せられた意見を見てみましょう


変更方法がわかりません。解決するのを手伝っていただければ幸いです。



ディスカッションへの返信(解決策)

これはcontrast.php

<body><?php$id='';if(!empty($_POST['id'])){    for($i=0; $i<count($_POST['id']);$i++){    $id=$id.($_POST['id'][$i].',');    }	$id=substr($id,0,strlen($id)-1);//去除最后面的","}if ($id==''){echo "<script lanage='javascript'>alert('操作失败!至少要选中一条信息。');window.opener=null;window.open('','_self');window.close()</script>";exit;} $tdwidth=floor(90/$i);//取整,左边占10%$sql="select * from zzcms_main where id in ($id)" ;$rs=mysql_query($sql);?><table width="100%" height="218" border="0" align="center" cellpadding="5" cellspacing="1" class="bgcolor3">  <tr>     <td width="10%" align="center" bgcolor="#FFFFFF">【产品图片】 </td>	 <?php while ($row=mysql_fetch_array($rs)){?>    <td bgcolor="#FFFFFF" style="font-weight:bold" width="<?php echo $tdwidth ?>%"><a href="<?php echo $row["img"]?>" target="_blank"><img <?php echo getsmallimg($row["img"],"")?> alt="<?php echo $row["proname"]?>"  border="0" ></a></td>    <?php	}	?>  </tr>  <tr class="bgcolor1">     <td width="100" align="center">【产品名称】 </td>    <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td style="font-weight:bold"><?php echo $row["proname"]?></td>    <?php	}	?>     </tr>  <tr>     <td width="100" align="center" bgcolor="#FFFFFF">【主要功能】</td>       <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td valign="top" bgcolor="#FFFFFF" ><?php echo $row["prouse"]?></td>   <?php   }   ?>  </tr>  <tr class="bgcolor1">     <td width="100" align="center">【规格包装】</td>       <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td><?php echo $row["gg"]?></td>   <?php   }   ?>  </tr>  <tr  class="bgcolor1">     <td width="100" align="center"><strong>招商区域</strong></td>        <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td><?php echo $row["city"]?></td>    <?php	}	?>  </tr>  <tr>     <td width="100" align="center" bgcolor="#FFFFFF"><strong>产品说明</strong></td>        <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td valign="top" bgcolor="#FFFFFF"><?php echo nl2br($row["sm"])?></td>   <?php   }   ?>  </tr>  <tr class="bgcolor1">     <td width="100" align="center"><strong>可提供的支持</strong></td>        <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td valign="top"><?php echo nl2br($row["zc"])?></td>    <?php	}	?>  </tr>  <tr>     <td width="100" align="center" bgcolor="#FFFFFF"><strong>对代理商的要求</strong></td>       <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td valign="top" bgcolor="#FFFFFF"><?php echo nl2br($row["yq"])?></td>   <?php   }   ?>  </tr>  <tr class="bgcolor1">     <td width="100" align="center"><strong>备注</strong></td>        <?php 	 mysql_data_seek($rs,0);	while ($row=mysql_fetch_array($rs)){?>    <td><?php echo nl2br($row["other"])?></td>   <?php   }   ?>  </tr></table><table width="100%" height="60" border="0" cellpadding="0" cellspacing="0">  <tr>    <td align="center"><input type="button" name="Submit" value="关闭本窗口" onClick="javascript:window.close()"></td>  </tr></table><?phpmysql_close($conn);?></body>
のファイルソースコードです

$id=''
if(!empty($_POST['id']) ){
for($i=0; $i $id=$id.($_POST['id'][$i].', ') ;
}
$id=substr($id,0,strlen($id)-1);//最後の「,」を削除します
}
$sql="select * from zzcms_main where id in ( $id ) "

彼は、受信データを SQL コマンドでチェックせずに使用したと考えています

$id='';
if(!empty($_POST['id'])){
for($i =0; $i $id=$id.($_POST['id'][$i].',');
}
$ id=substr ($id,0,strlen($id)-1);//最後の「,」を削除します
}
$sql="select * from zzcms_main where id in ($id)"

彼は、あなたが受信したものを使用したと考えていますSQL コマンドのデータをチェックせずに



私は php の初心者ですが、どのように確認すればよいですか?また、どのように確認できますか?

また、確認しないと注射されやすいのでしょうか?

 $id = $id . (intval($_POST['id'][$i]) . ',');

SQL インジェクションの原則は、アドレス バーまたはフォームから挿入することです


アドレス バーから $_GET["a"] を取得し、フィルタリングせずにプログラムに直接使用すると、脅威です。例:

$_GET["a"]=1; の場合:
$sql = "SELECT * FROM AA WHERE id =$_GET["a"]"; id = 1";
しかし、他の人がアドレスバーを通じてそれを自分で変更し、$_GET["a"] の値を 1 または (および) XXX のさまざまなコードに変更すると、クエリステートメントは

$sql = "SELECT * FROM AA WHERE id =1 or (and) xxx";


それで私は騙されました。

したがって、アドレス バーとフォームから取得したパラメーターは、書式設定、フィルター処理、制限される種類、長さ、文字の指定を行う必要があります...

$sql="select * from zzcms_main where id in ($id )" ;
$id パラメータは有効です。これを使用して何でも入力でき、自然に挿入されます。

?id は文字のみであるため、intval を使用して文字に変換できます。???0 でない場合、文字は挿入できません。

セキュリティ レベル: 高リスク
セキュリティ レベルは、国内の Web サイトの 46% を上回ります。

$id=$id.(intval($_POST['id'][$i]).',');

受信データは一重引用符を 2 つの連続する一重引用符に置き換えます。sql 一重引用符を追加します。渡されたパラメータをステートメントで使用する場合。
$id = str_replace("'","''",$_POST['id']);
$sql = " select * from tb_user where id='$id' ";注射。


現在、 $id=$id.($_POST['id'][$i].',') を $id = $id . ['id'][$i]) . ','

そうです

上記は間違っていたので、これに変更しました

if(!empty($_POST['id'])){
for($ i=0; $i //$id=$id.($_POST['id'][$i].','); $id = $id.(intval($_POST['id'][$i]).',');
}
$id=substr($id,0,strlen($id)-1);/ /最後の "," を削除します
}

そうですか?

if(!empty($_POST['id'])) {  $id = join(',', array_map('intval', $_POST['id']));}
は $id を別の名前に変更した方が良いです

if(!empty($_POST['id'])) {  $id = join(',', array_map('intval', $_POST['id']));}
は $id を別の名前に変更した方が良いです

php に詳しくないので、このコード スニペットを使用します。変数を探す必要はありません

モデレータの無私の精神に感謝します
あなたが別の問題も解決してくれたことに今気づきました、もう一度ありがとう
!
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。