gpt4 book ai didi

php - 消除危险字符是否可以避免 SQL 注入(inject)?

转载 作者:可可西里 更新时间:2023-11-01 13:35:47 25 4
gpt4 key购买 nike

有很多方法可以避免 SQL 注入(inject) How to prevent SQL injection in PHP? .

问题是,如何通过 removeBadCharacters 进行 sql 注入(inject)?

function removeBadCharacters($s)
{
return str_replace(array('&','<','>','/','\\','"',"'",'?','+'), '', $s);
}

它试图抛出危险字符(应用程序不需要这些字符):

$x = removeBadCharacters($_POST['data']);

mysql_query("insert into table (x) values ('".$x."');");

// or

mysql_query("select * from into where name = '".$x."';");

最佳答案

能够从 string literal 的上下文中注入(inject)任意 SQL ,需要保留该字符串文字。这只能通过引入字符串结束分隔符(在本例中为单个 ')或通过将字符串文字扩展为前面的 ' 来实现,例如,通过使用转义符字符 \:

$a = '\\';
$b = ' OR 1=1 OR ';
$c = ' --';

$query = "SELECT * FROM t1 WHERE a='$a' AND b='$b' AND c='$c'";
// result:
// SELECT * FROM t1 WHERE a='\' AND b=' OR 1=1 OR ' AND c=' --'
// \_________/ \_______/

现在,当您的函数删除任何 '\ 时,似乎不可能保留或扩展字符串文字,因此不可能注入(inject)任意 SQL。

但是,由于你的函数没有考虑实际的字符编码,所以如果MySQL的字符编码是GBK,就可以利用这个,类似于how it can be exploited when using addslashes instead of mysql_real_escape_string :

$a = "\xbf";
$b = " OR 1=1 OR ";
$c = " --";

$query = "SELECT * FROM t1 WHERE a='$a' AND b='$b' AND c='$c'";
// result:
// SELECT * FROM t1 WHERE a='縗 AND b=' OR 1=1 OR ' AND c=' --'
// \_________/ \_______/

所以为了安全起见,use mysql_real_escape_string or other proven methods to prevent SQL injections .

关于php - 消除危险字符是否可以避免 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com