Php 自动完成撇号和注入攻击

Php 自动完成撇号和注入攻击,php,ajax,autocomplete,Php,Ajax,Autocomplete,我很难在自动完成中输入撇号。数据库中包含的条目没有撇号…而是使用了与html等效的内容(&POUND039;)。我对ajax还很陌生,所以我真的很感谢你的帮助。问题是,如何传递撇号的值并使其匹配?另外,我的代码是否容易受到注入攻击?提前感谢您的帮助 代码如下所示: <script type="text/javascript"> var options = { serviceUrl:'autocomplete/autoQuery.php', mi

我很难在自动完成中输入撇号。数据库中包含的条目没有撇号…而是使用了与html等效的内容(&POUND039;)。我对ajax还很陌生,所以我真的很感谢你的帮助。问题是,如何传递撇号的值并使其匹配?另外,我的代码是否容易受到注入攻击?提前感谢您的帮助

代码如下所示:

<script type="text/javascript">
var options = {
        serviceUrl:'autocomplete/autoQuery.php',
            minChars:2, 
            delimiter: /(,|;)\s*/, // regex or character
            maxHeight:400,
            width:500,
            zIndex: 9999,
            deferRequestBy: 0, //miliseconds
            params: { country:'Yes' }, //aditional parameters
            noCache: false, //default is false, set to true to disable caching
            // callback function:
            // onSelect: function(value, data){ alert('You selected: ' + value + ', ' + data); },
            onSelect: function(value, data){ window.location = "textbooks.php?bk=" + data;}
    }; 
$('#query').autocomplete(options);
</script>
您的脚本很容易受到SQL注入的攻击,因为
$get
是在未经scape的情况下使用的
htmlentities()
您的方式不会对引号进行编码

首先修复数据: 不建议将编码值存储在数据库中(尤其是像
&POUND039
这样的编码怪异的值)。所以我建议的第一件事是用实际的撇号替换数据库中的那些值

UPDATE textbook 
SET 
  title = REPLACE(title, '&POUND039', '\''),
  author = REPLACE(author, '&POUND039', '\''),
  etc...
然后不再使用
htmlentities()
(顺便说一句,除非传递
ENT\u quotes
常量,否则它不会对引号进行编码,请传入一个正确转义的字符串
$get
,该字符串将匹配数据库中的常规单引号。注意,转义一个包含文本
%
的字符串将在
中使用de>语句,所以这只是可以做的最起码的事情

$get = mysql_real_escape_string($_GET['query']);
$query = "SELECT title,author,id,isbn10,isbn13 FROM textbook
        WHERE title LIKE '%" . $get . "%'
        OR author LIKE '" . $get . "%'
        OR isbn10 LIKE '" . $get . "%'
        OR isbn13 LIKE '" . $get . "%'
        LIMIT 5
        ";
真正的解决办法是: 然而,正如评论中所建议的,如果您使用PDO和绑定参数,这将更加顺利地工作,并且不必担心注入:

// PDO connection information omitted...
$query = "SELECT title,author,id,isbn10,isbn13 FROM textbook
        WHERE title LIKE CONCAT('%', :get, '%')
        OR author LIKE CONCAT(:get, '%')
        OR isbn10 LIKE CONCAT(:get, '%')
        OR isbn13 LIKE CONCAT(:get, '%')
        LIMIT 5
        ";

$stmt = $db->prepare($query);
$stmt->execute(array(':get', $_GET['query']);
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $resString .= "'" . $data['title'] . " by " . $data['author'] . "',";
  $idString .= "'" . $data['id'] . "',";
}
// etc...
您的脚本很容易受到SQL注入的攻击,因为
$get
未经scaped使用。
htmlentities()
您使用的方式不会对引号进行编码

首先修复数据: 不建议在数据库中存储编码值(尤其是像
&POUND039
这样的编码怪异的值)。因此,我建议的第一件事是用实际的撇号替换数据库中的那些值

UPDATE textbook 
SET 
  title = REPLACE(title, '&POUND039', '\''),
  author = REPLACE(author, '&POUND039', '\''),
  etc...
然后不再使用
htmlentities()
(顺便说一句,除非传递
ENT\u quotes
常量,否则它不会对引号进行编码,请传入一个正确转义的字符串
$get
,该字符串将匹配数据库中的常规单引号。注意,转义一个包含文本
%
的字符串将在
中使用de>语句,所以这只是可以做的最起码的事情

$get = mysql_real_escape_string($_GET['query']);
$query = "SELECT title,author,id,isbn10,isbn13 FROM textbook
        WHERE title LIKE '%" . $get . "%'
        OR author LIKE '" . $get . "%'
        OR isbn10 LIKE '" . $get . "%'
        OR isbn13 LIKE '" . $get . "%'
        LIMIT 5
        ";
真正的解决办法是: 然而,正如评论中所建议的,如果您使用PDO和绑定参数,这将更加顺利地工作,并且不必担心注入:

// PDO connection information omitted...
$query = "SELECT title,author,id,isbn10,isbn13 FROM textbook
        WHERE title LIKE CONCAT('%', :get, '%')
        OR author LIKE CONCAT(:get, '%')
        OR isbn10 LIKE CONCAT(:get, '%')
        OR isbn13 LIKE CONCAT(:get, '%')
        LIMIT 5
        ";

$stmt = $db->prepare($query);
$stmt->execute(array(':get', $_GET['query']);
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $resString .= "'" . $data['title'] . " by " . $data['author'] . "',";
  $idString .= "'" . $data['id'] . "',";
}
// etc...

如果切换到PDO并使用参数绑定,则不必担心SQL注入
:)
。这里的一些示例:如果切换到PDO并使用参数绑定,则不必担心SQL注入
:)
。这里有一些例子:你帮了大忙!非常感谢!你帮了大忙!非常感谢!