国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PDO防止sql注入的機制

2020-03-22 19:28:59
字體:
來源:轉載
供稿:網友
  • 使用PDO訪問html' target='_blank'>MySQL數據庫時,真正的real prepared statements 默認情況下是不使用的。為了解決這個問題,你必須禁用 prepared statements的仿真效果。下面是使用PDO創建鏈接的例子:

    代碼如下:
    $dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    setAttribute() 這一行是強制性的,它會告訴 PDO 禁用模擬預處理語句,并使用 real parepared statements 。這可以確保SQL語句和相應的值在傳遞到mysql服務器之前是不會被PHP解析的(禁止了所有可能的惡意SQL注入攻擊)。雖然你可以配置文件中設置 字符集的屬性(charset=utf8),但是需要格外注意的是,老版本的 PHP( < 5.3.6)在DSN中是忽略字符參數的。

    我們來看一段完整的代碼使用實例:

    代碼如下:
    $dbh = new PDO("mysql:host=localhost; dbname=dbtest", "user", "pass");$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果$dbh->exec("set names 'utf8'");$sql="select * from test where name = ? and password = ?";$stmt = $dbh->prepare($sql);$exeres = $stmt->execute(array($testname, $pass));if ($exeres) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {     print_r($row); }}$dbh = null;

    上面這段代碼就可以防范sql注入。為什么呢?

    當調用 prepare() 時,查詢語句已經發送給了數據庫服務器,此時只有占位符 ? 發送過去,沒有用戶提交的數據;當調用到 execute()時,用戶提交過來的值才會傳送給數據庫,他們是分開傳送的,兩者獨立的,SQL攻擊者沒有一點機會。

    但是我們需要注意的是以下幾種情況,PDO并不能幫助你防范SQL注入

    1、你不能讓占位符 ? 代替一組值,如:

    代碼如下:
    SELECT * FROM blog WHERE userid IN ( ? );

    2、你不能讓占位符代替數據表名或列名,如:

    代碼如下:
    SELECT * FROM blog ORDER BY ?;

    3、你不能讓占位符 ? 代替任何其他SQL語法,如:
    代碼如下:
    SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;


    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 石台县| 临汾市| 西安市| 神池县| 灌阳县| 筠连县| 宜阳县| 南昌县| 油尖旺区| 满城县| 平邑县| 阆中市| 鹤岗市| 北川| 遵义市| 通海县| 隆德县| 准格尔旗| 山东省| 保德县| 潞西市| 衡东县| 瓮安县| 陆河县| 许昌县| 汪清县| 横山县| 石台县| 高唐县| 油尖旺区| 萍乡市| 班戈县| 宁蒗| 沙河市| 通化县| 兴城市| 普安县| 南丰县| 赣榆县| 南华县| 浑源县|