2014-01-14 3 views
0

의견 삭제 양식에 문제가 있습니다. 어떻게 든 사용자가 자신의 의견을 삭제할 수 있도록 만들고 싶지만, 지금까지는 모든 댓글에 대해 삭제 만 작성했습니다. 자신의 것인지 아닌지는 중요하지 않습니다.사용자가 자신의 의견을 삭제할 수있게 하시겠습니까?

여기 내 양식이다

<form action="<?php echo $editFormAction; ?>" method="POST" name="CommentForm"> 
<table> 
<tr><td colspan="2"></td></tr><tr><td><input type="hidden" name="name" value="<?php  
    echo $_SESSION['MM_Username']; ?>" /></td></tr> 

<tr><td colspan="2">Заглавие:</td></tr><tr><td><input type="text" name="title" 
style="width:300px; height:20px;" /></td></tr> 
<tr><td colspan="2">Коментар</td></tr> 
<tr><td colspan="2"><textarea name="comment" style="width:450px; height:150px;"> 
    </textarea></td></tr> 
    <tr><td colspan="2"><input type="submit" name="submit" value="Коментирай"      
    style="padding:5px; color:#069"/></td></tr> 

</table> 
    <input type="hidden" name="MM_insert" value="CommentForm" /> 


    </form><br /><br /> 
<?php 

    $getquery=mysql_query("SELECT * FROM comments ORDER BY id DESC"); 

    while($rows=mysql_fetch_assoc($getquery)) 
    { 
$id=$rows['id']; 
$title=$rows['title']; 
$comment=$rows['comments']; 
$MM_Username=$rows['name']; 
$dellink="<a href=\"delete.php?id=" . $id . "\">ИЗТРИЙ</a>"; 

echo '<b><p style="background-color:#6CC; border-radius:10px; te" 
    ;border:1px solid;"> &nbsp Потребител:</b> ' . $MM_Username . ' <br /><b>&nbsp 
    Тема:</b> ' . $title . '</b><br /><b>&nbsp Коментар:</b><br />&nbsp ' . $comment . 
     '<br />' . $dellink .'</p><br />' ; 

    } 

    ?> 

이 내 delete.php입니다 :

<?php 
    include 'Connections/localhost.php'; 
    mysql_query("DELETE FROM comments WHERE id = $_GET[id]")or die(msql_error()) ; 
    header('location: komentari.php'); 
?> 
+4

글쎄, 처음에는 사용자가 댓글을 삭제할 수 있는지 여부를 확인하지 않아도됩니다. 따라서 모든 사용자는 모든 주석을 삭제할 수 있습니다. 'delete.php'는 요청을하는 사용자가 주석을 삭제할 수 있도록 권한 부여 검사를해야합니다. 또한, *** 매우 중요합니다 ***, 귀하의 코드는 SQL 주입 공격에 * 열려 있습니다 *. 사용자는 주석을 삭제할 수있을뿐 아니라 서버를 완전히 제어 할 수 있습니다. 이 내용을 읽으십시오 : http://www.php.net/manual/en/security.database.sql-injection.php – David

+5

** 위험 ** : 귀하는 [** 구식 ** 데이터베이스 API] (http : //stackoverflow.com/q/12859942/19068) [현대 대체] (http://php.net/manual/en/mysqlinfo.api.choosing.php)를 사용해야합니다. 또한 현대의 API가 [방어] (http : // stackoverflow)를 쉽게 할 수 있도록 [SQL 주입 공격] (http://bobby-tables.com/)에 ** 취약합니다 **.com/questions/60174/best-way-to-prevent-sql-injection-in-php)을 사용하십시오. – Quentin

+0

데이터베이스를 편집하는 작업에 링크를 사용하지 마십시오. 당신은 봇 (및 프록시 프록시)을 따르고 사물을 크게 삭제합니다. POST 양식을 사용하십시오. – Quentin

답변

0

가장 간단한 해결책은 DELETE 쿼리의 끝에 AND owner = ?를 추가하는 것입니다. 현재 사용자 (아마 세션)의 ID를 저장할 때마다 값을 채 웁니다. 테이블의 소유자 컬럼에 주석을 작성한 사용자의 ID를 저장해야합니다.

아마도 삭제가 성공했는지 테스트하고, 그렇지 않은 경우 좋은 오류보고를 제공 할 수있는 이유를 찾기 위해 더 많은 쿼리를 작성할 수 있습니다.

데이터베이스에서 가져온 소유자 값을 현재 사용자의 소유자 값과 비교하여 부적절하게 삭제 링크가 생성되는 것을 방지 할 수 있습니다.

+0

이 솔루션의 문제점은 포럼에 현재 로그인 한 사용자가 소유 한 댓글 만 표시된다는 것입니다. 따라서 OP가 원하는 내용인지는 확실하지 않습니다. –

+0

@DylanB - Err, SELECT 쿼리가 아닌 DELETE 쿼리. – Quentin

1

사용자가 로그인되어 있고 세션에 저장된 해당 사용자에 대한 정보가 있다고 가정합니다. 이 있지 않은 경우, 당신은 당신의 delete.php에서 할 수 있도록, 당신은 사용자 ID를 추가해야합니다 :

<?php 
session_start(); 

// Here you should kick out any visitors that are not logged in 


// proceed with the delete 
include 'Connections/localhost.php'; 

$id = (int) $_GET[id]; 
$uid = (int) $_SESSION['user_id']; // or something similar 

mysql_query("DELETE FROM comments WHERE id = $id AND owner_id = $uid")or die(msql_error()) ; 
                ^^^^^^^^ or something similar 
// etc. 

그리고 당신은 정말 당신이 지금 SQL 주입 문제를 가지고 PDO 또는 mysqli과 준비된 문으로 전환해야 mysql_* 함수는 더 이상 사용되지 않습니다.

0

여기 두 가지 문제를 해결해야합니다. 첫째, 'delete.php'는 주석의 소유자가 로그인 한 사용자와 동일한 위치에서만 처리해야합니다. 이를 위해 추가해야 할 내용이 있습니다.

" AND [owner] = $_SESSION['CurrentUser']" 

데이터 구조상의 부분입니다.

당신은 어떤 논리에 넣어 필요 해요 두 번째 포인트는이 시점에서

$dellink="<a href=\"delete.php?id=" . $id . "\">ИЗТРИЙ</a>"; 

의 정의 주위에, 당신은 추가 할 겁니다 :

IF ([owner] == $_SESSION['CurrentUser']) 
    $dellink="<a href=\"delete.php?id=" . $id . "\">ИЗТРИЙ</a>"; 
ELSE 
    $dellink="" 

또는 PHP와 동등합니다. 죄송합니다. 잠시 후에 PHP로 프로그래밍하지 않았습니다. 그러나 현재의 두 가지 대답 모두이 두 가지 문제를 해결하지 못하는 것 같습니다.

+1

'$ _GET'은 사용자가 제공하는 것으로 알고 있으며 사용자가 원하는 모든 것이 될 수 있습니다. 맞습니까? – jeroen

+0

Err ... 아니요. $ _SESSION (으)로 변경했지만 요점은 그대로입니다. 사용자가 삭제할 수없는 경우 DELETE 링크를 표시하면 안되므로 링크를 표시하기 전에 삭제할 수 있는지 여부를 확인해야합니다. –

+0

사실, UI에는 연마 작업이 필요합니다 ... – jeroen

관련 문제