Php 准备好的报表和美元(有安全问题吗?)

Php 准备好的报表和美元(有安全问题吗?),php,pdo,prepared-statement,mysql-real-escape-string,Php,Pdo,Prepared Statement,Mysql Real Escape String,可能重复: 如果我在PDO中使用$_GET,我还需要逃避它吗?我的理解是,这是免疫SQL注入,但我仍然感到不安,无法逃脱它。有人能看看这段代码,告诉我它是否安全吗 <?php $hostname = 'localhost'; $username = 'root'; $password = 'root'; $database = 'database'; try { $dbh = new PDO("mysql:host=$hostname;dbname=$database", $us

可能重复:

如果我在PDO中使用$_GET,我还需要逃避它吗?我的理解是,这是免疫SQL注入,但我仍然感到不安,无法逃脱它。有人能看看这段代码,告诉我它是否安全吗

<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->prepare("SELECT * FROM comments WHERE pid = :pid");
    $pid = $_GET['pid'];
    $stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetchAll();
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
    $stmt->execute();
    echo $stmt->rowCount();
$dbh = null;
?>


再说一次,我关心的是你的收入。非常感谢您提供的任何帮助。

是的,准备好的声明功能做到了它所说的。但既然你问了,让我们清楚这还不是故事的结局。我在看电视

例如:

  • 是否每个远程用户都有权访问与每个PID相关的数据?如果没有,则未检查用户是否已授权就是OWASP 2010-A4-不安全直接对象引用的明显示例
  • 您可能并不认真对待明文中的密码硬编码,因为这是OWASP 2010-A7-不安全加密存储的一个明显示例
  • 除了回显行数之外,您没有说明使用$stmt可以做什么,但是如果显示数据库中的任何内容,您当然会首先小心地转义HTML实体。否则,您将创建一个OWASP 2010-A2-跨站点脚本(XSS)的清晰示例
  • 顺便说一下,通常最好显式指定列(或聚合函数),而不是“选择*”

如果您需要为准备好的查询转义变量,那么准备好的几乎是完全无用的。换句话说,将任何您想要的东西塞进准备好的语句占位符中。DB将为您处理转义,而不管数据来自何处。对于理解这一点的人来说,这是非常有趣的不安(与准备好的语句不同)转义不会使您的“数据”变得“安全”我不理解您的语句…我在这里没有说过转义会使数据安全…那么您在咆哮什么?我认为这很清楚。您“对不转义感到不安”你关心的是安全性。所以,我们唯一能得出的结论是,你认为转义使数据更安全。谢谢,我现在正在梳理这个列表。