PHP和Javascript:不安全的


PHP & Javascript: Unsecure?

在javascript函数中嵌入PHP代码是否不安全?我的朋友告诉我不要那样做。

如果消息被点击(阅读),我的脚本只是在数据库中插入一个数字。

<!--Insert into database when click-->
<script>
    function insert()
    { 
        <?php
        include 'db_connect.php';
        $usermsg = $_SESSION['username'];
        $message_id = $_GET['messageid'];
        mysql_query("UPDATE messages SET message_read='1' WHERE id='$message_id' AND to_user='$usermsg'");
        ?> 
    }
</script>

我应该这样做吗?或者删除php &Mysql在我的脚本和开始吗?

你的朋友可能告诉你不要这样做,因为这没有任何意义。

PHP是一种预处理语言,其解析器运行在web服务器上。运行PHP的结果是浏览器看到的HTML/Javascript。你的PHP不输出任何东西(只是默默地执行SQL查询,而你的HTML/Javascript页面正在生成),所以浏览器看到的Javascript是:

<script>
    function insert()
    { 
    }
</script>

PHP根本不能"在"Javascript函数中。没有这样的概念。

相反,考虑HTML form,或者在您稍微熟悉web技术层次结构时阅读"AJAX"。

如果您尝试该代码,它甚至不会这样工作。你不能在javascript函数中嵌入服务器端代码。

您需要的是创建一个单独的请求来处理该请求。这种方法称为AJAX。使用jQuery库,您可以像这样发出AJAX POST请求:

<script>
    function insert()
    { 
       //Example: Request the test.php page and send some additional data along (while still ignoring the return results).
       $.post("test.php", { messageid: "1" } );
    }
</script>
在test.php:

<?php 
  //Get Post Variables. The name is the same as 
  //what was in the object that was sent in the jQuery
  if (isset($_POST['messageid'])) {
      include 'db_connect.php';
      $usermsg = $_SESSION['username'];
      $message_id = $_POST['messageid'];
      mysql_query("UPDATE messages SET message_read='1' WHERE id='$message_id' AND to_user='$usermsg'");
  }
?>

阅读jQuery AJAX入门指南

不要忘记使用参数化sql来防止sql注入攻击,因为这些代码在当前状态下是容易受到攻击的。

这是不安全的,因为PHP完全有可能将一些文本插入到破坏javascript的页面中。例如

<?php
    $name = "O'Brien";
?>
<script type="text/javascript">
   var name = <?php echo $name ?>;
</script>

将产生:

   var name = O'Brien;

是非法的JS语法。您正在分配一个未定义的变量O,它后面紧跟着一个未终止的字符串字面值'Brien。在PHP页面中用引号括起来也没有任何作用:

  var name = '<?php echo $name ?>';
             ^                   ^-- added quotes

现在是

  var name = 'O'Brien';

现在您遇到了一个稍微不同的问题:赋值一个完全有效的字符串文字'O',紧接着是一个未定义的变量Brien,然后是一个未终止的字符串文字';

让PHP安全地输出文本到JS代码块的正确方法是使用json_encode:

 var name = <?php echo json_encode($name) ?>;

生产:

 var name = "O'Brien";

PHP/MySql运行在web服务器上。Javascript在浏览器上运行。

你也应该认为来自浏览器的任何东西都可能是伪造的-因此应该验证/验证它。Javascript只是使用户体验更具交互性,因为它不需要通过网络进行通信。使用AJAX或表单来完成通信