php,python使用%s,%d修复sql注入漏洞

原以为底层%s格式化字符串和pdo实现类似,实际测试了下不是一回事。

php测试代码

//$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$sql = sprintf("SELECT * FROM users WHERE id='%s' LIMIT 0,1",$id);//%d 可以修复
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

web.py测试代码

import web
import MySQLdb
urls = (
    #'/', 'index' #1,2
    '/(.*?)', 'index'
)
class index:
    def GET(self,name):
        parame = web.input()
        conn = MySQLdb.connect(
        host = 'localhost',
        user = 'root',
        passwd = 'root',
        db = 'security',
        port = 3306,
        charset ='utf8',
        )
        cur = conn.cursor()
        #SELECT * FROM users where id=1
        #sqli_select = "SELECT password FROM users WHERE id = '%s'" % (parame.name) #错误写法
        #sqli_select = ("SELECT password FROM users WHERE id = '%s'",(parame.name)) #正确写法,使用元祖传给execute函数
        sqli_select = "SELECT password FROM users WHERE id = '%d'" % (parame.name) #正确写法
        cur.execute(sqli_select)
        return cur.fetchone()            
if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

PDO预编译方式是分为两次发送数据,一次sql模版, 一次参数防止sql注入。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.