2013-07-19 3 views
0

나는 시나리오가 있습니다.HTML을 편집 한 후 PHP를 통해 게시

<input type="text" name="title" id="title"> 

가의 그 사람을 사용 F12 개발자 도구라고하자에 ID = "제목을"변경 :의 누군가가 내 웹 사이트에 예를 들어 이벤트를 추가하는 형태가 다음과 같이 필드가 있다고 가정 해 봅시다 id = "whatever"또는 심지어 id 속성을 제거하면 PHP 스크립트가 실행을 멈추게하여 MySQL에 아무 것도 게시되지 않게하려면 어떻게해야합니까? (프런트 엔드 양식)

<form action="bookmarks.php" method="post" enctype="multipart/form-data"> 
    <div class="control-group"> 
    <label class="control-label" for="input-mini">Title*</label> 
    <div class="controls"> 
     <input class="span12" id="title" name="title" type="text" placeholder="e.g. Oliver's pet cat..."> 
    </div> 
    </div><!-- /control-group --> 
    <div class="control-group"> 
    <label class="control-label" for="input-mini">Link*</label> 
    <div class="controls"> 
     <input class="span12" id="link" name="link" type="text" placeholder="e.g. http://boopeo.com"> 
     <input type="hidden" name="parse_var" id="parse_var" value="addbookmark" /> 
     <br /><input name="submit" type="submit" class="btn btn-success span12" value="Bookmark" /></form> 

백 엔드 PHP : 사용자의

if (isset($_POST['parse_var'])){ 
      $parser = $_POST['parse_var']; 
      $parser = htmlspecialchars($parser); 
    if ($parser == "addbookmark"){ 


      $title = $_POST['title']; 
      $title = htmlspecialchars($title); 
      $linkurl = $_POST['link']; 
      $linkurl = htmlspecialchars($linkurl); 

    $sqlrecentmark = $db->query("SELECT link_url FROM tablenamehere WHERE mem_id='$id' ORDER BY id DESC LIMIT 20"); 
    while($row = $sqlrecentmark->fetch(PDO::FETCH_ASSOC)) { 
     $recent_link = $row["link_url"]; 
    } 

    if ($linkurl != $recent_link){ 
     $dataact = array('mem_id' => $id, 'title' => $title, 'link_url' => $linkurl); 

    $sqlactivity = $db->prepare("INSERT INTO tablenamehere (mem_id, title, link_url) value (:mem_id, :title, :link_url)"); 
    $sqlactivity->execute($dataact); 
    } else { 
     $not_msg = '<br /><br /><div class="alert alert-error">Oops! You have added that bookmark before. Just look and you shall find!</div>'; 
    } 
    } 
    } 
+0

결코 신뢰 사용자가 데이터를 제출, 항상 확인하고 소독 ... 그리고 돈 매개 변수가있는 쿼리 –

+0

을 사용해야한다는 사실을 잊지 마십시오. 프런트 엔드 양식과 백엔드 PHP 코드를 게시 할 수 있습니까? 이것은 백 엔드 입력 위생과 관련된 문제와 유사합니다. 이 시나리오가 정확히 해가되는지는 확실하지 않지만 흥미로운 것으로 보입니다. – Maximus2012

+0

프론트 양식에 다른 예제를 사용합니다 : – James

답변

1

절대 신뢰 데이터를 북마크 내가 가진 기능에 대한

다음은 예입니다. 항상 위생 처리하고 검증하십시오. 당신은 준비된 진술을 사용하고 있습니다. 그래서 당신은 대부분 주사로부터 보호받을 것입니다. 당신이하고 싶은 또 다른 일은 사용자가 보낸 데이터가 예상했던 것과 일치하는지 판단하는 것입니다. 그런 다음 데이터베이스와 함께 사용하면 계속 진행됩니다. (당신은 대부분 일을하기 때문에 모든 정직에서 악의적 인 사용자로부터 악영향을받지 않아야합니다.)

+0

답장을 보내 주셔서 감사합니다. :) 그러나 사용자가 HTML에서 id = "title"속성을 제거한 다음 양식을 제출하여 PHP 스크립트를 실행하면 다른 기존 값을 게시 한 다음 오류를 반환합니다 (Notice : 정의되지 않은 색인 : 제목은/home/jdowen/public_html/lb/edge/tools/bookmarks입니다.php on line 22) 파일 경로 등을 알려줍니다. 보안 위험이므로 어떻게 중지합니까? – James

+1

두 가지 중 하나는 프로덕션 코드에서 사용자에게 오류를 표시하면 안되며 (php.ini 파일의 설정을 변경할 수 있음) 사용하기 전에 isset를 확인하고 있습니까? –

1

입력란의 id은 게시 된 데이터로 전달되지 않으므로 알려 줄 수 없습니다 백 엔드 PHP 코드. 어쩌면 당신은 name 속성에 대해 이야기하고있을 것입니다. 내 위의 예에서

<input type="text" name="theTitle" id="aTitle"> 

는 입력 필드는 양식이 제출하기 전에 이러한 요소를 확인하기 위해 자바 스크립트를 사용할 수 $_POST["theTitle"]

으로 게시됩니다 만, 당신은 DOM을 조작하는 사용자에 대한 걱정 경우 아마도 도움이되지 않을 것입니다. 당신이 그것을 사용하기 전에 변수가 설정되어있는 경우

정의되지 않은 인덱스 오류에 대한 우려를 읽은 후, 당신은 단순히 확인해야합니다

if(isset($_POST["title"])) { 
    $title = $_POST['title']; 
} else { 
    //output error 
} 
관련 문제