编辑HTML然后通过PHP发布

编辑HTML然后通过PHP发布,php,html,mysql,security,developer-tools,Php,Html,Mysql,Security,Developer Tools,我有一个设想。假设有人在我的网站上,有一个表单添加了一个事件,例如,有一个字段如下: <input type="text" name="title" id="title"> 假设有人使用了F12开发工具,并将id=“title”更改为id=“whatever”,甚至删除了id属性,那么我该如何使我的PHP脚本停止运行,从而不会向MySQL发布任何内容 下面是一个书签功能的示例:(前端表单) 头衔* 链接* 后端PHP: if (isset($_POST['parse_va

我有一个设想。假设有人在我的网站上,有一个表单添加了一个事件,例如,有一个字段如下:

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

假设有人使用了F12开发工具,并将id=“title”更改为id=“whatever”,甚至删除了id属性,那么我该如何使我的PHP脚本停止运行,从而不会向MySQL发布任何内容

下面是一个书签功能的示例:(前端表单)


头衔*
链接*

后端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>';
    }
    }
    }
if(isset($\u POST['parse\u var'])){
$parser=$\u POST['parse\u var'];
$parser=htmlspecialchars($parser);
if($parser==“addbookmark”){
$title=$_POST['title'];
$title=htmlspecialchars($title);
$linkurl=$_POST['link'];
$linkurl=htmlspecialchars($linkurl);
$sqlrecentmark=$db->query(“从tablename中选择link\u url,此处mem\u id='$id'ORDER BY id DESC LIMIT 20”);
而($row=$sqlrecentmark->fetch(PDO::fetch_ASSOC)){
$recent_link=$row[“link_url”];
}
如果($linkurl!=$recent\u链接){
$dataact=array('mem\u id'=>$id,'title'=>$title,'link\u url'=>$linkurl);
$sqlactivity=$db->prepare(“插入到tablenamehere(mem_id,title,link_url)值(:mem_id,:title,:link_url)”);
$sqlactivity->execute($dataact);
}否则{
$not_msg='

哎呀!你以前已经添加了书签。只要看一下,你就会找到它的!”; } } }
永远不要信任来自用户的数据。始终进行清理和验证。您使用的是预先准备好的语句,这是很好的,因此您将得到最大程度的保护,免受注入。您要做的另一件事是确定用户发送给您的数据是否与您期望的相符,如果相符,则继续将其用于数据库。(大部分情况下,您都在这样做,因此诚实地说,恶意用户不会造成不良影响)

输入字段的
id
不会作为发布数据传递,因此在后端php代码中无法判断。也许你说的是
name
属性

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

从不信任用户提交的数据,始终验证和清理。。。别忘了,您必须使用参数化的query,您可以发布前端表单和后端php代码吗?这看起来更像是一个与后端输入清理相关的问题。我不确定这个场景是否有害,但看起来很有趣。我将在前面的表单中使用一个不同的示例:我现在将在问题中发布这个示例,因为您在后端使用的是准备好的语句,所以您应该在MySQL安全性方面做得很好。对于其他安全措施,您可能需要验证和清理输入。看看gumpphp库。这可能会有帮助:感谢您的回复,这是一个真正的帮助:)但是如果用户要从HTML中删除id=“title”属性,然后通过提交表单运行PHP脚本,它会发布其他现有值,然后返回一个错误(注意:第22行的/home/jdowen/public_HTML/lb/edge/tools/bookmarks.PHP中未定义的索引:title)这会显示文件路径等。由于这是一种安全风险,我如何阻止它?有两件事,一是在生产代码中,您不应该向用户显示错误(您可以更改php.ini文件中的设置),并且在使用isset之前是否检查了它?
<input type="text" name="theTitle" id="aTitle">
if(isset($_POST["title"])) {
  $title = $_POST['title'];
} else {
  //output error
}