2013-07-19 60 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

从不信任用户提交的数据,总是验证和消毒...和Don忘记你必须使用参数化查询 – 2013-07-19 22:07:49

+0

你可以发布你的前端形式和后端php代码?这看起来更像是一个与后端输入消毒有关的问题。不确定这种情况确实有害,但看起来很有趣。 – Maximus2012

+0

我将在前面的表格中使用一个不同的示例: – James

回答

1

从用户切勿轻信数据。始终进行消毒和验证。您正在使用准备好的语句,因此您几乎可以免受注射。您要做的另一件事是确定用户发送给您的数据是否与您期望的数据相匹配,如果确实如此,则继续将其用于数据库。 (你大部分都是这样做的,所以诚实地说,应该没有恶意用户的不良影响)

+0

感谢您的回复,真正的帮助:)但是,如果用户要从HTML中删除id =“title”属性,然后通过提交表单运行PHP脚本,它会发布其他现有值,然后返回错误(通知:未定义的索引:/ home/jdowen/public_html/lb/edge/tools /书签中的标题。php在第22行)显示文件路径等。我如何阻止这个,因为这是一个安全风险? – James

+1

有两件事,一是在生产代码中,您不应该向用户显示错误(您可以更改php.ini文件中的设置)并在使用之前检查isset? –

1

输入字段的id不作为发布数据传递,因此无法告知后端php代码。也许你在谈论name属性。

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

在我上面的例子中,输入字段将发布为$_POST["theTitle"]

你可以使用JavaScript来检查这些元素提交表单前,但如果你担心用户操纵DOM ,那可能不会有太大的帮助。

阅读您对未定义指数误差关注后,你只需要检查,如果你使用它之前的变量被设置:

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