Php 我应该在“a”中转义通配符吗;例如;sql查询?

Php 我应该在“a”中转义通配符吗;例如;sql查询?,php,sql-injection,security,Php,Sql Injection,Security,假设我有一个LIKEsql语句存储在如下变量中: $movie_title = $_POST['movie_title']; $query= "SELECT movie FROM movies WHERE title LIKE '%" . $movie_title . "%'"; function sqlwildcardesc($x){ return str_replace(array("%", "_"), array("\\%", "\\_"), mysql_real_escape_

假设我有一个
LIKE
sql语句存储在如下变量中:

$movie_title = $_POST['movie_title'];
$query= "SELECT movie FROM movies WHERE title LIKE '%" . $movie_title . "%'";
function sqlwildcardesc($x){
    return str_replace(array("%", "_"), array("\\%", "\\_"), mysql_real_escape_string($x));
}
通过使用PDO转义通配符
%
\

可以防止哪种sql注入攻击:

$pdo = new PDO(/* db info */);

$original = $_POST['movie_title'];
$wildcarded = '%'.$original.'%';
$stmt = $pdo->prepare('SELECT movie FROM movies WHERE title LIKE :var');
$stmt->bindParam(':var', $wildcarded);
$stmt->execute();
// fetching and stuff...
非常简单:

编写如下函数:

$movie_title = $_POST['movie_title'];
$query= "SELECT movie FROM movies WHERE title LIKE '%" . $movie_title . "%'";
function sqlwildcardesc($x){
    return str_replace(array("%", "_"), array("\\%", "\\_"), mysql_real_escape_string($x));
}
现在您的查询:

$query= "SELECT movie FROM movies WHERE title LIKE '%".sqlwildcardesc($movie_title)."%'";
这应该管用!我在自己的项目中进行了测试!!
玩得开心;)

我认为对于使用“%”“$movie\u title”之类的
的人来说,有一个特别的地狱“
对于将密码存储为纯文本的人来说,@Uriel_SVK可能是重复的,你在说什么?我使用该语法是为了可见性。好吧,使用PDO并向变量中添加通配符,然后使用参数将该变量插入查询中。那你就不必担心逃跑了。切勿将未初始化的用户输入插入查询。@user701510参数化可防止恶意输入。但为了确保在电影标题中正确搜索文字%或uu,您需要转义用户输入中出现的任何字符,以便它们不会被视为通配符。转义通配符有什么原因吗?未替换的通配符存在哪种类型的安全漏洞?这足以防止恶意输入,但如果在电影标题字段中按字面输入%或_,则不会有帮助;对于Like子句,它们将被视为通配符。实际上,我无法想象如何使用通配符来做一些事情malicious@Uriel_SVK:这取决于SQL查询的用途:以及应用程序的功能。设想一个删除查询,其中where条件不能按程序员预期的方式工作,因为攻击者在字符串中包含了像“%”这样的SQL通配符,因此删除的记录比程序员预期的要多!类似地,攻击者可能会选择/更新不应该选择/更新的记录。即使是通常使用索引的选择也可以通过在
%
前面加前缀来销毁,从而导致意外的表扫描,因为该索引无法再使用。小心
str_replace()
不欣赏数据库连接的字符集。执行简单的字节替换(尤其是在
mysql\u real\u escape\u string()
的输出上)可能会打开多字节攻击的大门。这是不安全的代码,不要使用escape,参数化。