繁体   English   中英

php:单引号和双引号如何一起工作

[英]php: how does single quote and double quote work together

以下代码摘自一个教程:

 <?php
// user input that uses SQL Injection
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";

// display what the new query will look like, with injection
echo "Injection: " . $query_bad;

在前端,它显示:

Injection: SELECT * FROM customers WHERE username = '' OR 1''

题:

为什么显示username = '' OR 1''

"字符引号的PHP字符串对变量进行插值,并将'字符视为文字。

$name_bar是包含'字符的字符串。

插值后,其中的所有字符都将放置在变量所在的位置。

在PHP中,如果您用双引号编写任何变量,则该变量将被该变量的值替换,这在您的情况下完全由PHP完成

// user input that uses SQL Injection
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";

如果我将值$ name_bad替换为“ OR 1”,则它将变为

SELECT * FROM customers WHERE username = '' OR 1'';

并且如果您想在查询前后删除多余的“”,则可以将查询写为:

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = $name_bad";

因为您基本上只是在容纳字符串。

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";

是相同的

$query_bad = "SELECT * FROM customers WHERE username = '' OR 1''";

因为$name_bad' OR 1'

这样做是因为$name_bad包含单引号,并且您已将其插入到另一个字符串的另一组引号之间。

对于最佳做法,使用:

$string = sprintf('SELECT * FROM customers WHERE username = \\'%s\\'', ' OR 1');

但是,对于SQL,将需要进行清理。

如果您使用的PDO,该bindParam方法会自动防止SQL注入(它指出)。

http://www.php.net/manual/en/pdo.prepared-statements.php

请参阅此图中的说明:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM