使用此LIKE子句,我的代码是否容易受到SQL注入攻击?

时间:2011-09-06 00:20:19

标签: php mysql sql sql-injection

我正在使用jQuery和PHP进行实时搜索,但我不确定我的查询是否容易受到SQL注入攻击。

在jQuery的帮助下键入字符时,数据被发布到PHP文件中。

$searchData = $_POST['searchData']; 

$searchResult = mysql_query("SELECT * FROM songs WHERE songname LIKE '$searchData%' "); 

echo $searchResult;

这是否容易受到SQL注入攻击?

7 个答案:

答案 0 :(得分:9)

是的,请考虑$searchData是否:

Robert'); DROP TABLE songs; --

答案 1 :(得分:1)

使用mysql_real_escape_string($_POST['searchData'])或[PDO]代替mysql _ *

答案 2 :(得分:0)

如果$searchData没有在任何地方被转义,那么是的,它很容易受到攻击。

答案 3 :(得分:0)

无论何时您正在接受用户输入并进入查询,您都应该通过mysql_real_escape_string传递它。比抱歉更安全。

答案 4 :(得分:0)

由于您可以使用工具来处理发送的$ _POST数据,是的,这很危险。

要么逃避它,要么使用不需要任何逃避的php data objects (PDO),这是你在这段时间应该使用的。

答案 5 :(得分:0)

是的,它很脆弱。但是其他响应者没有注意到,除了正常的转义(如mysql_real_escape_string(),您还需要转义LIKE子句的%字符!

mysql_real_escape_string(addcslashes($str, "%_"))

这里要抓住的诀窍是没有像“普遍引用”那样的东西。 在引用时,您始终引用某些特定输出的文本,例如:

  1. mysql查询的字符串值
  2. like mysql查询表达式
  3. html代码
  4. JS​​ON
  5. mysql正则表达式
  6. php正则表达式
  7. 对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着引用不应该在PHP的输入中进行,而是在特定的输出!这就是为什么像magic_quotes_gpc这样的功能被打破的原因(永远不会忘记处理它,或者更好,确保它被关闭!!! )。

    那么,在这些特定情况下,用什么方法来引用? (随意纠正我,可能有更现代的方法,但这些对我有用)

    1. mysql_real_escape_string($str)
    2. mysql_real_escape_string(addcslashes($str, "%_"))
    3. htmlspecialchars($str)
    4. json_encode() - 仅适用于utf8!我将我的功能用于iso-8859-2
    5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - 在这种情况下你不能使用preg_quote,因为反斜杠会被转义两次!
    6. preg_quote()

答案 6 :(得分:-1)

是的你可以使用它:

$searchData = addslashes( $_POST['searchData'] );